小淼博客

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  282 随笔 :: 0 文章 :: 102 评论 :: 102万 阅读

已知圆上的两点坐标和半径,求圆心

Step1: 假设已知圆上的两点坐标分别为 N(X1Y1)M(X2Y2) ,半径为 R ,圆心坐标为 O(a,b) ,根据数学知识可得到:

(x1a)2+(y1b)2=R2(1)(x2a)2+(y2b)2=R2(2)

Step2: 分别展开上述两个式子得到:

x122x1a+a2+y122y1b+b2=R2(3)x222x2a+a2+y222y2b+b2=R2(4)

Step3: (3)式 - (4)式得到:

x12x22+2(x2x1)a+y12y22+2(y2y1)b=0a=(x22x12+y22y12)2(x2x1)(y2y1)(x2x1)b

Step4: 使用换元法,将上述已知量重新代替为 C1,C2
设:C1=(x22x12+y22y12)/2/(x2x1)
设:C2=(y2y1)(x2x1)
则可得到简化的 a 的表达式:

a=C1C2b(5)

Step5:(5)式 代入 (3)式 ,得到;

x122x1(C1C2b)+(C1C2b)2+y122y1b+b2=R2

Step6: 展开简化为关于 b一元二次方程 一般形式;

(C22+1)b2+(2x1C22C1C22y1)b+x122x1C1+C12+y12R2=0

得到求b的方程组

  • 二次项系数:A=(C22+1)
  • 一次项系数:B=(2x1C22C1C22y1)
  • 零次常数项:C=x122x1C1+C12+y12R2

Step7: 一元二次方程转化为: Ab2+Bb+C=0(6)

解得:

b=B+(B24AC)2AB(B24AC)2A

代入(5)式得 a 的值;

void CircleCenter(double x1,double y1,double x2,double y2,double R,double &x,double &y)  
{  
    double c1 = (x2*x2 - x1*x1 + y2*y2 - y1*y1) / (2 *(x2 - x1));  
    double c2 = (y2 - y1) / (x2 - x1);  //斜率
    double A = (c2*c2 + 1);  
    double B = (2 * x1*c2 - 2 * c1*c2 - 2 * y1);  
    double C = x1*x1 - 2 * x1*c1 + c1*c1 + y1*y1 - R*R;  
    y = (-B + sqrt(B*B - 4 * A*C)) / (2 * A);
    x = c1 - c2 * y;     
} 

Reference

已知两点坐标和半径,求圆心

posted on   小淼博客  阅读(2379)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程

大家转载请注明出处!谢谢! 在这里要感谢GISPALAB实验室的各位老师和学长学姐的帮助!谢谢~

点击右上角即可分享
微信分享提示