zoukankan      html  css  js  c++  java
  • POJ 3855 计算几何·多边形重心

    思路:

    多边形面积->任选一个点,把多边形拆成三角,叉积一下

    三角形重心->(x1+x2+x3)/3,(y1+y2+y3)/3

    多边形重心公式题目中有,套一下就好了

    计算多边形重心方法:

    (1)划分多边形为三角形:
    以多边形的一个顶点V为源点(V可取输入的第一个顶点),作连结V与所有非相邻顶点的线段,即将原N边形或分为(N-2)个三角形;
    (2)求每个三角形的重心和面积:
    设某个三角形的重心为G(cx,cy),顶点坐标分别为A1(x1,y1),A2(x2,y2),A3(x3,y3),则有cx = (x1 + x2 + x3)/3.同理求得cy。求面积的方法是s =  ( (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1) ) / 2,当A1,A2,A3顺时针排列时取-,否则取正(此定理不证)。事实上,在求每个三角形时不需要辨别正负,之后有方法抵消负号,见下述。
    (3)求原多边形的重心:
    公式:cx = (∑ cx[i]*s[i]) / ∑s[i];  cy = (∑ cy[i]*s[i] ) / ∑s[i];其中(cx[i], cy[i]), s[i]分别是所划分的第i个三角形的重心坐标和面积。由题“ connect the points in the given order”知每个s[i]的正负号相同,故而∑ cx[i]*s[i]能与∑s[i]消号,所以根本不需要在第(2)步判断每个s[i]的正负。另外,在(2)中求每个重心坐标时要除以3,实际上不需要在求每个三角形坐标时都除以3,只需要求出∑ cx[i]*s[i]后一次性除以3即可。即是多边形重心坐标变为:cx = (∑ cx[i]*s[i]) / (3*∑s[i]);  cy = (∑ cy[i]*s[i] ) / (3*∑s[i]);

    https://blog.csdn.net/nhl19961226/article/details/68941585

    //By SiriusRen
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    int n,cases;double S,ts;
    struct P{double x,y;}p[105],ans;
    P operator-(P a,P b){P c;c.x=a.x-b.x,c.y=a.y-b.y;return c;}
    double operator*(P a,P b){return a.x*b.y-a.y*b.x;}
    int main(){
        while(scanf("%d",&n)&&n){
            S=ans.x=ans.y=0;
            for(int i=0;i<n;i++)scanf("%lf%lf",&p[i].x,&p[i].y);
            for(int i=0;i<n;i++){
                ts=p[i]*p[(i+1)%n];S+=ts;
                ans.x+=ts*(p[i].x+p[(i+1)%n].x)/3;
                ans.y+=ts*(p[i].y+p[(i+1)%n].y)/3;
            }printf("Stage #%d: %lf %lf
    ",++cases,ans.x/S,ans.y/S);
        }
    }
  • 相关阅读:
    514.栅栏染色
    OOM的起点到终点
    OOM的起点到终点
    2019 Android 高级面试题总结 从java语言到AIDL使用与原理 ...
    2019 Android 高级面试题总结 从java语言到AIDL使用与原理 ...
    Vue 结合 echarts 原生 html5 实现拖拽排版报表系统
    Vue 结合 echarts 原生 html5 实现拖拽排版报表系统
    Python一行代码获得IP地址
    Python一行代码获得IP地址
    记一次Pinpoint监控工具部署过程
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/9383323.html
Copyright © 2011-2022 走看看