zoukankan      html  css  js  c++  java
  • 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 ",s);
        }
        return0;
    }
  • 相关阅读:
    HDU 1501 Zipper(DFS)
    HDU 2181 哈密顿绕行世界问题(DFS)
    HDU 1254 推箱子(BFS)
    HDU 1045 Fire Net (DFS)
    HDU 2212 DFS
    HDU 1241Oil Deposits (DFS)
    HDU 1312 Red and Black (DFS)
    HDU 1010 Tempter of the Bone(DFS+奇偶剪枝)
    HDU 1022 Train Problem I(栈)
    HDU 1008 u Calculate e
  • 原文地址:https://www.cnblogs.com/wlxtuacm/p/5712292.html
Copyright © 2011-2022 走看看