Vector 笛卡尔平面上沿指定向量的两个圆之间的最小距离

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“碰撞”(参见链接图像)。我确信我可以迭代地

我正在尝试解决以下问题(我正在使用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的边界框,然后收敛/测试交点)。但是,我想知道这个问题是否有一个封闭形式的解决方案。

移动坐标以简化表达式

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
  • 移动的圆永远不会靠得足够近而发生碰撞<代码>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
    
    图1

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

    其中(参见图1)

    • dx
      dy
      是圆
      c1
    • p1
      p2
      移动圆
      c1
      和静态圆
      c2
    • r1
      r2
      每个圆的半径
    以下内容将
    d
    设置为距离
    c1
    必须沿
    dx
    dy
    c2
    碰撞,如果没有碰撞,d将设置为
    无限

    没有解决方案的情况有三种

  • 移动圆正在远离静止圆<代码>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
    
    图1

    链接到图片:这是一道数学题,不是一道编程题。尝试链接到图片:这是一个数学问题,不是一个编程问题。尝试