2014-01-24 52 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)