計算幾何-通過叉積判斷向量旋轉方向
今天刷cf的時候看到一道凸包的裸(其實並不裸)題。但是我發現我不會求凸包,所以我就是學習了一下Graham掃描法。學到一半發現我不會判斷向量的旋轉方向,於是我又去學習了一下叉乘。作為蒟蒻的我看了半天看不懂,所以我決定寫一個連我這樣的蒟蒻都能看得懂的便於理解的指北(霧)。
先上結論:對於兩根向量a(x1,y1),b(x2,y2),如果a X b = x1*y2-x2*y1<0,那麼順時針轉,反之逆時針轉。
先求表示式,首先我們有定義 a X b = |a| * |b| * sin< a,b >
令i,j為一組互相垂直的基向量,不妨令他們分別於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向下走的傾向。我們不管說先向右再向下,還是先向下再向右,都可以描述為一種順時針運動的傾向
方便起見,我們定義CWi為向量i的順勢。
因為向量a插在向量b的尾巴上,所以如果CWb>CWa,說明b比a順時針運動的傾向大,所以b是在a的基礎上向右偏轉了,vice verse。
有了這個旋轉方向的判斷之後,就可以確定下一個點是在前面的邊的左邊還是右邊了。呢。