zoukankan      html  css  js  c++  java
  • hdu-1115 计算几何 求重心 凸多边形 面积

    思想是分割成三角形,然后求三角形的重心。那么多边形重心就是若干个三角形的重心带权求中心,可以用质点质心公式。

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <cstring>
    #define LL int
    const LL mod=1000000000;
    const LL N=1000006;
    LL dp[N];
    LL bit[22];
    using namespace std;
    
    struct Point
    {
        double x,y;
    };//约定传入点的vector包含n+1个点,最后一个点与第一个点等值(模拟闭合圈)
    int n;
    double Area(vector<Point> va)
    {
        double rec=0;
        for(int i=0;i<va.size()-1;i++)
            rec+=va[i].x*va[i+1].y-va[i+1].x*va[i].y;
        rec*=0.5;
        return rec;
    }
    Point GrvCenter(vector<Point> va)
    {
        Point rec;
        rec.x=0,rec.y=0;
        double area=Area(va);//每个三角形在总面积中的权重
        for(int i=0;i<va.size()-1;i++)
            rec.x+=(va[i].x+va[i+1].x)*(va[i].x*va[i+1].y-va[i+1].x*va[i].y);
        for(int i=0;i<va.size()-1;i++)
            rec.y+=(va[i].y+va[i+1].y)*(va[i].x*va[i+1].y-va[i+1].x*va[i].y);
        rec.x/=area*6;
        rec.y/=area*6;
        return rec;
    }
    int main()
    {
        cin.sync_with_stdio(false);
        int t;
        int n;
        scanf("%d",&t);
        while(t--)
        {
            vector<Point> va;
            scanf("%d",&n);
            for(int i=0;i<n;i++)
            {
                Point x;
                scanf("%lf %lf",&x.x,&x.y);
                va.push_back(x);
            }
            va.push_back(*va.begin());
            printf("%.2f %.2f
    ",GrvCenter(va).x,GrvCenter(va).y);
        }
    }
  • 相关阅读:
    spring
    23种设计模式
    get getline
    ping
    Android四大组件
    C++数据结构
    玩转windows便签
    [JavaScript]再谈 this
    [JavaScript]面向对象编程浅析之XJB讲
    [JavaScript]MVC浅析
  • 原文地址:https://www.cnblogs.com/LukeStepByStep/p/7743454.html
Copyright © 2011-2022 走看看