用叉乘法求任意多边形的面积
#include<stdio.h>
#include<math.h>
#include<algorithm>
#define PI 3.1415926
typedef struct ver
{
double x,y,theta;
};
ver vertex[101];
bool compare(ver a,ver b)
{
return a.theta<b.theta;
}
double angle(double x,double y) //先求矢量的角度
{
double theta;
theta=atan2(y,x);
while(theta>PI)
theta-=PI*2;
while(theta<-PI)
theta+=PI*2;
return theta;
}
double polygonarea(int N) //点排顺序后然后求面积
{
int i,j;
double area=0;
for(i=0;i<N;i++)
{
j=(i+1)%N;
area+=vertex[i].x*vertex[j].y; //叉乘法
area-=vertex[i].y*vertex[j].x;
}
area/=2;
return (area<0?-area:area);
}
int main()
{
int N;
while(scanf("%d",&N)!=EOF)
{
int i;
for(i=0;i<N;i++)
{
scanf("%lf%lf",&vertex[i].x,&vertex[i].y);
vertex[i].theta=angle(vertex[i].x,vertex[i].y);
}
std::sort(vertex,vertex+N,compare);
printf("%.1lf\n", polygonarea(N));
}
return 0;
}
范围:
支持任意多边形,凹凸皆可
多边形的顶点输入按顺时针或者逆时针排列(注意这个条件一定要满足)
如上可以先求两矢量的角度,然后再进行排序,用sort函数即可,大小排都行,只要是有序的