hdu2036

 

/*多边形面积公式:我们都知道已知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; 

}

你可能感兴趣的:(hdu2036)