zoukankan      html  css  js  c++  java
  • hdu 1115 多边形重心

    求多边形重心的题目大致有这么几种:

    1,质量集中在顶点上。n个顶点坐标为(xi,yi),质量为mi,则重心
      X = ∑( xi×mi ) / ∑mi
      Y = ∑( yi×mi ) / ∑mi
      特殊地,若每个点的质量相同,则
      X = ∑xi / n
      Y = ∑yi / n

    2,质量分布均匀。这个题就是这一类型,算法和上面的不同。
      特殊地,质量均匀的三角形重心:
      X = ( x0 + x1 + x2 ) / 3
      Y = ( y0 + y1 + y2 ) / 3

    3,质量分布不均匀。只能用积分来算,不会……

    下面讨论这个题的解法:

    以第一个顶点为基准,分别连接p[i],p[i+1],1<i<n。将多边形划分为若干个三角形。

    若我们求出了每个三角形的重心和质量,可以构造一个新的多边形,顶点为所有三角形的重心,顶点质量为三角形的质量。这个新多边形的质量和重心与原多边形相同,即可使用第一种类型的公式计算出整个多边形的重心。

    由于三角形的面积与质量成正比,所以我们这里用面积代替质量来计算。

    现在有个问题就是,多边形有可能为凹多边形,三角形有可能在多边形之外。如何处理这种情况呢?

    很简单,我们使用叉积来计算三角形面积,当三角形在多边形之外时,得到“负面积”就抵消掉了。
    S =( x0*y1 + x1*y2 + x2*y0
    - x1*y0 - x2*y1 - x0*y2 ) /2;

    注: 以上内容为转载,我的代码如下,因为不知道怎么损失了精度,无奈下写成下面那样,居然过了~

    /*
    * hdu1115/win.cpp
    * Created on: 2011-10-10
    * Author : ben
    */
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <iostream>
    #include <queue>
    using namespace std;

    inline double area(double x0, double y0, double x1, double y1, double x2,
    double y2) {
    return (x0 * y1 + x1 * y2 + x2 * y0 - x1 * y0 - x2 * y1 - x0 * y2) / 2;
    }

    int main() {
    #ifndef ONLINE_JUDGE
    freopen("data.in", "r", stdin);
    #endif
    int T, N;
    double x0, y0, x1, y1, x2, y2;
    double summ, sumxm, sumym, tempm;
    scanf("%d", &T);
    while (T--) {
    scanf("%d", &N);
    summ = sumxm = sumym = 0;
    scanf("%lf%lf%lf%lf", &x0, &y0, &x1, &y1);
    for (int i = 2; i < N; i++) {
    scanf("%lf%lf", &x2, &y2);
    tempm = area(x0, y0, x1, y1, x2, y2);
    sumxm += (x0 + x1 + x2) / 3 * tempm;
    sumym += (y0 + y1 + y2) / 3 * tempm;
    summ += tempm;
    x1 = x2;
    y1 = y2;
    }
    printf("%.2f %.2f\n", sumxm / summ + 0.00001, sumym / summ + 0.00001);
    }
    return 0;
    }



  • 相关阅读:
    LeetCode-434-字符串中的单词数
    LeetCode-415-字符串相加
    字符串
    序列
    元组
    列表
    repr()与str的区别
    输出函数print()
    输入函数input()
    MySQL中快速复制数据表方法汇总
  • 原文地址:https://www.cnblogs.com/moonbay/p/2205398.html
Copyright © 2011-2022 走看看