2013-01-06 260 views
1

對於非複雜的多邊形,這是很簡單的:如何找到一個複雜的多邊形的面積 - C++

A = 1/2 * (x1*y2 - x2*y1 + x2*y3 - x3*y2 + ... + x(n-1)*yn - xn*y(n-1) + xn*y1 - x1*yn) 

這是我在C++實現:

struct Point { 
    double x, y; 
} point[210]; 

double area(int n) { 
    double a=0, b=0; 
    for(int i=0; i<n-1; ++i) { 
     a += point[i].x * point[i+1].y; 
     b += point[i].y * point[i+1].x; 
    } 
    return (a - b)/2; 
} 

但如果多邊形是複雜的?有沒有類似的方法找到它的區域?

注:我試圖使用相同的技術,但它沒有奏效。對於多邊形

(0,0) , (0,7) , (4,3) , (0,3) , (2,4) , (2,1) , (0, 0) 

上面的公式給我28.000,應該是26.000。我可以給出的唯一解釋是三角形(0,3),(2,4),(2,3)被計數兩次(點(2,3)是分段(0,3), (4,3)和(2,4),(2,1))。

+3

您正在使用的公式是用於非自相交多邊形,但是對於直線(4,3) - (0,3)和(2,4) - (2,1)有交點。對於自交界多邊形,您需要制定一個[決定](http://en.wikipedia.org/wiki/Polygon#Self-intersecting_polygons)如何處理交叉點。 – denahiro

回答

0

根據this link已示出的公式爲的凸多邊形,但你給的例子並不顯得之一。

p.s.不要使用2D數組,請考慮使用以下內容以獲得更好的可讀性。

struct Point{ 
    double x,y; 
}; 

Point point[210]; 

... 
a += point[i].x * point[i+1].y; 
+0

根據此:http://www.mathsisfun.com/geometry/area-irregular-polygons.html公式也可以用於非凸多邊形。 –

0

即式適用於簡單多邊形(那些都不怎麼自相交),凸或沒有。請注意,它計算了多邊形的簽名的區域。如果(簡單)多邊形爲,則順時針方向爲,則使用該公式計算的面積將爲負值。

對於非簡單多邊形,公式會計算多邊形所有簡單分量的有符號面積的總和。您的示例組件具有自交叉,實際上它的一個組件(三角形)對該區域貢獻了兩倍。