判斷多邊形邊界曲線順/逆時針 兩種方法


方法一: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:這里必須進行遍歷尋找凸點,否則若多邊形含有凹的部分,並且選取的點於凹部分中,會得到相反的結果。


免責聲明!

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



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