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;

}

 

你可能感兴趣的:(HDU)