已知两点坐标和半径,求圆心
已知圆上的两点坐标和半径,求圆心
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
转载请注明出处!感谢GISPALAB实验室的老师和同学们的帮助和支持~