首页 > 解决方案 > 笛卡尔平面上沿指定向量的两个圆之间的最小距离

问题描述

我正在尝试解决以下问题(我正在使用 Matlab,尽管欢迎使用其他语言的伪代码/解决方案):

我在笛卡尔平面上有两个圆,由它们的质心(p1,p2)和半径(r1,r2)定义。圆 1 (c1 = [p1 r1]) 被认为是“动态的”:它沿着向量 V = [0 -1] 平移。圆 2 (c2 = [p2 r2]) 被认为是“静态的”:它位于 c1 的路径中,但其质心的 x 分量偏离 c2 的 x 分量(否则解决方案将是微不足道的:圆心减去它们的半径之和)。

我试图定位沿 V 的距离(d),在该距离处,圆 1 将与圆 2“碰撞”(参见链接图像)。我确信我可以迭代地解决这个问题(即将 c1 转换为 c2 的边界框,然后收敛/测试交叉点)。但是,我想知道这个问题是否有封闭形式的解决方案。

标签: vectorgeometry2dcollision

解决方案


由于问题标题与取决于固定向量 {0, -1} 或 {0, 1} 而不是任意向量的问题和接受的答案不匹配,因此我添加了另一个适用于任何单位向量的解决方案。

哪里(见图1)

  • dx,dy是圆的旅行单位向量c1
  • p1,p2动圆心c1和静圆心c2
  • r1,r2每个圆的半径

以下将设置为必须行进d的距离,如果没有碰撞,则d将设置为c1dxdyc2Infinity

无解的三种情况

  1. 动圈远离静圈。u < 0
  2. 移动的圆圈永远不会靠近到足以碰撞。dSq > rSq
  3. 两个圆圈已经重叠。u < 0幸运的是,数学使这与离开的条件相同。

    请注意,如果您忽略u(1 和 3) 的符号,那么d到第一次(因果)接触的距离将在时间上倒退

从而找到伪代码d

d = Infinity
rSq = (r1 + r2) ^ 2     
u = (p1.x - p2.x) * dx + (p1.x - p2.x) * dy 
if u >= 0
    dSq = ((p2.x + dx * u) - p1.x) ^ 2 + ((p2.y + dy * u) - p1.y) ^ 2
    if dSq <= rSq 
        d = u - (rSq - dSq) ^ 0.5

可以通过以下方式找到联系点

cpx = p1.x + dx * d;
cpy = p1.x + dy * d;

图1

图 1 显示变量及其与问题的关系


推荐阅读