作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用图更容易。 CaRMetal,发动攻击!
我有两个2D线段,P
和Q
。我想在Px
上找到点P
,在Qx
上找到Q
,以便将dist(Px,Qx)
最小化。到现在为止还挺好;这是一个非常简单的任务。
现在是皱纹。我想约束Px
和Qx
,以便包含它们的PxQx
行必须与第三行段C
相交。 (随意假设所有原始线段都不相交,顺便说一句。)
Px
和Qx
已经满足C
交集条件。 C
甚至不包含P
和Q
的凸包。这些都是微不足道的情况要检查。 PxQx
行必须包含Ca
或Cb
。这似乎不能完全简化为线性方程组。 PxQx
不仅包含C
的端点,而且还包含P
或Q
的端点。这些似乎很容易检查。 最佳答案
我想在这里写下一个简短的小公式,然后说“瞧”,但这不会发生,这就是原因。这个问题是对找到两个线段之间最短距离的扩展,Dan Sunday在Distance between Segments and Rays中对此进行了很好的描述。在此图中使用标签和符号
我们可以通过P
和Q
参数化P(t) = P_0 + t(P_1 - P_0)
和Q(s) = Q_0 + s(Q_1 - Q_0)
,其中点的减法是按坐标方式进行的,即Q_1 - Q_0 = (m1-m0,n1-n0)
。通过这种参数化,找到线段P
和Q
之间最短距离的问题就是将距离^ 2最小化,
f(s,t) = (a0 + (a1 - a0)*t - m0 - (m1 - m0)*s)^2 + (b0 + (b1-b0)*t - n0 - (n1-n0)*s)^2
s,t
空间中由
0<=s<=1
和
0<=t<=1
界定的区域上。 (此变换避免在保留最小值的位置的同时处理平方根)。请注意,除非线段相交,否则最小值将出现在边界上。
(s,t)
对,其中
P(t)
和
Q(s)
的连接线穿过
C
。将一点
Cp = (c,d)
固定在
C
上。然后,如果与一对
(s,t)
关联的行经过
Cp
,则矢量
P(t)->Cp
和
Q(S)->Cp
z
的方向设置为
0
并使用叉积(对于并行矢量必须为零)来获取任何此类
(s,t)
必须满足以下关系
g(s,t) = (a0 + (a1 - a0)*t - c)*(n0 + (n1 - n0)*s -d) - (b0 +(b1 - b0)*t - d)*(m0 + (m1 - m0)*s -d) = 0
g(s,t) = 0
的解决方案都是
(s,t)
对,其中连接其关联点的线穿过
Cp
。如果我们通过
C
参数化
C(r) = C_0 + r(C_1 - C_0)
,那么我们可以认为与每个
r
相关联的是
g(s,t) = 0
的解决方案集,我们在其中放了
Cp = C(r)
。在
g(s,t)
上绘制
[0,1]X[0,1]
,我们可以看到这些曲线的样子。
r
的增加而增加,而
C(0)
和
C(1)
的轮廓则形成了可行区域的边界。图中的基础颜色是
f(s,t)
的值。更一般而言,具有我们额外约束的可行区域(即可能解决该问题的
(s,t)
值)是
[0,1]X[0,1]
框中的点,它们也在
C(0)
和
C(1)
的轮廓之间。当然,轮廓都不会与
[0,1]X[0,1]
框相交,这时整个框都是可行的,或者没有解决方案。和以前一样,除非
P
和
Q
在可行区域内相交,否则最小值将出现在边界上。
[0,1]X[0,1]
g(s,t) = 0
或C(0)
的轮廓C(1)
f(s,t)
最小化为
g(s,t) = 0
的最小值的封闭形式是方程组的解决方案(请参阅任何微积分教科书或
Wikipedia, Lagrange Multiplier)
(partial g)/(partial s) (partial f)/partial t) = (partial g)/(partial t) (partial f)/partial s)
g(s,t) = 0
-2*((b0 - b1)*((n0 - n1)*s - (b0 - b1)*t + b0 - n0) + (a0 - a1)*((m0 - m1)*s - (a0 - a1)*t + a0 - m0))*((n0 - n1)*((a0 - a1)*t - a0 + c) - (m0 - m1)*((b0 - b1)*t - b0 + d)) + 2*((b0 - b1)*((m0 - m1)*s + d - m0) - (a0 - a1)*((n0 - n1)*s + d - n0))*((n0 - n1)*((n0 - n1)*s - (b0 - b1)*t + b0 - n0) + (m0 - m1)*((m0 - m1)*s - (a0 - a1)*t + a0 - m0)) = 0
(a0 + (a1 - a0)*t - c)*(n0 + (n1 - n0)*s -d) - (b0 +(b1 - b0)*t - d)*(m0 + (m1 - m0)*s -d) = 0
s
中的
t
和
g
的系数不为零。)结果很冗长。
g(s,t) = 0
上是二次方的。这非常适合二进制搜索,它具有快速收敛且不需要任何平方根的额外好处。
关于math - 2d线段上的最近点,穿过第三2d线段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20270150/
对不起我的英语不好,我来自意大利XD 我用一个简单的图形选择完成了 Frog 游戏:带有大量更新标签的网格布局。它工作得很好。我可以设置图标而不是标签,但现在我想更好地佩戴它,我的老师告诉我从 QGr
我是一名优秀的程序员,十分优秀!