已知圆上的两点坐标和半径,求圆心
Step1: 假设已知圆上的两点坐标分别为 N(X1,Y1) 和 M(X2,Y2) ,半径为 R ,圆心坐标为 O(a,b) ,根据数学知识可得到:
(x1−a)2+(y1−b)2=R2−−−−式(1)(x2−a)2+(y2−b)2=R2−−−−式(2)
Step2: 分别展开上述两个式子得到:
x21−2∗x1∗a+a2+y21−2∗y1∗b+b2=R2−−−−式(3)x22−2∗x2∗a+a2+y22−2∗y2∗b+b2=R2−−−−式(4)
Step3: (3)式 - (4)式得到:
x21−x22+2∗(x2−x1)∗a+y21−y22+2∗(y2−y1)∗b=0⇒a=(x22−x21+y22−y21)2∗(x2−x1)−(y2−y1)(x2−x1)∗b
Step4: 使用换元法,将上述已知量重新代替为 C1,C2
设:C1=(x22−x21+y22−y21)/2/(x2−x1)
设:C2=(y2−y1)(x2−x1)
则可得到简化的 a 的表达式:
a=C1−C2∗b−−−−式(5)
Step5: 把 (5)式 代入 (3)式 ,得到;
x21−2∗x1∗(C1−C2∗b)+(C1−C2∗b)2+y21−2∗y1∗b+b2=R2
Step6: 展开简化为关于 b 的 一元二次方程 一般形式;
(C22+1)∗b2+(2∗x1∗C2−2∗C1∗C2−2∗y1)∗b+x21−2∗x1∗C1+C21+y21−R2=0
得到求b的方程组
- 二次项系数:A=(C22+1)
- 一次项系数:B=(2∗x1∗C2−2∗C1∗C2−2∗y1)
- 零次常数项:C=x21−2∗x1∗C1+C21+y21−R2
Step7: 一元二次方程转化为: A∗b2+B∗b+C=0−−−−式(6)
解得:
b=−B+√(B2−4AC)2∗A或−B−√(B2−4AC)2∗A
代入(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
已知两点坐标和半径,求圆心
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程