📅  最后修改于: 2023-12-03 15:40:48.283000             🧑  作者: Mango
算法:几何
最简单的情况是求点到圆心的距离。设圆的圆心坐标为 $(x_0, y_0)$,点的坐标为 $(x,y)$,距离为 $d$,则有:
$$ d = \sqrt{(x-x_0)^2+(y-y_0)^2} $$
点与圆的位置关系分为以下几种情况:
点到圆的最短距离有以下两种情况:
点到圆的切点有两个,设切点坐标为 $(x_1,y_1)$ 和 $(x_2,y_2)$,圆的半径为 $r$,圆心坐标为 $(x_0,y_0)$,点的坐标为 $(x,y)$。计算公式如下:
$$ \begin{aligned} d &= \sqrt{(x-x_0)^2+(y-y_0)^2} \ x_1 &= x_0 + r * \frac{x-x_0}{d} \ y_1 &= y_0 + r * \frac{y-y_0}{d} \ x_2 &= x_0 - r * \frac{x-x_0}{d} \ y_2 &= y_0 - r * \frac{y-y_0}{d} \end{aligned} $$
其中,$\frac{x-x_0}{d}$ 和 $\frac{y-y_0}{d}$ 分别表示以圆心为原点,过点和圆心的直线的方向向量的横纵坐标。
参考代码如下:
import math
def distance(x, y, x0, y0):
"""
计算点到圆心的距离
"""
return math.sqrt((x-x0)**2 + (y-y0)**2)
def get_tangent_points(x, y, x0, y0, r):
"""
计算点到圆的切点
"""
d = distance(x, y, x0, y0)
if d <= r: # 点在圆内或圆上
return []
x1 = x0 + r * (x-x0) / d
y1 = y0 + r * (y-y0) / d
x2 = x0 - r * (x-x0) / d
y2 = y0 - r * (y-y0) / d
return [(x1,y1), (x2,y2)]
# 示例代码
if __name__ == '__main__':
x, y = 0, 0 # 点坐标
x0, y0 = 2, 2 # 圆心坐标
r = 1 # 圆半径
print(distance(x, y, x0, y0)) # 输出点到圆心的距离
print(get_tangent_points(x, y, x0, y0, r)) # 输出点到圆的切点
以上代码使用 Python 语言实现了点与圆之间的最短距离计算,并提供注释以方便理解。