沿法线延伸穿过另一点的直线查找点

Find point along line where normal extends through another point

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

如果R是通过P的法线上的任意点(不同于P),则PnABPR 相交的点。

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

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

一旦你有了你的观点 R,它就变成了一个简单的 line-line intersection problem,这将给你你的 Pn(可以针对垂直线的特定情况简化公式) .

然后你可以很容易地检查Pn是否在AB之间。

P.S. 请注意,@MBo 的答案中提供的解决方案是一种更直接、更有效的解决方案(如果您结合 simplify/optimize 所需的公式对于我的回答,你最终会得出同样的结果)。如果您 已经有了 计算两条线交点的原始函数,例如

,那么我上面描述的内容可能很有意义
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))

但是如果您没有这样的原始函数供您使用 and/or 关心使您的代码更高效,那么您可能想要选择更直接的专用计算序列,例如 @ 中的计算序列MBo的回答。

查找向量

AB = (B.X-A.X, B.Y-A.Y)
AP = (P.X-A.X, P.Y-A.Y)

PAB 的投影是:

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