python求两个圆的公切线
时间: 2023-07-01 12:17:50 浏览: 116
假设有两个圆,圆心分别为 $(x_1, y_1)$ 和 $(x_2, y_2)$,半径分别为 $r_1$ 和 $r_2$。以下是求解两个圆的公切线的 Python 代码:
``` python
import math
def find_tangent_lines(x1, y1, r1, x2, y2, r2):
dist = math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)
if dist < abs(r2 - r1):
return [] # 圆内含,无公切线
elif dist == abs(r2 - r1):
# 外切,一条切线
xt = x1 + r1 * (x2 - x1) / dist
yt = y1 + r1 * (y2 - y1) / dist
return [(xt, yt, xt + y2 - y1, yt + x1 - x2)]
else:
# 两条外公切线
angle = math.acos((r1 - r2) / dist)
x_diff = x2 - x1
y_diff = y2 - y1
x_1 = x1 + r1 * (x_diff * math.cos(angle) + y_diff * math.sin(angle)) / dist
y_1 = y1 + r1 * (y_diff * math.cos(angle) - x_diff * math.sin(angle)) / dist
x_2 = x1 + r1 * (x_diff * math.cos(-angle) + y_diff * math.sin(-angle)) / dist
y_2 = y1 + r1 * (y_diff * math.cos(-angle) - x_diff * math.sin(-angle)) / dist
x_3 = x2 + r2 * (x_diff * math.cos(angle) - y_diff * math.sin(angle)) / dist
y_3 = y2 + r2 * (y_diff * math.cos(angle) + x_diff * math.sin(angle)) / dist
x_4 = x2 + r2 * (x_diff * math.cos(-angle) - y_diff * math.sin(-angle)) / dist
y_4 = y2 + r2 * (y_diff * math.cos(-angle) + x_diff * math.sin(-angle)) / dist
return [(x_1, y_1, x_3, y_3), (x_2, y_2, x_4, y_4)]
```
该函数返回一个包含两个元组的列表,每个元组代表一条公切线,格式为 $(x_1, y_1, x_2, y_2)$,其中 $(x_1, y_1)$ 和 $(x_2, y_2)$ 分别为一条公切线的两个端点。如果两个圆没有公切线,则返回空列表。