【问题标题】:Find point along line where normal extends through another point沿法线延伸穿过另一点的线查找点
【发布时间】:2016-05-12 21:47:13
【问题描述】:

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

【问题讨论】:

  • 您有 2 个答案,愿意接受吗?

标签: geometry line point normals


【解决方案1】:

如果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 的答案中提供的解决方案更直接、更有效(如果您结合并简化/优化我的答案所需的公式,您最终会得到相同的结果) .如果您已经有一个计算两条线交点的原始函数,我上面描述的内容可能很有意义,例如,

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 的答案中的计算序列。

【讨论】:

    【解决方案2】:

    寻找向量

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-16
      • 2016-05-18
      • 1970-01-01
      • 2013-01-18
      • 2015-05-13
      • 1970-01-01
      相关资源
      最近更新 更多