您的位置:程序门 -> .net技术 -> c#



圆上任意三点画弧!!!!


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


圆上任意三点画弧!!!!
发表于:2007-03-31 19:11:47 楼主
已知圆上任意三点坐标如何画弧
发表于:2007-03-31 19:25:321楼 得分:0
正确的问题是         只允许使用直尺和圆规,过已知不在一条直线上的任意3个点,作一条弧线。

如果只允许使用直尺和圆规
1   过其中2个点做直线
2   另外再2个点做直线
3   对2个线段做中垂线,两中垂线交于点o
4   以o为圆心,o到任意一个原已知点的距离为半径,作弧。
发表于:2007-03-31 19:27:332楼 得分:0
中垂线作法:

1   分别以2个已知点为圆心,以任意一个相同的,大于两点距离一半的长度为半径,分别作圆,两圆相交于a,b   两点  

2     连接a,b两点的直线,就是中垂线
发表于:2007-03-31 19:30:323楼 得分:0
如果这个问题再提高难度,仅允许使用圆规不允许使用直尺,同样是有解的,不过步骤比较多也比较复杂~~~     我还要好好回忆一下。。。。先不贴了~~


如果只允许用直尺不允许用圆规,那么此题无解。


最大难度:   只允许使用2次圆规,完成这个弧。  


发表于:2007-03-31 19:32:094楼 得分:0
对自己bs一下。
已经忘记如何证明该论题了。:)
哪位给个证明过程嘛。:)
不用程序的,只需要用初中几何学的方法来证明一下。把证明过程写出来。然后用程序来实现应该很简单。
发表于:2007-03-31 19:32:575楼 得分:0
如果有人研究出来可以只用一次圆规的,希望能分享一下~~~~


如果是计算机题目,太简单了,给出3个点的空间坐标,用参数方程,解2次方程对计算机来说小菜一碟~~~~
发表于:2007-03-31 19:35:046楼 得分:0
:)如果不用圆规呢?楼上?
发表于:2007-03-31 19:37:487楼 得分:0
还有,按照楼主的意思:已知圆上任意三点坐标如何画弧
不是很明白,三点坐标如何确定弧?
发表于:2007-03-31 19:38:368楼 得分:0
如何圆已经确定,那么,只用两点应该就可以取弧了?有必要三点?
发表于:2007-03-31 19:39:119楼 得分:0
ddddddddddddddddddd
发表于:2007-04-01 09:08:1110楼 得分:0
up
发表于:2007-04-01 09:32:3111楼 得分:0
float   x1,   y1,   x2,   y2,   y3,   x3;
                        x1   =20.0f;
                        y1   =50.0f;
                        x2   =   120.0f;
                        y2   =   70.0f;
                        x3   =   40.0f;
                        y3   =   20.0f;
                        float   x0,   y0,r0;//圆心和半径
                        float   m1,   m2,mx1,mx2,my1,my2;
                        m1   =   -(x2   -   x1)   /   (y2   -   y1);
                        m2   =   -(x3   -   x2)   /   (y3   -   y2);
                        mx1   =   (x1   +   x2)   /   2.0f;
                        mx2   =   (x2   +   x3)   /   2.0f;
                          my1   =   (y1   +   y2)   /   2.0f;
                        my2   =   (y2   +   y3)   /   2.0f;
                        x0=(m1   *   mx1   -   m2   *   mx2   +   my2   -   my1)   /   (m1   -   m2);
                        y0=m1*(x0-mx1)+my1;
           
                        r0   =   convert.tosingle(math.sqrt((x0   -   x1)   *   (x0   -   x1)   +   (y0   -   y1)   *   (y0   -   y1)));
