当前位置:编程学习 > C#/ASP.NET >>

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

已知圆上任意三点坐标如何画弧 --------------------编程问答-------------------- 正确的问题是    只允许使用直尺和圆规,过已知不在一条直线上的任意3个点,作一条弧线。

如果只允许使用直尺和圆规
1 过其中2个点做直线
2 另外再2个点做直线
3 对2个线段做中垂线,两中垂线交于点o
4 以o为圆心,o到任意一个原已知点的距离为半径,作弧。 --------------------编程问答-------------------- 中垂线作法:

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

2  连接A,B两点的直线,就是中垂线 --------------------编程问答-------------------- 如果这个问题再提高难度,仅允许使用圆规不允许使用直尺,同样是有解的,不过步骤比较多也比较复杂~~~  我还要好好回忆一下。。。。先不贴了~~


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


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


--------------------编程问答-------------------- 对自己BS一下。
已经忘记如何证明该论题了。:)
哪位给个证明过程嘛。:)
不用程序的,只需要用初中几何学的方法来证明一下。把证明过程写出来。然后用程序来实现应该很简单。 --------------------编程问答-------------------- 如果有人研究出来可以只用一次圆规的,希望能分享一下~~~~







如果是计算机题目,太简单了,给出3个点的空间坐标,用参数方程,解2次方程对计算机来说小菜一碟~~~~ --------------------编程问答-------------------- :)如果不用圆规呢?楼上? --------------------编程问答-------------------- 还有,按照楼主的意思:已知圆上任意三点坐标如何画弧
不是很明白,三点坐标如何确定弧? --------------------编程问答-------------------- 如何圆已经确定,那么,只用两点应该就可以取弧了?有必要三点? --------------------编程问答-------------------- ddddddddddddddddddd --------------------编程问答-------------------- up --------------------编程问答-------------------- 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)));
--------------------编程问答-------------------- 好家伙,LZ大概问的是给出3个Point: Point A, B,C;如何用Graphics.DrawArc画出弧来吧?怎么就变成了纯几何问题了呢? --------------------编程问答-------------------- 给你代码参考一下:你自己再测试一下
 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)); --------------------编程问答-------------------- 我没有严格测试,你自己再看看 --------------------编程问答-------------------- 楼主不要忘记给分呀,我在冲2星,呵呵 --------------------编程问答--------------------
引用 13 楼 dazhu2 的回复:
给你代码参考一下:你自己再测试一下
  float   x1,   y1,   x2,   y2,   y3,   x3;
                        x1   =200.0f;
                        y1   =150.0f;
                        x2   =   380.0f;
                ……
我现在就在做绘图工具,谢谢,我参考下,呵呵
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,