沿法线延伸穿过另一点的直线查找点
Find point along line where normal extends through another point
给定线段 AB,如何找到 AB 的法线通过点 P 的点 Pn?我还需要知道是否没有法线通过该点(例如点Q)。
如果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
(可以针对垂直线的特定情况简化公式) .
然后你可以很容易地检查Pn
是否在A
和B
之间。
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)
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
给定线段 AB,如何找到 AB 的法线通过点 P 的点 Pn?我还需要知道是否没有法线通过该点(例如点Q)。
如果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
(可以针对垂直线的特定情况简化公式) .
然后你可以很容易地检查Pn
是否在A
和B
之间。
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)
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