对于非复杂多边形,它非常简单:
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))。
答案 0 :(得分:0)
根据this link,您所说明的公式为凸多边形的 ,但您提供的示例似乎不是。
P.S。而不是2D数组,请考虑使用以下内容以获得更好的可读性。
struct Point{
double x,y;
};
Point point[210];
...
a += point[i].x * point[i+1].y;
答案 1 :(得分:0)
该公式适用于简单多边形(那些不是自相交),凸或不。请注意,它计算多边形的签名区域。如果(简单)多边形顺时针方向,使用该公式计算的面积将为负。
对于非简单多边形,公式计算多边形的所有简单组件的有符号区域的总和。您的示例组件具有自交叉,实际上它的一个组件(三角形)对该区域贡献两倍。