【发布时间】:2016-05-12 21:47:13
【问题描述】:
【问题讨论】:
-
您有 2 个答案,愿意接受吗?
标签: geometry line point normals
【问题讨论】:
标签: geometry line point normals
如果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 的答案中提供的解决方案更直接、更有效(如果您结合并简化/优化我的答案所需的公式,您最终会得到相同的结果) .如果您已经有一个计算两条线交点的原始函数,我上面描述的内容可能很有意义,例如,
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 的答案中的计算序列。
【讨论】:
寻找向量
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
【讨论】: