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

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

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

\[(x_1-a)^2 + (y_1-b)^2 = R^2----式(1) \\ (x_2-a)^2 + (y_2-b)^2 = R^2----式(2) \]

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

\[x_1^2 - 2*x_1*a + a^2 + y_1^2 - 2*y_1*b + b^2 = R^2 ----式(3) \\ x_2^2 - 2*x_2*a + a^2 + y_2^2 - 2*y_2*b + b^2 = R^2 ----式(4) \]

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

\[x_1^2 - x_2^2 + 2*(x_2-x_1)*a + y_1^2 - y_2^2 + 2*(y_2-y_1)*b = 0 \rArr a = \frac{(x_2^2 - x_1^2 + y_2^2 - y_1^2)}{2*(x_2-x_1)} - \frac{(y_2-y_1)}{(x_2-x_1)} * b \]

Step4: 使用换元法,将上述已知量重新代替为 \(C_1,C_2\)
设:\(C_1 = (x_2^2 - x_1^2 + y_2^2 - y_1^2)/2/(x_2-x_1)\)
设:\(C_2 = \frac{(y_2-y_1)}{(x_2-x_1)}\)
则可得到简化的 \(a\) 的表达式:

\[a = C_1 - C_2 * b----式(5) \]

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

\[x_1^2 - 2*x_1*(C_1-C_2*b) + (C_1-C_2*b)^2 + y_1^2 -2*y_1*b + b^2 = R^2 \]

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

\[(C_2^2+1)*b^2 + (2*x_1*C_2-2*C_1*C_2-2*y_1)*b + x_1^2-2*x_1*C1+C_1^2+y_1^2-R^2 = 0 \]

得到求b的方程组

  • 二次项系数:\(A = (C_2^2+1)\)
  • 一次项系数:\(B = (2*x_1*C_2-2*C_1*C_2-2*y_1)\)
  • 零次常数项:\(C = x_1^2-2*x_1*C_1+C_1^2+y_1^2-R^2\)

Step7: 一元二次方程转化为: \(A*b^2 + B*b + C = 0 ----式(6)\)

解得:

\[b = \frac{-B + \sqrt{(B^2 - 4AC)}}{2 * A} 或 \frac{-B - \sqrt{(B^2 - 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

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

posted @ 2023-02-09 15:42  小淼博客  阅读(1354)  评论(0编辑  收藏  举报

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