版权声明:本文为博主原创文章,若有错误之处望大家批评指正!转载需附上原文链接,谢谢! https://blog.csdn.net/summer_dew/article/details/84394303
【题目】计算由N个点构成的简单多边形的面积
注意:不考虑可能存在的边的自相交以及岛、洞等复杂情况
方法一:向量叉乘
- 向量叉乘可以计算平行四边形的面积 -> 可以计算三角形的面积
- 向量叉乘具有方向 -> 用来计算多边形的面积
【算法】
- 遍历多边形的点集得到,得到点A
- 获得A的下一个点B
- 计算OAB的面积,
- 把全部area相加
- 【注意】对于多边形点集ABCD的最后一个点D,它的下一个点即是点A(多边形是闭合的)
【公式】
- p[]:多边形点集数组(从1开始存储)、len为数组的长度
- p[len+1]即是p[1],对于多边形点集ABCD的最后一个点D,它的下一个点即是点A(多边形是闭合的)
【相关文章】
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define EXP 1e-8 //精度
typedef struct point{
double x;
double y;
struct point *next;
}Point, *Polygon;
int InitPolygon(Polygon *p); //初始化多边形
double ComputePolygonArea(Polygon polygon); //计算多边形的面积
/*测试数据
// 第一组
11
0 0
1 2
2 1
3 2
4 2
5 3
6 0
3 1
2 0
0 0
// 第二组
11
0 0
1 2
2 1
3 2
4 2
5 3
6 0
3 1
2 0
1 1.5
0 0
// 第三组
5
0 0
1 0
1 1
0 1
0 0
*/
int main() {
Polygon P;
double area;
InitPolygon(&P);
printf("Polygon init success\n");
area = ComputePolygonArea(P);
printf("面积为%lf\n", area);
return 0;
}
// 返回1:创建成功
// 返回0:创建不成功,点没有闭合
int InitPolygon(Polygon *pHead) {
int n;
int i;
Point *p,*q;
double a,b;
double suba, subb;
do {
scanf("%d", &n);
} while (n<3); //点数要>=3
p = NULL;
for (i=0; i<n; i++) {
scanf("%lf%lf", &a, &b);
q = (Point *)malloc(sizeof(Point)); if (!q) exit(0);
q->x = a; q->y = b;
// 连接
if (p==NULL) { //第一个点
q->next = q; //循环队列
p = q;
*pHead = q;
} else {
suba = (*pHead)->x - a;
subb = (*pHead)->y - b;
if ( suba>=-EXP && suba<=EXP && subb>=-EXP && subb<=EXP) {//闭合 构造完成
free(q);
return 1;
}
p->next = q;
q->next = *pHead;
// 下一个
p = q;
}
}
return 0;
}
double ComputePolygonArea(Polygon polygon) { //计算多边形的面积
Point *p;
Point *A, *B;
double area = 0.0;
p = polygon;
do {
A = p;
B = p->next;
area += A->x*B->y - B->x*A->y;
p = p->next;
} while (p!=polygon);
return fabs(area/2);
}