[GIS算法] 多边形的面积 - 由N个点构成的简单多边形 - C语言

版权声明:本文为博主原创文章,若有错误之处望大家批评指正!转载需附上原文链接,谢谢! https://blog.csdn.net/summer_dew/article/details/84394303

【题目】计算由N个点构成的简单多边形的面积
注意:不考虑可能存在的边的自相交以及岛、洞等复杂情况

方法一:向量叉乘

  1. 向量叉乘可以计算平行四边形的面积 -> 可以计算三角形的面积
  2. 向量叉乘具有方向 -> 用来计算多边形的面积

【算法】

  1. 遍历多边形的点集得到,得到点A
  2. 获得A的下一个点B
  3. 计算OAB的面积, S O A B = 0.5 O A O B S_{OAB} = 0.5 * \overrightarrow{OA}*\overrightarrow{OB}
  4. 把全部area相加
  5. 【注意】对于多边形点集ABCD的最后一个点D,它的下一个点即是点A(多边形是闭合的)

【公式】 a r e a = 0.5 i = 1 l e n ( p [ i ] . x p [ i + 1 ] . y p [ i ] . y p [ i + 1 ] . x ) area = 0.5*\sum_{i=1}^{len}(p[i].x*p[i+1].y - p[i].y*p[i+1].x)

  1. p[]:多边形点集数组(从1开始存储)、len为数组的长度
  2. p[len+1]即是p[1],对于多边形点集ABCD的最后一个点D,它的下一个点即是点A(多边形是闭合的)

【相关文章】

  1. 向量介绍
  2. 具体推导
#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);
}

猜你喜欢

转载自blog.csdn.net/summer_dew/article/details/84394303