閑聊叉積在計算幾何中一些作用


定義

兩個向量的叉積寫作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左邊,

繪圖3

此時(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次叉積運算就能算出線段是否相交,而且還可以順便得到相交點的位置!

 

參考:

http://zh.wikipedia.org/wiki/%E5%8F%89%E7%A7%AF

http://dev.gameres.com/Program/Abstract/Geometry.htm


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM