多边形面积计算 |
由于多边形可以分解为多个三角形来计算,因此首先讨论三角形面积问题。 假设三角形三个顶点坐标为 (x1, y1), (x2, y2), (x3, y3) 则三角形的面积可以由以下的行列式计算 | x1, y1, 1 | 这个行列式也可以排成它的转置形式,即x排成一行,y排成一行,1 排成一行(行列式与它的转置行列式相等) 行列式性质一:任意调换行列式的两行(列),行列式的值变换符号。 这是个很重要的性质,我们就是利用这一点来计算有向三角形的面积。假设三角形的三个顶点按逆时针方向,按上面的行列式计算出的值为正,若为顺时针方向计算出的面积为负。三角形方向变换时,实际上是调换了上面这个行列式的两行。利用这个性质还可以判断指定点在有向线段的哪一侧或是否在线段确定的直线上。 现在我们回到多边形面积的问题上。我们可以将多边形的每一条边看作首尾相连的环形有向线段,然后在多边形所在平面上任取一点,该点与多边形的每一条边构成一个有向三角形,所有有向三角形的面积之和的绝对值就是多边形的面积。 参考示图 对于点在多边形内部时,这个是显然的。当点在多边形外部时我们直观的感觉是计算出的面积会变大。但由于我们计算的是有向三角形的面积,当点在多边形外面时必然有部分三角形与其它三角形相反,正好抵消多出来的面积。且对凹多边形也同样适用。 特殊地,当点在多形的一条边上或与某个顶点重合时也不影响 (行列式性质二:任意两行(列)完全相同或成比例时,行列式的值为零)。 根据前面的分析,下面用 C 语言给出计算函数
// 点结构
typedef struct { double x; double y; } POINT;
double TriangleArea(POINT p1, POINT p2, POINT p3) // 计算多边形面积(给定的顶点序列必须能组成多边形)
double PolyArea(POLY *poly)
{ POINT p0 = { 0.0, 0.0 }; double area = 0.0; for(int i=0; i<poly->count; ++i) area += TriangleArea(p0, poly->acmes[i], poly->acmes[i+1]); return area > 0.0 ? area : -area; } 测试: 测试代码(VC6): #include <stdio.h> void main(int argc, char *argv[]) FILE * fp = fopen("Poly.txt", "r"); while(1) { if(poly.count <= 0) // 最后一个顶点与第一个顶点重合 area = PolyArea(&poly); // 释放空间 输出结果如下: 150.000000 |