Vector 笛卡尔平面上沿指定向量的两个圆之间的最小距离
我正在尝试解决以下问题(我正在使用Matlab,但欢迎使用其他语言的伪代码/解决方案): 在笛卡尔平面上有两个圆,由它们的质心(p1,p2)和半径(r1,r2)定义。圆1(c1=[p1 r1])被认为是“动态的”:它正沿着向量V=[0-1]平移。圆2(c2=[p2 r2])被视为“静态”:它位于c1的路径中,但其质心的x分量与c2的x分量偏移(否则,解决方案将很简单:圆质心之间的距离减去其半径之和)Vector 笛卡尔平面上沿指定向量的两个圆之间的最小距离,vector,geometry,2d,collision,Vector,Geometry,2d,Collision,我正在尝试解决以下问题(我正在使用Matlab,但欢迎使用其他语言的伪代码/解决方案): 在笛卡尔平面上有两个圆,由它们的质心(p1,p2)和半径(r1,r2)定义。圆1(c1=[p1 r1])被认为是“动态的”:它正沿着向量V=[0-1]平移。圆2(c2=[p2 r2])被视为“静态”:它位于c1的路径中,但其质心的x分量与c2的x分量偏移(否则,解决方案将很简单:圆质心之间的距离减去其半径之和) 我试图定位沿V的距离(d),在该距离处,圆1将与圆2“碰撞”(参见链接图像)。我确信我可以迭代地
我试图定位沿V的距离(d),在该距离处,圆1将与圆2“碰撞”(参见链接图像)。我确信我可以迭代地解决这个问题(即,将c1转换为c2的边界框,然后收敛/测试交点)。但是,我想知道这个问题是否有一个封闭形式的解决方案。移动坐标以简化表达式
px = p1.x - p2.x
py = p1.y - p2.y
并求解d
的二次方程(零解、一解或两解)
仅此而已。移动坐标以简化表达式
px = p1.x - p2.x
py = p1.y - p2.y
并求解d
的二次方程(零解、一解或两解)
仅此而已。由于问题标题与问题和公认答案不匹配,该问题和公认答案依赖于固定向量{0,-1}或{0,1},而不是任意向量,因此我添加了另一个适用于任何单位向量的解 其中(参见图1)
,dx
是圆dy
c1
,p1
移动圆p2
和静态圆c1
c2
,r1
每个圆的半径r2
d
设置为距离c1
必须沿dx
,dy
与c2
碰撞,如果没有碰撞,d将设置为无限
没有解决方案的情况有三种
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
图1
由于问题标题与问题和公认答案不匹配,该问题和公认答案依赖于固定向量{0,-1}或{0,1},而不是任意向量,因此我添加了另一个适用于任何单位向量的解决方案 其中(参见图1)
,dx
是圆dy
c1
,p1
移动圆p2
和静态圆c1
c2
,r1
每个圆的半径r2
d
设置为距离c1
必须沿dx
,dy
与c2
碰撞,如果没有碰撞,d将设置为无限
没有解决方案的情况有三种
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
图1
链接到图片:这是一道数学题,不是一道编程题。尝试链接到图片:这是一个数学问题,不是一个编程问题。尝试