2013-01-06 263 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

即式适用于简单多边形(那些都不怎么自相交),凸或没有。请注意,它计算了多边形的签名的区域。如果(简单)多边形为,则顺时针方向为,则使用该公式计算的面积将为负值。

对于非简单多边形,公式会计算多边形所有简单分量的有符号面积的总和。您的示例组件具有自交叉,实际上它的一个组件(三角形)对该区域贡献了两倍。