zoukankan      html  css  js  c++  java
  • hdu1115(重力算法的多边形中心)

    标题的含义:

    给定一个n刚n顶点。这是获得n分众协调多边形。

    http://acm.hdu.edu.cn/showproblem.php?

    pid=1115


    题目分析:

    /**

     *出处:http://blog.csdn.net/ysc504/article/details/8812339

     *①质量集中在顶点上
     *  n个顶点坐标为(xi,yi)。质量为mi,则重心
     * X = ∑( xi×mi ) / ∑mi
     * Y = ∑( yi×mi ) / ∑mi
     * 特殊地。若每一个点的质量同样。则
     * X = ∑xi / n
     * Y = ∑yi / n
     *②质量分布均匀
     * 特殊地。质量均匀的三角形重心:
     * X = ( x0 + x1 + x2 ) / 3
     * Y = ( y0 + y1 + y2 ) / 3
     *③三角形面积公式:S =  ( (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1) ) / 2 ;
     *做题步骤:1、将多边形切割成n-2个三角形。依据③公式求每一个三角形面积。
     *            2、依据②求每一个三角形重心。
     *            3、依据①求得多边形重心。
    **/

    如今根据此算法给出两种代码,一种是将n个点。以当中一个点为标准。分成n-2个三角形。再进行求重心。

    还有一种是以原点为根据分成n+1个三角形,再进行求重心。


    AC代码:

    第一种代码:

    #include<iostream>
    #include<cmath>
    #include<cstdio>
    using namespace std;
    struct Point{
     double x,y;
    };
    double Area(Point p1,Point p2,Point p3){//叉乘求三角形面积
        return ((p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y))/2;
    }
    int main()
    {
        int n,t;
        scanf("%d",&t);
        while(t--){
            scanf("%d",&n);
            Point p1,p2,p3;
            double gx,gy,sumarea;
            gx=gy=sumarea=0;
            scanf("%lf%lf%lf%lf",&p1.x,&p1.y,&p2.x,&p2.y);
            for(int i=2;i<n;i++){//分成n-2个三角形
                scanf("%lf%lf",&p3.x,&p3.y);
                double area=Area(p1,p2,p3);//单个三角的面积
                gx+=(p1.x+p2.x+p3.x)*area;//重心乘以其权值(面积),由于每个都要除以3,所医院放在最后
                gy+=(p1.y+p2.y+p3.y)*area;
                sumarea+=area;//计算全部权值
                p2=p3;//替换p2,计算下一个三角形
            }
            gx=gx/sumarea/3;//求的多边形重心
            gy=gy/sumarea/3;
            printf("%.2lf %.2lf ",gx,gy);
        }
        return 0;
    }

    另外一种代码:

    #include<iostream>
    #include<cmath>
    #include<cstdio>
    using namespace std;
    struct Point{
     double x,y;
    }p[10005];
    double Area(Point p1,Point p2,Point p3){//叉乘求三角形面积
        return ((p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y))/2.0;
    }
    int main()
    {
        int n,t;
        Point p0;
        p0.x=p0.y=0.0;
        scanf("%d",&t);
        while(t--){
            scanf("%d",&n);
            double gx,gy,sumarea,area;
            gx=gy=sumarea=0;
            for(int i = 0; i < n; ++i)
                scanf("%lf%lf", &p[i].x, &p[i].y);
            for(int i=1;i<=n;i++){
                area=Area(p0,p[i%n],p[i-1]);//与原点单个三角的面积
                gx+=(p[i%n].x+p[i-1].x)*area;//重心乘以其权值(面积),由于每个都要除以3,所医院放在最后
                gy+=(p[i%n].y+p[i-1].y)*area;
                sumarea+=area;//计算全部权值
            }
            gx=gx/(sumarea*3);//求的多边形重心
            gy=gy/(sumarea*3);
            printf("%.2lf %.2lf ",gx,gy);
        }
        return 0;
    }


    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    利用SOLR搭建企业搜索平台 之——Solr索引基本操作
    利用SOLR搭建企业搜索平台 之——solr配置solrconfig.xml
    利用SOLR搭建企业搜索平台 之——模式配置Schema.xml
    利用SOLR搭建企业搜索平台 之——solr的查询语法
    利用SOLR搭建企业搜索平台 之——MultiCore
    利用SOLR搭建企业搜索平台 之——配置文件
    利用SOLR搭建企业搜索平台 之——运行solr
    iOS masonry设置控件的优先级
    iOS label通过内容获取高度
    iOS textField的一些奇怪问题
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4821976.html
Copyright © 2011-2022 走看看