1. 程式人生 > >計算幾何-通過叉積判斷向量旋轉方向

計算幾何-通過叉積判斷向量旋轉方向

今天刷cf的時候看到一道凸包的裸(其實並不裸)題。但是我發現我不會求凸包,所以我就是學習了一下Graham掃描法。學到一半發現我不會判斷向量的旋轉方向,於是我又去學習了一下叉乘。作為蒟蒻的我看了半天看不懂,所以我決定寫一個連我這樣的蒟蒻都能看得懂的便於理解的指北(霧)。

先上結論:對於兩根向量a(x1,y1),b(x2,y2),如果a X b = x1*y2-x2*y1<0,那麼順時針轉,反之逆時針轉。

先求表示式,首先我們有定義 a X b = |a| * |b| * sin< a,b >
ij為一組互相垂直的基向量,不妨令他們分別於x,y軸平行,那麼有:

a X b = (x1* i + y1* j) * (x2* i + y2* j)

展開,化簡得(由sin0=0,有i X i = 0):

(x1* i + y1* j) * (x2* i + y2* j)= (x1*y2 * i X j) + (x2*y1 * j X i)

由sin< a,b > = - sin< b,a >,有

(x1*y2 * i X j) + (x2*y1 * j X i) = x1*y2-x2*y1

即:

a X b = x1*y2-x2*y1

然後我們會發現,x1表示向量a向右走的傾向,y2表示向量b向上走的傾向。考慮到a,b地位是等價的,價值是相反的,可以認為y2表示向量a向下走的傾向。我們不管說先向右再向下,還是先向下再向右,都可以描述為一種順時針運動的傾向

,我們定義x1*y2為向量a的順勢。那麼對應的,不難得出x2*y1為向量b的順勢

方便起見,我們定義CWi為向量i的順勢。

因為向量a插在向量b的尾巴上,所以如果CWb>CWa,說明b比a順時針運動的傾向大,所以b是在a的基礎上向右偏轉了,vice verse。

有了這個旋轉方向的判斷之後,就可以確定下一個點是在前面的邊的左邊還是右邊了。呢。