http://acm.hdu.edu.cn/showproblem.php?pid=2036
求多边形的面积,可以套用公式,但这里使用递归来解
#include<iostream>
using namespace std;
struct Position{
int x; //x坐标
int y; //y坐标
};
//叉积
int cross(Position p1,Position p2,Position p3){
int x1=p2.x-p1.x;
int x2=p3.x-p2.x;
int y1=p2.y-p1.y;
int y2=p3.y-p2.y;
int c=x1*y2-x2*y1;
if(c>=0) return 1; //凸
else return 0; //凹
}
//根据坐标计算面积
//参数:3个坐标
//返回值:面积
float CalTriangleArea(Position p1,Position p2, Position p3)
{
int x1=p1.x,y1=p1.y,x2=p2.x,y2=p2.y,x3=p3.x,y3=p3.y;
float s = ((x3-x1)*(y2-y1) - (x2-x1)*(y3-y1))/2.0;
return s>0 ? s : -s;
}
float caculate(Position pos[],int length,float area){
Position p1=pos[0];
Position p2=pos[1];
Position p3=pos[2];
//若这是个凸三角形,则加上其面积
if(!cross(p1,p2,p3)){
area-=CalTriangleArea(p1,p2,p3);
}
//若这是个凹三角形,则减去其面积
else area+=CalTriangleArea(p1,p2,p3);
if(length==3)
return area;
pos[1]=pos[2];
int k=2; //应替换的顶点的指针,每次计算过多边形分割出的三角形后,其第二个顶点就可以删除
int i;
for(i=3;i<length;i+=2){
if(i==length-1){
p1=p3;p2=pos[i];
p3=pos[0];
if(!cross(p1,p2,p3))
area-=CalTriangleArea(p1,p2,p3);
else area+=CalTriangleArea(p1,p2,p3);
}
else{
p1=p3;p2=pos[i];
p3=pos[i+1];
if(!cross(p1,p2,p3))
area-=CalTriangleArea(p1,p2,p3);
else area+=CalTriangleArea(p1,p2,p3);
pos[k]=p3;k=k+1;
}
}
if(k>=3)
return caculate(pos,k,area);
else return area;
}
int main(){
int n;
Position pos[102];
while(cin>>n&&n){
int i;
for(i=0;i<n;i++){
cin>>pos[i].x>>pos[i].y;
}
printf("%.1f",caculate(pos,n,0));
cout<<endl;
}
return 0;
}