首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >五连杆正逆解-两个圆的交点解法

五连杆正逆解-两个圆的交点解法

作者头像
懒洋洋
发布2025-11-15 10:58:41
发布2025-11-15 10:58:41
1230
举报

源代码

代码语言:javascript
复制
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 的关键步骤。 我们逐行详细讲解:

函数的定义,名称和参数:

代码语言:javascript
复制
def circle_intersection(p1, r1, p2, r2):
  • 输入两个圆:
    • 第一个圆:圆心 p1,半径 r1
    • 第二个圆:圆心 p2,半径 r2
  • 输出:
    • 两个交点的坐标 p_mid ± offset(即返回两个交点)

✏️ 步骤详解


1️⃣ 计算两圆心的距离:
代码语言:javascript
复制
d = np.linalg.norm(p2 - p1)
  • p2 - p1:圆心向量
  • np.linalg.norm(...):求欧几里得距离

📌 这个 d 是两个圆心之间的距离 如果 d > r1 + r2,说明两圆太远了,不相交 如果 d < |r1 - r2|,说明一个圆完全包在另一个里面,也不相交

2️⃣ 判断是否有交点:
代码语言:javascript
复制
if d > r1 + r2 or d < abs(r1 - r2):
    return None  # 无交点

没有交点的情况直接返回 None

3️⃣ 计算两圆交点之间的“主线段”的中点位置:
代码语言:javascript
复制
a = (r1**2 - r2**2 + d**2) / (2 * d)

这个 a 是一个比例系数,它的几何含义如下:.

0

  • 连接两个圆心形成一条线段(长度为 d)
  • 在这条线段上,从 p1p2 方向偏移 a,就是“交点连线”的中点(即两个交点的对称中心)
4️⃣ 求“交点到圆心连线中点”的垂直距离:
代码语言:javascript
复制
h = np.sqrt(r1**2 - a**2)
  • h 是从主线段中点垂直出去的长度
  • 就是从这条线(圆心连接线)到交点的高度
5️⃣ 求交点中点 p_mid
代码语言:javascript
复制
p_mid = p1 + a * (p2 - p1) / d
  • p2 - p1:是圆心间的向量
  • a * (...) / d:单位方向向量乘以长度 a
  • 结果就是:从 p1 出发,沿着 p1→p2 的方向,前进 a 的距离,得到两个交点中点
6️⃣ 求交点偏移量 offset
代码语言:javascript
复制
offset = h * np.array([-(p2[1] - p1[1]), p2[0] - p1[0]]) / d

这个是关键:

  • [−(y2−y1), x2−x1]:是将原方向 [x2−x1, y2−y1] 旋转 90°,得到垂直方向
  • 再乘以 h,是垂直方向上前进 h 的长度
7️⃣ 得到两个交点:
代码语言:javascript
复制
return p_mid + offset, p_mid - offset

这两个点就是:

  • 交点1 = 中点 + 垂直偏移
  • 交点2 = 中点 - 垂
  • 直偏移

📐 图示理解

代码语言:javascript
复制
           C1
           ●
          /|
      r1 / |
        /  | h
       /   |
p1 ●---------● p2
        a   |
           \|
           ●
           C2
  • 从 p1 向 p2 走 a 长度,到达交点中点
  • 再在垂直方向上分别走 ±h,得到两个交点 C1 和 C2

✅ 总结

名称

含义

d

两圆心距离

a

从 p1 沿 p1→p2 方向到中点的距离

h

从中点到交点的垂直高度

p_mid

交点连线的中心点

offset

垂直偏移方向

最终返回两个交点:

代码语言:javascript
复制
p1 = p_mid + offset
p2 = p_mid - offset

我自己做的草稿图,希望可以更好理解

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-11-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 源代码
  • 函数的定义,名称和参数:
    • ✏️ 步骤详解
      • 1️⃣ 计算两圆心的距离:
      • 2️⃣ 判断是否有交点:
      • 3️⃣ 计算两圆交点之间的“主线段”的中点位置:
      • 4️⃣ 求“交点到圆心连线中点”的垂直距离:
      • 5️⃣ 求交点中点 p_mid:
      • 6️⃣ 求交点偏移量 offset:
      • 7️⃣ 得到两个交点:
    • 📐 图示理解
    • ✅ 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档