2014-01-24 51 views
2

早上好! 我必須使用python來計算多邊形的面積。 做到這一點的公式由(對不起,不能發佈的圖片的又一..)給出Python - 不規則多邊形區域會導致負值?

(X * Y - ý * X )+(X * Y - ý * X )+ ... +(X n-1個 * Y - ý n-1個 * X )


這是我想出了的代碼。然而,它會導致(正確)負值,我不知道爲什麼。 簡單地乘以面積時間-0.5還是有我的代碼有問題是有效的? 任何幫助非常感謝!

polygon = [[0,0],[-1,5],[2,3],[1,5],[3,6],[4,5],[5,3],[8,-2],[4,-4],[2,-5]] 
area = 0.0 

n = len(polygon) 
for i in range(n): 
    i1 = (i+1)%n 
    area += polygon[i][0]*polygon[i1][1] - polygon[i1][0]*polygon[i][1]  
area *= 0.5 
print 'area = ', area 
+1

我想你會發現結果的標誌只是取決於你是順時針還是逆時針旋轉點。所以,只要拿出結果的abs(),你就會好起來的。 – Duncan

回答

5

該公式通過計算構成多邊形的線段的原點和每個端點之間的每對矢量的叉積的和來工作。本質上,該面積按下圖中綠色和紅色三角形面積之差計算。 (請注意,紅色三角形部分位於綠色的下面。)

illustration

叉積的符號取決於載體,即取向如果能夠使第二矢量與所述第一對準通過左轉或右轉。因此,根據多邊形中的點是順時針還是逆時針排列,您將得到負面或正面區域。解決方案是正確的,但您需要將abs()函數應用於結果,因爲您不需要該符號。

+0

感謝您的澄清! – user3232357

2

最終答案的標誌是基於多邊形的方向。您可以通過在給定示例中採用多邊形的反向列表來檢查它。

polygon = [[0,0],[-1,5],[2,3],[1,5],[3,6],[4,5],[5,3],[8,-2],[4,-4],[2,-5]] 
polygon.reverse() 
... 

在這種情況下,你會發現該區域是積極的,認爲它本質上是相同的多邊形。

你可以閱讀更多關於爲什麼方向使區域消極here

你只需要取最終結果的絕對值。

print 'area = ', abs(area)