给出各顶点求多边形面积
输入数据包含多个测试实例,每个测试实例占一行,每行的开始是一个整数n(3<=n<=100),它表示多边形的边数(当然也是顶点数),然后是按照逆时针顺序给出的n个顶点的坐标(x1, y1, x2, y2... xn, yn),为了简化问题,这里的所有坐标都用整数表示。 输入数据中所有的整数都在32位整数范围内,n=0表示数据的结束,不做处理。
对于每个测试实例,请输出对应的多边形面积,结果精确到小数点后一位小数。
每个实例的输出占一行。
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
我用的方法是把多边形分成多个三角形求面积再求和
三角形面积用公式S^2=p(p-a)(p-b)(p-c)其中(p=a+b+c/2) a,b,c为三边
OJ上显示答案错误
#include<stdio.h>
#include<math.h>
double area(int a1,int a2,int b1,int b2,int c1,int c2);
double length(int a,int b,int c,int d);
int main()
{
int n,i,j;
double sum;
int point[100][2];
while(scanf("%d",&n)!=EOF)
{
sum=0;
if(n==0)
break;
else{
for(i=0;i<n;i++)
scanf(" %d %d",&point[i][0],&point[i][1]);
for(j=1;j<n-1;j++)
sum+=area(point[0][0],point[0][1],point[j][0],point[j][1],point[j+1][0],point[j+1][1]);
printf("%.1lf\n",sum);
}
}
}
double area(int a1,int a2,int b1,int b2,int c1,int c2)
{
double p;
p=(length(a1,a2,b1,b2)+length(b1,b2,c1,c2)+length(c1,c2,a1,a2))/2;
return sqrt(p*(p-length(a1,a2,b1,b2))*(p-length(b1,b2,c1,c2))*(p-length(c1,c2,a1,a2)));
}
double length(int a,int b,int c,int d)
{
return sqrt(((a-c)*(a-c)+(b-d)*(b-d))*1.0);
}