
def circle_intersection(p1, r1, p2, r2):
d = np.linalg.norm(p2 - p1)
if d > r1 + r2 or d < abs(r1 - r2):
return None # 无交点
a = (r1**2 - r2**2 + d**2) / (2 * d)
h = np.sqrt(r1**2 - a**2)
p_mid = p1 + a * (p2 - p1) / d
offset = h * np.array([-(p2[1] - p1[1]), p2[0] - p1[0]]) / d
return p_mid + offset, p_mid - offset
C_points = circle_intersection(D, L2, E, L3)这段函数 circle_intersection 是计算两个圆的交点的代码,这是在五杆机构中计算点 C 的关键步骤。 我们逐行详细讲解:
def circle_intersection(p1, r1, p2, r2):p1,半径 r1
p2,半径 r2
p_mid ± offset(即返回两个交点)
d = np.linalg.norm(p2 - p1)p2 - p1:圆心向量
np.linalg.norm(...):求欧几里得距离
📌 这个
d是两个圆心之间的距离 如果d > r1 + r2,说明两圆太远了,不相交 如果d < |r1 - r2|,说明一个圆完全包在另一个里面,也不相交
if d > r1 + r2 or d < abs(r1 - r2):
return None # 无交点没有交点的情况直接返回 None
a = (r1**2 - r2**2 + d**2) / (2 * d)这个 a 是一个比例系数,它的几何含义如下:.
0
p1 向 p2 方向偏移 a,就是“交点连线”的中点(即两个交点的对称中心)
h = np.sqrt(r1**2 - a**2)h 是从主线段中点垂直出去的长度
p_mid:p_mid = p1 + a * (p2 - p1) / dp2 - p1:是圆心间的向量
a * (...) / d:单位方向向量乘以长度 a
offset:offset = h * np.array([-(p2[1] - p1[1]), p2[0] - p1[0]]) / d这个是关键:
[−(y2−y1), x2−x1]:是将原方向 [x2−x1, y2−y1] 旋转 90°,得到垂直方向
h,是垂直方向上前进 h 的长度
return p_mid + offset, p_mid - offset这两个点就是:
交点1 = 中点 + 垂直偏移
交点2 = 中点 - 垂
直偏移
C1
●
/|
r1 / |
/ | h
/ |
p1 ●---------● p2
a |
\|
●
C2±h,得到两个交点 C1 和 C2
名称 | 含义 |
|---|---|
d | 两圆心距离 |
a | 从 p1 沿 p1→p2 方向到中点的距离 |
h | 从中点到交点的垂直高度 |
p_mid | 交点连线的中心点 |
offset | 垂直偏移方向 |
最终返回两个交点:
p1 = p_mid + offset
p2 = p_mid - offset我自己做的草稿图,希望可以更好理解

