zoukankan      html  css  js  c++  java
  • hdu_1115_Lifting the Stone(求多边形重心)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1115

    题意:给你N个点围成的一个多边形,让你求这个多边形的重心。

    题解:

    将多边形划分为若干个三角形。
    若我们求出了每个三角形的重心和质量,可以构造一个新的多边形,顶点为所有三角形的重心,顶点质量为三角形的质量。这个新多边形的质量和重心与原多边形相同,即可使用第一种类型的公式计算出整个多边形的重心。
    由于三角形的面积与质量成正比,所以我们这里用面积代替质量来计算。
    
    多边形有可能为凹多边形,三角形有可能在多边形之外。如何处理这种情况呢?
    很简单,我们使用叉积来计算三角形面积,当三角形在多边形之外时,得到“负面积”就抵消掉了
    (注意的是精度问题,将所有的除法最后算,这样能防止精度丢失)
     1 #include<cstdio>
     2 
     3 struct node{int x,y;}a,b,c;
     4 int t,n;double s1,s2,s3,s4;
     5 
     6 double s(node x,node y,node z){return (double)(x.x*y.y+y.x*z.y+z.x*x.y-y.x*x.y-z.x*y.y-x.x*z.y)/2;}
     7 
     8 int main(){
     9     scanf("%d",&t);
    10     while(t--){
    11         s1=s2=s3=s4=0;
    12         scanf("%d",&n),scanf("%d%d",&a.x,&a.y),scanf("%d%d",&b.x,&b.y);
    13         for(int i=2;i<n;i++)
    14         scanf("%d%d",&c.x,&c.y),s1=s(a,b,c),s2+=s1,s3+=(a.x+b.x+c.x)*s1,s4+=(a.y+b.y+c.y)*s1,b=c;
    15         printf("%.2lf %.2lf
    ",s3/s2/3,s4/s2/3);
    16     }
    17     return 0;
    18 }
    View Code
    
    
    
  • 相关阅读:
    Pyecharts之平行坐标系(Parallel)
    Pyecharts之饼图(Pie)
    Pyecharts之仪表盘(Gauge)
    Tri-Training: Exploiting Unlabeled Data Using Three Classifiers
    A web crawler design for data mining
    Toward Scalable Systems for Big Data Analytics: A Technology Tutorial (I
    Learning with Trees
    Markov Random Fields
    Data storage on the batch layer
    Galaxy Classification
  • 原文地址:https://www.cnblogs.com/bin-gege/p/5696138.html
Copyright © 2011-2022 走看看