求解任意多边形面积

给出n个点在直角坐标系下的坐标(x,y),求解由n个点构成多边形的面积

通常求解多边形的面积会转化为求解n-2个三角形面积和

但是这样免不了繁琐的算法,编程复杂度和时间复杂度都很差。
根据矢量叉乘的几何意义 矢量A与矢量B的矢量积是一个矢量,其模等于由A和B作成的平行四边形的面积,下面给出一个公式。

要先将点按逆时针顺序排序极点排序

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct Point{    
	double x,y;
	Point(){}
	Point(double xx,double yy){
		x=xx;
		y=yy;
	}
};
Point arr[2005];
double operator *(Point a,Point b){  //叉乘 
	return a.x*b.y-a.y*b.x;
}
double compare(Point a,Point b,Point c){  //计算极角 
	Point A(b.x-a.x,b.y-a.y);
	Point B(c.x-a.x,c.y-a.y);
	return A*B;
}
bool cmp(Point b,Point c){  
	Point a(0,0);
	if(compare(a,b,c)==0) return b.x<c.x;
	return compare(a,b,c)>0;
}
int main(){
    int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	  	scanf("%lf%lf",&arr[i].x,&arr[i].y);
	sort(arr+1,arr+n+1,cmp);    //按极角逆时针排序 
	double area=0;
	for(int i=1;i<=n;i++)
	   area+=(arr[i]*arr[i==n?1:i+1]/2.0);
	printf("%.2lf",area);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/islittlehappy/article/details/81358926