Algorithm 计算朝向给定侧的线的法线

Algorithm 计算朝向给定侧的线的法线,algorithm,math,geometry,Algorithm,Math,Geometry,给定的是一条直线(段),由两个向量定义start(x,y)和end(x,y)。我还有一个点p(x,y),它位于直线分隔的两个区域中的任何一个(即不在直线上) 我如何计算直线朝向p所在侧的法线?我的数学技能有点生疏,因此我无法给出准确的计算结果,但您要做的是(假设您描述的是2D): 首先你计算一个正常的n 然后计算P',它是点P在直线上的垂直投影。 基本上,你要做的是,你“创建”另一条线,并使用步骤1中的向量n作为方向(y=p+x*n其中y,p和n是向量,p实际上是你的p(x,y),x是实数),然

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


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

我的数学技能有点生疏,因此我无法给出准确的计算结果,但您要做的是(假设您描述的是2D):

  • 首先你计算一个正常的n
  • 然后计算P',它是点P在直线上的垂直投影。 基本上,你要做的是,你“创建”另一条线,并使用步骤1中的向量n作为方向(
    y=p+x*n
    其中y,p和n是向量,p实际上是你的p(x,y),x是实数),然后你将这条线与第一条线相交,它们相交的点是p'。
    既然你是奥地利人,其他人请原谅我用了一个德语单词,我真的不知道英文翻译,也找不到。P'=Lotfußpunkt
  • 计算P-P′。如果它在两个组件中的符号与n相同,则n是您正在搜索的正常值。如果它有相反的符号,-n是您要搜索的符号 我希望这个想法很清楚,尽管我不知道所有的英语专业术语。

    开始=(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)

    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
    表示
    n
    p
    方向相同,而
    dir<0
    表示方向相反。如果
    dir==0
    ,则
    P
    实际上位于延长线上(不一定是线段本身)。

    首先,通过取

    结束-开始
    结束
    的叉积,确定点位于线的哪一侧:

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

    如果z>0,则该点位于直线的左侧(由站在起点并面向终点的人看到)。如果z(-yk,xk)

    或者,如果该点位于直线的右侧,则向右旋转k:

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

    y=mx+c

    是法线方程,其中m为斜率,c为任何常数

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

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

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


    直线方程如下所示

    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

    d = (A*px+B*py+C)/sqrt(A^2+B^2)
    
    如果该值为正值,则该点从矢量
    (开始->结束)
    逆时针旋转。如果为负数,则为顺时针旋转。因此,如果
    (开始->结束)
    指向上,则直线左侧的距离为正

    范例

    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
    的计算显示了与草图中向量
    (近->p)
    长度相同的值。

    N=(Ey-Sy,Sx-Ex)
    垂直于直线(它是
    SE
    旋转90°,未标准化)

    然后计算点积的符号

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

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

    你能详细说明一下第2步吗?谢谢。刚刚更新了我的答案,希望能更清楚。代替第3步,您也可以从第2步为x求解方程,如果x为负,n为您的答案,但是如果x为正,-n为您的答案。最后一行中
    xnorm
    的值是多少?ynorm和xnorm是法线方程中的变量您希望p到直线的最小距离是多少?