沿着法线延伸到另一个点的线找到点

时间:2016-05-12 21:47:14

标签: geometry line point normals

给定线段AB,如何找到点P n ,其中AB的法线经过点P?我还需要知道是否没有正常值通过该点(例如点Q)。

Line's normal through point

2 个答案:

答案 0 :(得分:1)

如果R在通过P(与P不同)的法线上任何点,那么Pn就是ABPR相交。

生成点R的一种方法是将段AB旋转90度,然后进行翻译,使AP重合。翻译的B是您的R

Rx = Px + (By - Ay)
Ry = Py - (Bx - Ax)

一旦你得到了你的观点R,它就会变成一个简单的line-line intersection problem,它将为你提供Pn(对于垂直线的特定情况,可以简化公式)。 / p>

然后,您可以轻松检查PnA之间是否有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