给定是一条线(线段),由两个向量start(x,y)
和end(x,y)
定义。我还有一个点p(x,y)
,它位于由线条分隔的两个区域中的任意一个区域(即, >完全在线上)。
如何计算面向p
所在一侧的线的法线?
答案 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
表示n
与P
方向相同,而dir < 0
表示方向相反。应该dir == 0
,然后P
实际上是在扩展行上(不一定是行段本身)。
答案 1 :(得分:1)
首先,通过取end-start
和p-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):
y = p + x * n
其中y,p和n是向量,p实际上是你的p(x,y)和x是实数),然后你将这条线与第一条线相交,它们相交的点是P'
看到你来自奥地利,其他人请原谅我使用一个德语单词,我真的不懂英语翻译,也找不到。 P'=Lotfußpunkt我希望这个想法很清楚,即使我不懂所有英文技术术语。
答案 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)
指向上方,那么正距离就在该行的左侧。
实施例
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),
它会告诉你法线正指向哪一侧。