2009-08-07 547 views
139

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

我可以找到很多关于以3D做飞机的事情,但没有2D的东西。

请到容易对数学(链接到合作的例子,图表或算法,欢迎),我是一个程序员不止我一个数学家)

+2

如果你想知道这背后的“数学”,你可以在http://stackoverflow.com/a/7470098/189767查找我的答案。它基本上是一样的,但更精细。 – Andreas 2013-01-25 08:47:53

+1

这个问题是关于数学,而不是编程。 – Charlie 2015-10-06 02:41:32

+0

我正在投票结束这个题目,因为它是关于数学,而不是编程。 – Pang 2015-10-07 01:34:32

回答

194

如果我们定义DX = X2-X1和dy = Y2-Y1,则该法线(-dy,DX)和(DY,-dx)。

请注意,不需要划分,因此您不会冒被零除的风险。

+10

这很微妙,花了我一段时间才明白normal.x = -dy和normal.y = dx。我有他们反过来,因为它看起来像一个错误分配的X部分的Y值... – Piku 2009-08-07 13:10:28

+1

http://stackoverflow.com/a/7470098/183120更多的数学在此。 – legends2k 2013-01-25 08:13:40

+0

@OrenTrutner我还是不明白这一点; '(x',y')=(-y,x)'和'(x',y')=(y,-x)'似乎是正确的,但为什么要用'dx'和'dy'这里。此外,根据斜率,对于直角线,因此'dy'= dx'*(-dx/dy)'和'dx'= dy'*(-dy/dx)',m1 * m2 =你的方程如何进入'normal.x = x'= -dy'? – legends2k 2013-01-25 08:53:02

6
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为东西,如果你想从一个点你DEF传递INED

76

的另一种方式把它是计算的单位矢量对于给定的方向,然后应用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 

相同的结果之前给出,但具有多一点关于它来自哪里的解释。

+1

非常感谢,它是如何得到它的。 – legends2k 2013-01-25 08:19:10

+0

尽管我早些知道旋转公式,但通过这个答案,我脑海中点击的东西是角度是一个常数(+/- 90),它简化为x和y的简单否定和反转。 – legends2k 2013-01-25 08:26:58

+0

@duffymo结果有一个长度吗? – 2014-04-24 11:41:54

7

这个问题已发布很久以前,但我找到了一种替代方法来回答它。所以我决定在这里分享。
首先,必须知道:如果两个向量垂直,它们的点积等于零。
法向量(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)