定義
兩個向量的叉積寫作a×b,可以定義為
a×b=absinθn
其中θ表示a和b之間的角度(0°≤θ≤180°)。它位於這兩個矢量所定義的平面上。而n是一個與a、b所在平面均垂直的單位矢量。矢量叉積是計算幾何算法的核心部分,具有重要的幾何意義。
一、計算多邊形面積
設多邊形有n個頂點V0(X0, Y0), V1(X1, Y1)... Vn-1(Xn-1, Yn-1),從原點O(0,0)與每條邊做三角形,計算的面積和就是多邊形面積。三角形面積可以用叉積計算,比如OV0V1面積為:
S0=0.5*OV0×OV1=0.5*(X0Y1-X1Y0)
於是多邊形面積總和為:
S= 0.5*(X0Y1-X1Y0 + X1Y2-X2Y1 +… + Xn-1Y0-X0Yn-1)
= 0.5*( X0Y1-X1Y0+X0Y0-X1Y1 + X1Y2-X2Y1+X1Y1-X2Y2 +… Xn-1Y0-X0Yn-1+Xn-1Yn-1-X0Y0)
= 0.5*(Yi+Yi+1)(Xi-Xi+1) i=0...n-1
二、判斷兩線段是否相交
判斷線段是否相交一般分兩步進行:
1. 快速排斥
設有線段P1P2和Q1Q2,以線段 P1P2 為對角線的矩形為R, 以線段 Q1Q2 為對角線的矩形為T,如果R和T不相交,顯然兩線段不會相交,否則進入第二步。
2. 跨立實驗
如果兩線段相交,那么兩線段必然相互跨立對方。即
P1, P2分別在Q1Q2兩邊 :
(P1-Q1)×(Q2-Q1)*(P2-Q1)×(Q2-Q1)<=0
Q1, Q2分別在P1P2兩邊:
(Q1-P1)×(P2-P1)*(Q2-P1)×(P2-P1) <=0
上面跨立實驗需要4次叉積和兩次乘法運算,可以這樣改進:
如下圖,Q1Q2在P1P2左邊,
此時(Q1-Q2)×(P2-P1)與(P1-Q1)×(Q1-Q2)異號,
當Q1Q2向右移動后,如圖所示,
(Q1-Q2)×(P2-P1)與(P1-Q1)×(Q1-Q2)同號,而且(P1-Q1)×(Q1-Q2)/(Q1-Q2)×(P2-P1),剛好等於|P1O|/|P1P2|,由此關系還可以計算交點的位置。
Q1Q2繼續右移,如圖所示:
交點超出P2,(P1-Q1)×(Q1-Q2)/(Q1-Q2)×(P2-P1)>1
因此,若P1 , P2跨立在Q1Q2,則有
(P1-Q1)×(Q1-Q2)/(Q1-Q2)×(P2-P1)在[0, 1]范圍內。
同理,若Q1, Q2跨立P1P2,則有
(P2-P1)×(P1-Q1)/(Q1-Q2)×(P2-P1)在[0, 1]范圍內。
這樣只需要3次叉積運算就能算出線段是否相交,而且還可以順便得到相交點的位置!
參考: