【发布时间】:2015-02-22 23:54:49
【问题描述】:
Given 是一条线(段),由两个向量 start(x,y) 和 end(x,y) 定义。我还有一个点p(x,y),它位于由线隔开的两个区域中的任何一个上(即它不正好在线上)。
如何计算朝向p 所在一侧的线的法线?
【问题讨论】:
-
你想要p到直线的最小距离吗?
Given 是一条线(段),由两个向量 start(x,y) 和 end(x,y) 定义。我还有一个点p(x,y),它位于由线隔开的两个区域中的任何一个上(即它不正好在线上)。
如何计算朝向p 所在一侧的线的法线?
【问题讨论】:
让:
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其实就在延长线上(不一定是线段本身)。
【讨论】:
首先,通过取end-start 和p-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)
【讨论】:
我的数学技能有点生疏,所以我不能给你确切的计算,但你做的是这个(假设你的描述是二维的):
y = p + x * n 其中 y,p 和 n 是向量,p 实际上是您的 p(x,y) 而 x 是一个实数),然后你将这条线与第一条线相交,它们相交的点是 P'。我希望这个想法是清楚的,即使我不知道所有的英文技术术语。
【讨论】:
对于 开始 = (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的值是多少?
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
【讨论】:
线的方程为
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) 的长度相同。
【讨论】:
N = (Ey - Sy, Sx - Ex) 与直线垂直(SE 旋转了 90°,未归一化)。
然后计算点积的符号
N . SP = (Ey - Sy)(Px - Sx) + (Sx - Ex)(Py - Sy),
它会告诉你法线指向哪一边。
【讨论】: