笛卡尔平面上沿指定向量的两个圆之间的最小距离
Minimum distance between two circles along a specified vector on a cartesian plane
我正在尝试解决以下问题(我正在使用 Matlab,但欢迎使用其他语言的伪代码/解决方案):
我在笛卡尔平面上有两个圆,由它们的质心 (p1, p2) 和半径 (r1, r2) 定义。圆 1 (c1 = [p1 r1]) 被视为 'dynamic':它正在沿矢量 V = [0 -1] 平移。圆 2 (c2 = [p2 r2]) 被视为 'static':它位于 c1 的路径中,但其质心的 x 分量偏离 c2 的 x 分量(否则解决方案将是微不足道的:距离在圆质心减去它们的半径之和之间)。
我正在尝试确定圆 1 与圆 2 'collide' 沿 V 的距离 (d)(参见链接图像)。我确信我可以迭代地解决这个问题(即将 c1 转换为 c2 的边界框,然后收敛/测试交叉点)。但是,我想知道这个问题是否有封闭形式的解决方案。
移动坐标以简化表达式
px = p1.x - p2.x
py = p1.y - p2.y
并求解 d
的二次方程(零、一或两个解)
px^2 + (py - d)^2 = (r1 + r2)^2
(py - d)^2 = (r1 + r2)^2 - px^2
d = py +/- Sqrt((r1 + r2)^2 - px^2)
就这些了。
由于问题标题与依赖于固定向量 {0, -1} 或 {0, 1} 而不是任意向量的问题和接受的答案不匹配,我添加了另一个适用于任何单位向量。
其中(见图 1)
dx
,dy
为圆的行程单位矢量c1
p1
,p2
动圆圆心c1
和静圆圆心c2
r1
,r2
每个圆的半径
下面将d
设置为c1
必须沿着dx
行进的距离,dy
与c2
相撞,如果没有碰撞则d会设置为 Infinity
无解的三种情况
- 动圈正在远离静圈。
u < 0
- 移动的圆圈永远不会靠近到碰撞的程度。
dSq > rSq
两个圆已经重叠了。 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
我正在尝试解决以下问题(我正在使用 Matlab,但欢迎使用其他语言的伪代码/解决方案):
我在笛卡尔平面上有两个圆,由它们的质心 (p1, p2) 和半径 (r1, r2) 定义。圆 1 (c1 = [p1 r1]) 被视为 'dynamic':它正在沿矢量 V = [0 -1] 平移。圆 2 (c2 = [p2 r2]) 被视为 'static':它位于 c1 的路径中,但其质心的 x 分量偏离 c2 的 x 分量(否则解决方案将是微不足道的:距离在圆质心减去它们的半径之和之间)。
我正在尝试确定圆 1 与圆 2 'collide' 沿 V 的距离 (d)(参见链接图像)。我确信我可以迭代地解决这个问题(即将 c1 转换为 c2 的边界框,然后收敛/测试交叉点)。但是,我想知道这个问题是否有封闭形式的解决方案。
移动坐标以简化表达式
px = p1.x - p2.x
py = p1.y - p2.y
并求解 d
的二次方程(零、一或两个解)
px^2 + (py - d)^2 = (r1 + r2)^2
(py - d)^2 = (r1 + r2)^2 - px^2
d = py +/- Sqrt((r1 + r2)^2 - px^2)
就这些了。
由于问题标题与依赖于固定向量 {0, -1} 或 {0, 1} 而不是任意向量的问题和接受的答案不匹配,我添加了另一个适用于任何单位向量。
其中(见图 1)
dx
,dy
为圆的行程单位矢量c1
p1
,p2
动圆圆心c1
和静圆圆心c2
r1
,r2
每个圆的半径
下面将d
设置为c1
必须沿着dx
行进的距离,dy
与c2
相撞,如果没有碰撞则d会设置为 Infinity
无解的三种情况
- 动圈正在远离静圈。
u < 0
- 移动的圆圈永远不会靠近到碰撞的程度。
dSq > rSq
两个圆已经重叠了。
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;