如何计算线段的法线向量?


176

假设我有一个从(x1,y1)到(x2,y2)的线段。如何计算垂直于线的法向矢量?

我可以找到很多有关在3D平面上执行此操作的内容,但没有2D内容。

请轻松学习数学(欢迎链接到工作示例,图表或算法),我是程序员,而不是数学家;)


2
并且,如果您想了解其背后的“原理”,可以在stackoverflow.com/a/7470098/189767上查找我的答案。基本上是相同的,但是更加详尽。
Andreas

2
这个问题是关于数学的,而不是编程的。
查理

1
我投票结束这个题为离题的问题,因为它是关于数学而不是编程的。
庞(Pang)

Answers:


236

如果我们定义dx = x2-x1和dy = y2-y1,则法线为(-dy,dx)和(dy,-dx)。

请注意,不需要除法,因此您没有被零除的风险。


14
这非常微妙,花了我一段时间才意识到normal.x = -dy和normal.y = dx。我有另一种选择,因为这看起来像是将x部分分配给y值的错字...
Piku 2009年

@OrenTrutner我还是不明白。(x', y') = (-y, x)(x', y') = (y, -x)似乎是正确的,但为什么会一个使用dxdy在这里。此外,基于斜率,m1 * m2 = -1对于直角线,因此dy' = dx' * (-dx/dy)dx' = dy' * (-dy/dx),您的方程式怎么来normal.x = x' = -dy
legends2k

1
您能否简要介绍一下三角洲在这里的作用?我确定我在这里遗漏了一些东西。
legends2k

7
@ legends2k:增量是切向量。法线是垂直于切线的方向。如果您看一下90度旋转的2D矩阵,则将x / y值翻转并取反很明显:en.wikipedia.org/wiki/Rotation_matrix#Basic_rotations
geon

@geon:啊!知道了,我将斜率与增量混淆了,而在仿射几何中,两点之间的差是一个矢量,在这里的切线:)
legends2k 2013年

95

另一种考虑方法是计算给定方向的单位矢量,然后逆时针旋转90度以获得法向矢量。

通用2D转换的矩阵表示如下:

x' = x cos(t) - y sin(t)
y' = x sin(t) + y cos(t)

其中(x,y)是原始矢量的分量,而(x',y')是变换后的分量。

如果t = 90度,则cos(90)= 0且sin(90)=1。将其代入并乘以得到:

x' = -y
y' = +x

与之前给出的结果相同,但是对其来源有更多解释。


2
多亏了我,我对如何获得它感到头疼。
legends2k 2013年

1
尽管我较早知道旋转公式,但通过这个答案,在我的脑海中咔嗒一声的是该角度是一个常数(+/- 90),这使其简化为x和y的简单取反和反转。
legends2k

@duffymo结果的长度是否为一?
Martin Meeser 2014年

如果向量在变换之前被归一化,那么它将在变换之后保持不变。您必须在执行旋转变换之前或之后进行标准化。
duffymo

11

这个问题已经发布很久了,但是我找到了另一种答案。所以我决定在这里分享。
首先,必须知道:如果两个向量垂直,则它们的点积等于零。
法线向量(x',y')垂直于连接(x1,y1)和的线(x2,y2)。这条线的方向(x2-x1,y2-y1)是或(dx,dy)
所以,

(x',y').(dx,dy) = 0
x'.dx + y'.dy = 0

满足上述方程式的对(x',y')足够多。但是,最好的一对总是满足或者是(dy,-dx)(-dy,dx)


7
m1 = (y2 - y1) / (x2 - x1)

如果垂直于两条线:

m1*m2 = -1

然后

m2 = -1 / m1 //if (m1 == 0, then your line should have an equation like x = b)

y = m2*x + b //b is offset of new perpendicular line.. 

b是要从定义的点传递的东西

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.