方法一:Green公式
Green公式揭示了平面區域的二重積分和封閉曲線上的線積分的關系。
其中L+表示沿着封閉區域的邊界曲線正向。
並且由Green公式的推導過程我們知道:
這里若L=-y,可以保證(1)式子在區域中恆正,且等於封閉區域面積。
同理,M=x,也可以保證(2)式子在區域中恆正,且等於封閉區域面積。
所以我們只需沿着多邊形的邊求曲線積分,若積分為正,則是沿着邊界曲線正方向(逆時針),反之為順時針,且所得絕對值為多邊形面積。
NOTE:邊界曲線的正向即沿着邊界曲線,單連通區域總在邊界曲線的左邊。(這里邊界曲線正向,即我們所看到的逆時針方向)
這里假設我們程序中的多邊形點為(x0,y0), (x1,y1), (x2,y2), . . . (xn-1,yn-1)
我們來計算沿着點(x0,y0), (x1,y1), (x2,y2), . . . (xn-1,yn-1)的曲線積分。
其中對於每段分割線段,y取( yn + yn+1) / 2 , dx=xn+1 - xn
d=0; for(int i=0;i<n-1;i++) { d+= -0.5*(y[i+1]+y[i])*(x[i+1]-x[i]); } if(d>0) std::cout<<"counter clockwise"<<std::endl; else std::cout<<"clockwise"<<std::endl;
方法二:端點判斷
這個方法比較簡單,遍歷所有點,找到x最大的點Pm(該點一定在最右端曲線的“凸起”部分上),然后取該點前后各一個點Pm-1、Pm+1,組成向量(Pm-1,Pm)、(Pm,Pm+1)。然后進行向量叉乘即可判斷出順時針或逆時針。
如圖,規定向量叉乘使用“右手定則”
+表示該點Pm和前后兩個點組成的兩個向量(Pm-1,Pm)、(Pm,Pm+1),叉乘得到的向量指向z軸負方向;
-表示(Pm-1,Pm)x(Pm,Pm+1)得到的向量指向z軸方向。
NOTE:這里必須進行遍歷尋找凸點,否則若多邊形含有凹的部分,並且選取的點於凹部分中,會得到相反的結果。