【问题标题】:Calculating normal to line towards given side计算朝向给定侧的线的法线
【发布时间】:2015-02-22 23:54:49
【问题描述】:

Given 是一条线(段),由两个向量 start(x,y)end(x,y) 定义。我还有一个点p(x,y),它位于由线隔开的两个区域中的任何一个上(即它正好在线上)。

如何计算朝向p 所在一侧的线的法线?

【问题讨论】:

  • 你想要p到直线的最小距离吗?

标签: algorithm math geometry


【解决方案1】:

让:

A = (a,b) and B = (c,d) define the line segment
P = (p,q) be the other point.

定义:

dot( (p,q), (r,s) ) == p*r + q*s

然后是向量:

v = ( c-a, d-b)

定义沿线段的方向。它的垂线是:

u = (d-b, (-(c-a)) = (d-b,a-c)

这可以通过使用v 的点积来看出。要从垂线得到法线,只需除以其长度即可:

n = u /|u|, |u| = sqrt( dot(u,u))

我们现在只需要知道P 相对于法线的位置。如果我们采取:

dir = dot( (P-A), n) ) 

那么dir > 0 表示nP 方向相同,而dir < 0 表示方向相反。应该dir == 0,那么P其实就在延长线上(不一定是线段本身)。

【讨论】:

    【解决方案2】:

    首先,通过取end-startp-end 的叉积来确定点位于直线的哪一侧:

    z = (xend-xstart)(yp-yend) - (y end-ystart)(xp-xend)

    如果 z>0,则该点位于线的左侧(如站在 start 并面向 end 的人所见)。如果 z

    二、对线段进行归一化:

    S = 结束 - 开始
    k = S/ |S|

    最后,如果点在直线的左边,则向左旋转k

    (xk, yk) => (-yk, xk)

    或者如果点在直线的右边,则向右旋转k

    (xk, yk) => (yk, -xk)

    【讨论】:

      【解决方案3】:

      我的数学技能有点生疏,所以我不能给你确切的计算,但你做的是这个(假设你的描述是二维的):

      1. 首先计算一个正常的 n。
      2. 然后计算 P',它是点 P 在直线上的垂直投影。 基本上,您所做的是,您“创建”另一条线并使用步骤 1 中的向量 n 作为方向(y = p + x * n 其中 y,p 和 n 是向量,p 实际上是您的 p(x,y) 而 x 是一个实数),然后你将这条线与第一条线相交,它们相交的点是 P'。
        看到你来自奥地利,请大家原谅我用了一个德语单词,我真的不知道英文翻译也找不到。 P' = Lotfußpunkt
      3. 计算 P - P'。如果它在两个分量中都与 n 具有相同的符号,则 n 是您要搜索的法线。如果它有相反的符号,-n 就是你要搜索的那个。

      我希望这个想法是清楚的,即使我不知道所有的英文技术术语。

      【讨论】:

      • 您能否详细说明第 2 步?谢谢。
      • 刚刚更新了我的答案,希望它更清楚。除了第 3 步,您还可以求解第 2 步中的方程 x,如果 x 为负数,n 是您的答案,但是如果 x 是正数,-n 是您的答案。
      【解决方案4】:

      对于 开始 = (a,b) 结束 = (c,d) p = (x,y)

      坡度(起点)= (d - b) / (c - a)

      斜率(标准) = -(c - a) / (d - b)

      范数线必须包含 p = (x,y),所以

      ynorm = -((c - a) / (d - b)) * xnorm + (y + ((c - a) / (d - b)) * x)

      【讨论】:

      • 你最后一行xnorm的值是多少?
      • ynorm 和 xnorm 是法线方程中的变量
      【解决方案5】:

      y = mx + c

      是法线方程,其中 m 是斜率,c 是任意常数。

      你有开始和结束。让我们称它们为 (x1,y1) 和 (x2,y2) 以及连接它们的线 L1。 这条线的斜率 m1 为 (y2-y1)/(x2-x1)。这条线垂直于您需要的线,我们可以将其称为 L2,斜率为 m2。 2条相互垂直线的斜率的乘积是-1。因此, m1*m2=-1。

      因此您可以计算 m2。现在,您需要找到线 L2 的方程。您在 P (x,y) 线上有 1 个点。你可以用这种方式替换: y=m2*x+c。

      这会给你c。得到线方程后,可以将其转换为参数形式,如下所示:

      http://thejuniverse.org/PUBLIC/LinearAlgebra/LOLA/lines/index.html

      【讨论】:

        【解决方案6】:

        线的方程为

        A = start.y-end.y
        B = end.x-start.x
        C = start.x*end.y-start.y*end.x
        
        A*x + B*y + C = 0
        

        d 到点p=(px,py) 的直线的最小距离是

        d = (A*px+B*py+C)/sqrt(A^2+B^2)
        

        如果值为正,则该点从矢量(start->end) 逆时针旋转。如果为负,则为顺时针旋转。因此,如果(start->end) 指向上方,则直线左侧为正距离。

        例子

        start = (8.04, -0.18)
        end = (6.58, 1.72)
        P = (2.82, 0.66)
        A = (-0.18)-(1.72) = -1.9
        B = (6.58)-(8.04) = -1.46
        C = (8.04)*(1.72)-(-0.18)*(6.58) = 15.01
        d = (A*(2.82)+B*(0.66)+C)/√(A^2+B^2) = 3.63
        

        d 的计算显示与草图中矢量(near->P) 的长度相同。

        【讨论】:

          【解决方案7】:

          N = (Ey - Sy, Sx - Ex) 与直线垂直(SE 旋转了 90°,未归一化)。

          然后计算点积的符号

          N . SP = (Ey - Sy)(Px - Sx) + (Sx - Ex)(Py - Sy),
          

          它会告诉你法线指向哪一边。

          【讨论】:

            猜你喜欢
            • 2021-12-19
            • 2010-12-30
            • 2017-05-16
            • 2019-11-15
            • 2014-05-05
            • 2021-04-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多