hdoj2036

/*
 
  函数:
        语法: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"
doubleS(int x[],int y[],intn)
{
    inti,j;
    doubles=0;
    for(i=0;i<n;i++){
        j=(i+1)%n;
        s+=x[i]*y[j];
        s-=x[j]*y[i];
    }
    s/=2;
    returns>0?s:-s;
}
int main()
{
    intn,i;
    intx[100],y[100];
    doubles;
    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);
    }
    return0;
}
posted @ 2015-12-25 19:55  adfae  阅读(194)  评论(0编辑  收藏  举报