2009-08-07 74 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)