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
的端点。这些似乎很容易检查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,Qx≠ Px 及 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,Qx≠ Px 及 u(t1,t2)=0
(Ca-Px)⨯ (Qx-Px)/(Qx-Px)⨯ (Cb-Ca)=0
(Ca-Px)⨯ (Qx-Px)=0,Qx≠ Px 及 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,Qx≠ Px 我们有四个限制条件(或八个,取决于您的计算方式):
- 0≤ t1≤ 一,
- 0≤ t2≤ 一,
- 0≤ t(t1,t2)≤ 一,
- 0≤ u(t1,t2)≤ 一,
要找到最小值(t1、t2),您需要评估所有候选点:
- 内极小值;线P和Q交叉的点。(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