发表于:2007-04-01 09:53:4512楼 得分:0
好家伙,lz大概问的是给出3个point:   point   a,   b,c;如何用graphics.drawarc画出弧来吧?怎么就变成了纯几何问题了呢?
发表于:2007-04-01 11:00:0213楼 得分:0
给你代码参考一下:你自己再测试一下
  float   x1,   y1,   x2,   y2,   y3,   x3;
                        x1   =200.0f;
                        y1   =150.0f;
                        x2   =   380.0f;
                        y2   =   130.0f;
                        x3   =   40.0f;
                        y3   =   200.0f;
                        float   x0,   y0,r0;//圆心和半径
                        float   m1,   m2,mx1,mx2,my1,my2;
                        if(   math.abs(y2   -   y1)   <   0.0001)
                        {
                                m2   =   -(x3   -   x2)   /   (y3   -   y2);
                                mx2   =   (x2   +   x3)   /   2.0f;
                                my2   =   (y2   +   y3)   /   2.0f;
                                x0   =   (x1+x2)/2.0f;
                                y0   =   m2   *   (x0   -   mx2)   +   my2;
                        }
                        else   if   (math.abs(y3   -   y2) <0.0001)
                        {
                                m1   =   -(x2   -   x1)   /   (y2   -   y1);
                                mx1   =   (x1   +   x2)   /   2.0f;      
                                my1   =   (y1   +   y2)   /   2.0f;
                                x0   =   (x2+x3)   /   2.0f;
                                y0   =   m1   *   (x0   -   mx1)   +   my1;
                        }
                        else
                        {
                                m1   =   -(x2   -   x1)   /   (y2   -   y1);
                                m2   =   -(x3   -   x2)   /   (y3   -   y2);
                                mx1   =   (x1   +   x2)   /   2.0f;
                                mx2   =   (x2   +   x3)   /   2.0f;
                                my1   =   (y1   +   y2)   /   2.0f;
                                my2   =   (y2   +   y3)   /   2.0f;
                                x0   =   (m1   *   mx1   -   m2   *   mx2   +   my2   -   my1)   /   (m1   -   m2);
                                y0   =   m1   *   (x0   -   mx1)   +   my1;
                        }
           
                        r0   =   convert.tosingle(math.sqrt((x0   -   x1)   *   (x0   -   x1)   +   (y0   -   y1)   *   (y0   -   y1)));
             
                        graphics   g   =   this.picturebox1.creategraphics();
                        g.drawellipse(new   pen(color.blue),   new   rectanglef(x1,   y1,   2,2));
                        g.drawellipse(new   pen(color.blue),   new   rectanglef(x2,   y2,   2,   2));
                        g.drawellipse(new   pen(color.blue),   new   rectanglef(x3,   y3,   2,   2));
                                          //画弧
                        float   k1,   k2,   k3;//斜率
                        k1   =   (y1   -   y0)   /   (x1   -   x0);
                        k2   =   (y2   -   y0)   /   (x2   -   x0);
                        k3   =   (y3   -   y0)   /   (x3   -   x0);
               
                        double[]   a   =   new   double[3];//弧度
                        double[]   b=   new   double[3];//角度
                        double[]   x   =   new   double[3];
                        double   min,   max;
                        double   v   =   180.0   /   3.14159;//弧度与角度转换
                        a[0]   =   math.atan(k1);
                        a[1]   =   math.atan(k2);
                        a[2]   =   math.atan(k3);

                        x[0]   =   x1;
                        x[1]   =   x2;
                        x[2]   =   x3;
                        for   (int   i   =   0;   i   <   3;   i++)
                        {
                                if   (a[i]   > =   0)
                                {
                                        if   (x[i]   >   x0)
                                        {
                                                b[i]   =   a[i]   *   v;
                                        }
                                        else   if   (x[i]   <   x0)
                                        {
                                                b[i]   =   180.0   +   a[i]   *   v;
                                        }
                                }
                                else
                                {
                                        a[i]   =   math.abs(a[i]);
                                        if   (x[i]   >   x0)
                                        {
                                                b[i]   =360.0-   a[i]   *   v;
                                        }
                                        else   if   (x[i]   <   x0)
                                        {
                                                b[i]   =   180.0-   a[i]   *   v;
                                        }
                                }
                        }
                        //寻找最小角度和最大角度
                        min   =   b[0];
                        max   =   b[0];
                        for   (int   i   =   1;   i   <   3;   i++)
                        {
                                if   (b[i]   <   min)
                                        min   =   b[i];
                                if   (b[i]   >   max)
                                        max   =   b[i];
                        }
                        //画弧
                        g.drawarc(new   pen(color.black),   new   rectanglef(x0   -   r0,   y0   -   r0,   2   *   r0,   2   *   r0),   (float)min,   (float)(max   -   min));
发表于:2007-04-01 11:00:3614楼 得分:0
我没有严格测试,你自己再看看
发表于:2007-04-01 11:09:1815楼 得分:0
楼主不要忘记给分呀,我在冲2星,呵呵


快速检索

最新资讯
热门点击