正文

已知三点坐标,求圆心的坐标和半径2005-09-09 12:50:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/clever101/4540.html

分享到:

朱金灿

     这是一个值得探讨一下的程序。一般实现同一程序功能往往有不同的思路。
这个程序也是如此。一般的思路是:
1
、先判断三点能否构成一个圆,具体来说就是看其中一点是否在另外两点连成的直线上,三点共线的话就输出“error”
2
、如果三点不共线,接下来就是求圆心,即三点构成的三角形的其中两边的垂直平分线交点;
3
、最后随便找一点与圆心即可求出半径。

    
实际上用两条弦的垂直平分线的交点确定圆心的方法并不好,理由如下:
假设现在假设三点为(x1,y1),(x2,y2),(x3,y3),求它们的中垂线要使用的点斜式,这样一来,要考虑的情况比较多:
1.(x1,y1),(x2,y2)
连线和(x2,y2),(x3,y3)连线的斜率为0和无穷大都要考虑,二者组合就是4种,再加上某一连线斜率为0或无穷大,而另一斜线斜率不为0和无穷大,考虑的情况更多了。

     
一个更为简单的方法是首先判断三点是否一线,这里分为两种情况:

1.
三点连成的直线没有斜率,判断条件(y1==y2)&&(y2==y3)

2.
判断任意两点连成的直线斜率是否相等。


3.
解方程组,设圆心坐标为(x,y

圆心到任意两点的距离相等,由此求出x,y的表达式,代入程序。

4.
求出圆心,半径迎刃而解。

    
有些同学用圆心到点的距离来定圆心,速度低。其实大可不必。用圆心到点的距离来定圆心速度低,这只是一个简单的计算问题,而计算能力强正是电脑的特长。

   
    
下面是我的源程序,在vc6.0编译通过。

#include<iostream.h>
#include<math.h>

int main()
{
   int x1,y1,x3,y3;
   double a,b,c,d,e,f;
   double r,k1,k2,x,y,x2,y2;
   cout<<"
请输入x1,y1,x2,y2,x3,y3"<<endl;
   cin>>x1>>y1>>x2>>y2>>x3>>y3;
   if((y1==y2)&&(y2==y3))
{
   cout<<"
三点不构成圆
!"<<endl;
   return 0;
}
   if((y1!=y2)&&(y2!=y3))
{
   k1=(x2-x1)/(y2-y1);
   k2=(x3-x2)/(y3-y2);
}
   if(k1==k2)
{
   cout<<"
三点不构成圆
!"<<endl;
   return 0;
}
   a=2*(x2-x1);
   b=2*(y2-y1);
   c=x2*x2+y2*y2-x1*x1-y1*y1;
   d=2*(x3-x2);
   e=2*(y3-y2);
   f=x3*x3+y3*y3-x2*x2-y2*y2;
   x=(b*f-e*c)/(b*d-e*a);
   y=(d*c-a*f)/(b*d-e*a);
   cout<<"
圆心为
("<<x<<","<<y<<")"<<endl;
   r=sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1));
   cout<<"
半径为
"<<r<<endl;
   return 0;
}



 

阅读(23528) | 评论(6)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册