给出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;
}