Math 通过第三个二维线段的二维线段上最近的点

Math 通过第三个二维线段的二维线段上最近的点,math,geometry,computational-geometry,intersection,mathematical-optimization,Math,Geometry,Computational Geometry,Intersection,Mathematical Optimization,使用图表更容易做到这一点,攻击 我有两条二维线段,p和Q。我想在P上找到点Px,在Q上找到点Qx,这样dist(Px,Qx)就最小化了。到现在为止,一直都还不错;这是一项非常简单的任务 现在皱纹来了。我想约束Px和Qx,这样包含它们的行PxQx必须与第三个线段C相交。(顺便说一句,可以随意假设没有任何原始线段相交。) 显然存在这样一种情况,即无约束的Px和Qx已经满足了C相交条件 还有一种不可行的情况,C甚至不包含P和Q的凸包。这些都是需要检查的琐碎案例 在其他情况下,行PxQx必须包含Ca或

使用图表更容易做到这一点,攻击

我有两条二维线段,
p
Q
。我想在
P
上找到点
Px
,在
Q
上找到点
Qx
,这样
dist(Px,Qx)
就最小化了。到现在为止,一直都还不错;这是一项非常简单的任务

现在皱纹来了。我想约束
Px
Qx
,这样包含它们的行
PxQx
必须与第三个线段
C
相交。(顺便说一句,可以随意假设没有任何原始线段相交。)

  • 显然存在这样一种情况,即无约束的
    Px
    Qx
    已经满足了
    C
    相交条件
  • 还有一种不可行的情况,
    C
    甚至不包含
    P
    Q
    的凸包。这些都是需要检查的琐碎案例
  • 在其他情况下,行
    PxQx
    必须包含
    Ca
    Cb
    。这似乎并没有完全简化为一个线性方程组
  • 在最后一组情况中,
    PxQx
    不仅包含
    C
    的端点,还包含
    P
    Q
    的端点。这些似乎很容易检查
  • 我担心的是(3)中的情况,因为我不知道如何在不调用令人不快的高次多项式的情况下得到一个好的封闭形式。当然,我可以在整个过程中使用一个迭代约束优化器,但我想最大限度地提高性能,在近乎退化的情况下,高精度可能很重要

    Px=p(t1)=Pa。(1-t1)+Pb·t1
    Qx=Q(t2)=Qa·1-t2)+Qb·t2

    最小化f(t1,t2)=|Px-Qx|2

    使用中的方程式,我们得到:

    t(t1,t2)=(Ca-Px)⨯ (Cb-Ca)/(Qx-Px)⨯ (Cb-Ca
    u(t1,t2)=(Ca-Px)⨯ (Qx-Px)/(Qx-Px)⨯ (Cb-Ca

    (⨯ = 交叉积)

    这两个值必须介于0和1之间,才能使线段相交。t是沿Px Qx线的位置,u是沿C线的位置。如果展开公式,它们将是两个线性或二次函数的商

    由于您只将t和u与0和1进行比较,因此可以稍微简化:

    t(t1,t2)=0
    Ca-Px)⨯ (Cb-Ca)/(Qx-Px)⨯ (Cb-Ca)=0
    Ca-Px)⨯ (Cb-Ca)=0,QxPx

    t(t1,t2)=1
    Ca-Px)⨯ (Cb-Ca)/(Qx-Px)⨯ (Cb-Ca)=1
    Ca-Px)⨯ (Cb-Ca)-(Qx-Px)⨯ (Cb-Ca)=0
    Ca-Qx)⨯ (Cb-Ca)=0,QxPx

    u(t1,t2)=0
    Ca-Px)⨯ (Qx-Px)/(Qx-Px)⨯ (Cb-Ca)=0
    Ca-Px)⨯ (Qx-Px)=0,QxPx

    u(t1,t2)=1
    Ca-Px)⨯ (Qx-Px)/(Qx-Px)⨯ (Cb-Ca)=1
    Ca-Px)⨯ (Qx-Px)-(Qx-Px)⨯ (Cb-Ca)=0
    Ca-Px)⨯ (Qx-Px)+(Cb-Ca)⨯ (Qx-Px)=0
    Cb-Px)⨯ (Qx-Px)=0,QxPx

    我们有四个限制条件(或八个,取决于您的计算方式):

    • 0≤ t1≤ 一,
    • 0≤ t2≤ 一,
    • 0≤ t(t1,t2)≤ 一,
    • 0≤ u(t1,t2)≤ 一,
    您有四个约束变量,每个变量有两个边界。这总共需要考虑八种情况,每种情况都在(T1,T2)-空间中形成曲线或线段。 这些约束在(t1,t2)-允许值空间中形成一个区域。您必须沿着该区域的外边缘进行跟踪,并找到使PxQx之间的距离最小的点。只要PQ段不相交,最小值将始终位于外边界。尽管在某些情况下,不会有任何有效的解决方案


    要找到最小值(t1、t2),您需要评估所有候选点:

    • 内极小值;线PQ交叉的点。(1分)
    • 边界最小值;
      P(x) = P0 + p * x
      Q(y) = Q0 + q * y
      
      R(x) = C0 - (P0 + p * x)
      
      S(x, y) = (Q0 + q * y) - (P0 + p * x)
      
      S(x) = S(x, y(x))
      
      f(s,t) =  (a0 + (a1 - a0)*t - m0 - (m1 - m0)*s)^2 + (b0 + (b1-b0)*t - n0 - (n1-n0)*s)^2 
      
      g(s,t) = (a0 + (a1 - a0)*t - c)*(n0 + (n1 - n0)*s -d) - (b0 +(b1 - b0)*t - d)*(m0 + (m1 - m0)*s -d) = 0