计算朝向给定侧的法线

时间:2015-02-22 23:54:49

标签: algorithm math geometry

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

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

7 个答案:

答案 0 :(得分: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实际上是在扩展行上(不一定是行段本身)。

答案 1 :(得分:1)

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

z =(x end -x start )(y p -y end ) - (y <子>端 -y <子>启动)(X <子> p -x <子>端

如果z> 0,则该点位于该行的左侧(由站在开始且面向结束的人看到)。如果z <0,则该点位于该行的右侧。

其次,规范化线段:

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

最后,如果该点位于该行的左侧,则向左旋转 k

(x k ,y k )=&gt; (-y k ,x k

或如果该点位于该行的右侧,请向右旋转 k

(x k ,y k )=&gt; (y k , - x k

答案 2 :(得分:0)

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

  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是您要搜索的符号。
  4. 我希望这个想法很清楚,即使我不懂所有英文技术术语。

答案 3 :(得分:0)

有关 start =(a,b) 结束=(c,d) p =(x,y)

斜率(startend)=(d - b)/(c - a)

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

标准线必须包括p =(x,y),所以

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

答案 4 :(得分:0)

y = mx + c

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

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

因此你可以计算m2。现在,您需要找到L2线的等式。你在P(x,y)行中有1个点。您可以这样替换: Y =平方米* X + C。

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

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

答案 5 :(得分:0)

该行的等式以

给出
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)指向上方,那么正距离就在该行的左侧。

实施例

geo

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)的长度相同的值。

答案 6 :(得分:0)

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

然后计算点积的符号

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

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