利用圆上两点和圆半径求解圆心坐标
利用圆上两点和圆半径求解圆心坐标
已知圆上两点P1,P2,坐标依次为$(x_1,y_1)$和$(x_2,y_2)$,圆的半径为$r$,求圆心的坐标。
假设P1,P2为任意两点,则两点连成线段的中点坐标是:
$$
x_{mid} = \frac{x_1+x_2}{2}
$$
$$
y_{mid} = \frac{y_1+y_2}{2}
$$
P1,P2连线的斜率是:
$$
k = \frac{y_1-y_2}{x_1-x_2}
$$
P1,P2连线的垂线斜率为:
$$
m = -\frac{1}{k}
$$
则,圆心所在的直线方程是:
$$
y - y_{mid} = m \cdot (x - x_{mid})
$$
圆心$(x_0, y_0)$同时满足:
$$
(x_0-x_1)^2+(y_0-y_1)^2=r^2
$$
和
$$
y_0-y_{mid} = m \cdot (x_0 - x_{mid})
$$
或
$$
(x_0-x_2)^2+(y_0-y_2)^2=r^2
$$
和
$$
y_0-y_{mid} = m \cdot (x_0 - x_{mid})
$$
将直线方程:
$$
y_0 = m \cdot (x_0 - x_{mid}) - y_{mid}
$$
代入圆的公式,得到:
$$
(x_0-x_1)^2+[m \cdot (x_0-x_{mid})+y_{mid}-y_1]^2=r^2
$$
展开:
$$
x_0^2-2x_0x_1+x_1^2+m^2x_0^2+2mx_0 \cdot (y_{mid}-m \cdot x_{mid}-y_1)+(y_{mid}-m \cdot x_{mid}-y_1)^2=r^2
$$
整理:
$$
(1+m^2)x_0^2+[2m(y_{mid}-m \cdot x_{mid}-y_1)-2x_1] \cdot x_0+(y_{mid}-m \cdot x_{mid}-y_1)^2+x_1^2-r^2 = 0
$$
令:
$$
A = 1+m^2
$$
$$
B = 2m(y_{mid}-m \cdot x_{mid}-y_1)-2x_1
$$
$$
C = (y_{mid}-m \cdot x_{mid}-y_1)^2+x_1^2-r^2
$$
则:
$$
x_0=\frac{-B± \sqrt{B^2-4AC}}{2A}
$$
$$
y_0= m \cdot (x_0-x_{mid})+y_{mid}
$$
下面是Python代码实现:
x_1 = 2
y_1 = 4
x_2 = 4
y_2 = 2
r = 2
if (x_1 - x_2 == 0):
print('横坐标相同,求解可能出错')
else:
x_mid = (x_1 + x_2) / 2
y_mid = (y_1 + y_2) / 2
k = (y_1-y_2)/(x_1-x_2)
m = -1/k
A = 1 + m**2
B = 2 * m *(y_mid - m * x_mid - y_1)- 2 * x_1
C = (y_mid - m * x_mid - y_1)**2 + x_1**2 - r**2
print(A, B, C)
x_c1 = (-B + ((B**2-4*A*C)**0.5))/(2*A)
x_c2 = (-B - ((B**2-4*A*C)**0.5))/(2*A)
y_c1 = m * (x_c1 - x_mid) + y_mid
y_c2 = m * (x_c2 - x_mid) + y_mid
print('圆心坐标:',(x_c1,y_c1))
print('圆心坐标:',(x_c2,y_c2))
运行结果:
圆心坐标: (3.0, 3.0)
圆心坐标: (3.0, 3.0)
这表明,给定的圆上两点和半径条件下,圆心坐标为(3.0, 3.0)。