hdu 2036(多边形面积)
/* 函数: 语法:result=polygonarea(Point *polygon,int N); 参数: *polygon: 多变形顶点数组 N: 多边形顶点数目 返回值: 多边形面积 注意: 支持任意多边形,凹、凸皆可 多边形顶点输入时按顺时针顺序排列 源程序: typedef struct { double x,y; } Point; double polygonarea(Point *polygon,int N) { int i,j; double area = 0; for (i=0;i<N;i++) { j = (i + 1) % N; area += polygon[i].x * polygon[j].y; area -= polygon[i].y * polygon[j].x; } area /= 2; return(area < 0 ? -area : area); } */ /* 有关资料证明: 正多边形内角计算公式与半径无关 要已知正多边形边数为N 内角和=180(N-2) 半径为R 圆的内接三角形面积公式:(3倍根号3)除以4再乘以R方 外切三角形面积公式:3倍根号3 R方 外切正方形:4R方 内接正方形:2R方 五边形以上的就分割成等边三角形再算 内角和公式——(n-2)*180` 我们都知道已知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" 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; }