/*多边形面积公式:我们都知道已知A(x1,y1)、B(x2,y2)、C(x3,y3)三点的面积公式为
|x1 x2 x3|
S(A,B,C) = |y1 y2 y3| * 0.5 = [(x1-x3)*(y2-y3) - (x2-x3)*(y1-y3)]*0.5
|1 1 1 |
(当三点为逆时针时为正,顺时针则为负的)
对多边形A1A2A3、、、An(顺或逆时针都可以),设平面上有任意的一点P,则有:
S(A1,A2,A3,、、、,An)
= abs(S(P,A1,A2) + S(P,A2,A3)+、、、+S(P,An,A1))
P是可以取任意的一点,用(0,0)时就是下面的了:
设点顺序 (x1 y1) (x2 y2) ... (xn yn)
则面积等于
|x1 y1| |x2 y2| |xn yn|
0.5 * abs( | | + | | + ...... + | | )
|x2 y2| |x3 y3| |x1 y1|其中
|x1 y1|
| |=x1*y2-y1*x2
|x2 y2|
因此面积公式展开为:
|x1 y1| |x2 y2| |xn yn|
0.5 * abs( | | + | | + ...... + | | )=0.5*abs(x1*y2-y1*x2+x2*y3-y2*x3+...+xn*y1-yn*x1)
|x2 y2| |x3 y3| |x1 y1| */
#include<stdio.h>
#include<math.h>
void main()
{
int num;
double sum,x0,y0,x1,y1,x2,y2;
for(;scanf(" %d",&num) != EOF && num != 0 ;)
{
sum=0.0;
--num;
scanf(" %lf %lf",&x0,&y0);
for(x1=x0,y1=y0; num-- && scanf(" %lf %lf",&x2,&y2) != EOF ;)
{
sum+=x1*y2-x2*y1;
x1=x2;
y1=y2;
}
sum+=x2*y0-y2*x0;
printf("%.1lf\n",0.5*abs(sum));
}
}
/*
002
003 函数:
004 语法:result=polygonarea(Point *polygon,int N);
005
006 参数:
007 *polygon: 多变形顶点数组
008 N: 多边形顶点数目
009 返回值: 多边形面积
010
011 注意:
012 支持任意多边形,凹、凸皆可
013 多边形顶点输入时按顺时针顺序排列
014
015 源程序:
016
017 typedef struct {
018 double x,y;
019 } Point;
020
021 double polygonarea(Point *polygon,int N)
022 {
023 int i,j;
024 double area = 0;
025
026 for (i=0;i<N;i++) {
027 j = (i + 1) % N;
028 area += polygon[i].x * polygon[j].y;
029 area -= polygon[i].y * polygon[j].x;
030 }
031
032 area /= 2;
033 return(area < 0 ? -area : area);
034 }
035 */
036
037 /*
038
039 有关资料证明:
040
041 正多边形内角计算公式与半径无关
042 要已知正多边形边数为N 内角和=180(N-2)
043
044 半径为R
045 圆的内接三角形面积公式:(3倍根号3)除以4再乘以R方
046 外切三角形面积公式:3倍根号3 R方
047 外切正方形:4R方
048 内接正方形:2R方
049 五边形以上的就分割成等边三角形再算
050 内角和公式——(n-2)*180`
051 我们都知道已知A(x1,y1)、B(x2,y2)、C(x3,y3)三点的面积公式为
052 |x1 x2 x3|
053 S(A,B,C) = |y1 y2 y3| * 0.5 = [(x1-x3)*(y2-y3) - (x2-x3)*(y1-y3)]*0.5
054 |1 1 1 |
055 (当三点为逆时针时为正,顺时针则为负的)
056
057 对多边形A1A2A3、、、An(顺或逆时针都可以),设平面上有任意的一点P,则有:
058 S(A1,A2,A3,、、、,An)
059 = abs(S(P,A1,A2) + S(P,A2,A3)+、、、+S(P,An,A1))
060
061
062 P是可以取任意的一点,用(0,0)时就是下面的了:
063
064
065 设点顺序 (x1 y1) (x2 y2) ... (xn yn)
066 则面积等于
067 |x1 y1| |x2 y2| |xn yn|
068 0.5 * abs( | | + | | + ...... + | | )
069 |x2 y2| |x3 y3| |x1 y1|
070
071
072 其中
073 |x1 y1|
074 | |=x1*y2-y1*x2
075 |x2 y2|
076 因此面积公式展开为:
077
078 |x1 y1| |x2 y2| |xn yn|
079 0.5 * abs( | | + | | + ...... + | | )=0.5*abs(x1*y2-y1*x2+x2*y3-y2*x3+...+xn*y1-yn*x1)
080 |x2 y2| |x3 y3| |x1 y1|
#include "stdio.h"
double S(int x[],int y[],int n)
{
int i,j;
double s=0;
for(i=0;i<n;i++){
j=(i+1)%n;
s+=x[i]*y[j];
s-=x[j]*y[i];
}
s/=2;
return s>0?s:-s;
}
int main()
{
int n,i;
int x[100],y[100];
double s;
while(scanf("%d",&n)!=EOF&&n)
{
for(i=0;i<n;i++)
scanf("%d%d",&x[i],&y[i]);
s=S(x,y,n);
printf("%.1lf\n",s);
}
return 0;
}