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;
    }
  • 相关阅读:
    rally测试后生成的html报告,无法正常展示
    开机自动执行的脚本
    python设计模式-命令模式
    解决docker命令行终端显示不全的问题
    ansible简单入门
    python函数的执行过程
    rally task配置文件
    python调试工具remote_pdb
    rally使用tempest进行测试
    rally测试opentack------安装部署和简单实践
  • 原文地址:https://www.cnblogs.com/wlxtuacm/p/5712292.html
Copyright © 2011-2022 走看看