答案 0 :(得分:1)
如果R
在通过P
(与P
不同)的法线上任何点,那么Pn
就是AB
和PR
相交。
生成点R
的一种方法是将段AB
旋转90度,然后进行翻译,使A
与P
重合。翻译的B
是您的R
:
Rx = Px + (By - Ay)
Ry = Py - (Bx - Ax)
一旦你得到了你的观点R
,它就会变成一个简单的line-line intersection problem,它将为你提供Pn
(对于垂直线的特定情况,可以简化公式)。 / p>
然后,您可以轻松检查Pn
与A
之间是否有B
。
PS 请注意@ MBo答案中提供的解决方案是一个更直接,更有效的解决方案(如果您结合并简化/优化我的答案所需的公式,您最终会到达同一件事情)。如果你已经已经计算两条线的交集的原始函数,我上面描述的内容可能很有意义,比如说,
find_intersection(Ax, Ay, Bx, By, Cx, Cy, Dx, Dy)
// Intersect AB and CD
在这种情况下,发现Pn
变成一个简单的单行
Pn = find_intersection(Ax, Ay, Bx, By, Px, Py, Px + (By - Ay), Py - (Bx - Ax))
但如果您没有掌握这种原始功能和/或注意提高代码效率,那么您可能希望选择更直接的专用计算序列,例如@ MBo&#中的计算序列39;答案。
答案 1 :(得分:1)
查找向量
AB = (B.X-A.X, B.Y-A.Y)
AP = (P.X-A.X, P.Y-A.Y)
将 P 投射到 AB 是:
APn = AB * (AB.dot.AP) / (AB.dot.AB);
其中.dot。是标量产品
坐标:
cf = ((B.X-A.X)*(P.X-A.X)+(B.Y-A.Y)*(P.Y-A.Y))/((B.X-A.X)^2+(B.Y-A.Y)^2)
if cf < 0 or cf > 1 then projection lies outside AB segment
Pn.X = A.X + (B.X-A.X) * cf
Pn.Y = A.Y + (B.Y-A.Y) * cf