改革春风吹满地(链接)
Input
输入数据包含多个测试实例,每个测试实例占一行,每行的开始是一个整数n(3<=n<=100),它表示多边形的边数(当然也是顶点数),然后是按照逆时针顺序给出的n个顶点的坐标(x1, y1, x2, y2... xn, yn),为了简化问题,这里的所有坐标都用整数表示。
输入数据中所有的整数都在32位整数范围内,n=0表示数据的结束,不做处理。
输入数据中所有的整数都在32位整数范围内,n=0表示数据的结束,不做处理。
Output
对于每个测试实例,请输出对应的多边形面积,结果精确到小数点后一位小数。
每个实例的输出占一行。
每个实例的输出占一行。
Sample Input
3 0 0 1 0 0 1 4 1 0 0 1 -1 0 0 -1 0
Sample Output
0.5 2.0
求简单多边形面积 将多边形分割成多个三角形求其面积
三角形面积的计算公式有如下几种:
(1)

(2)

(3)
(其中,R是外接圆半径)

(4
)
(其中,R是外接圆半径)

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
// 点结构题定义
struct tpoint
{
double x,y;
tpoint(double x0=0,double y0=0):x(x0),y(y0){}
tpoint operator-(tpoint &b) const
{
return tpoint(x - b.x, y - b.y);
}
}p[110];
double cross(tpoint A, tpoint B)
{
return A.x*B.y - A.y*B.x;
}
//简单多边形面积,p[]为顶点集,按顺序存储,n为顶点数
double poly_are(tpoint p[],int n)
{
double ans = 0.00;
for(int i=1;i<n-1;i++)
ans += cross(p[i]-p[0],p[i+1]-p[0]);
return fabs(ans)/2.0;
}
//当所取点既不在圆内,也不是顶点,而是原点时
double poly_are1(tpoint p[],int n)
{
p[n] = p[0];
double ans = 0.00;
for(int i=0;i<n;i++)
ans += cross(p[i],p[i+1]);
return fabs(ans)/2.0;
}
int main()
{
int m;
double ans;
while(scanf("%d",&m),m)
{
for(int i=0;i<m;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
ans = poly_are(p,m);
printf("%.1lf\n",ans);
}
return 0;
}