zoukankan      html  css  js  c++  java
  • 计算几何 求多边形的重心

    任意多边形重心

     

       首先,我们从最简单的三角形入手, 三角形的重心就是三条中线的交点,他的位置是((x1 + x2 + x3) / 3 , (y1 + y2 + y3) / 3 ) (假设三角形三个点坐标分别为(x1, y1) ,

    (x2, y2), (x3, y3))。 那么, 对于 n 边的凸多边形, 我们总能把它分成不相交的 (n - 2) 个 三角形,并能求出各个重心。下面介绍几种求多边形重心的方法:

        线垂法:

         具体方法是:用细线提起该物体,在该物体上画细线的延长线,再移位用细线提起该物体,在该物体上画细线的延长线,两线的交叉点就是这一物体在这平面上的重心,        其它面同理.适用于实际测量中。


      定理法:(本人自己命名)
        定理1: 由两个图形A,B合并而成的一个图形C,则C的重心必在A的重心与B的重心连接的线段上。(注意,也适用于A B彼此分开,没有公共点的情形)
        定理2: 由两个A,B合并而成的一个图形C,A的重心为点a, B的重心为点b, C的重心为点c, A的面积为Sa, B的面积为Sb,则下面条件成立:
          (1)点c 必在线段 ab 上
          (2) ac * Sa = bc * Sb

      计算几何中:
        三角形的重心: x = (xa+xb+xc)/3,  y = (ya+yb+yc)/3;
        四边形的重心:作一对角线,将它分成两个三角形分别求出重心与面积 (x1,y1) ,s1 ; (x2, y2), s2 则该四边形的重心为: x = (x1*s1+x2*s2)/(s1+s2), y = (y1*s1+y2*s2)/(s1+s2);
        五边形则分为一个三角形与一个四边形……

        任意多边形中直接取任一点(一般为原点)把多边形分为n-2个三角形 分别求重心
          x=∑ si * xi / ∑si
          y=∑ si * yi / ∑si
          si 为每块三角形的有向面积 (就是叉积),叉积求解不懂可看:http://www.cnblogs.com/Duahanlang/archive/2013/05/11/3073434.html  里边有介绍。

    附上关键代码:( n 多边形的重心)

    View Code
     1 // x1~y3 分别为不同三个相邻点的坐标(相邻为了使三角形不重叠)
     2 double x1, y1, x2, y2, x3, y3;     //此处不用数组,只要迭代就可,节省空间
     3 double cx, cy;    //重心坐标
     4 double A;          // 有向面积之和
     5 double vs;        // 各个三角形有向面积
     6 cx = 0, cy = 0, A = 0;
     7 cin >> n;
     8 cin >> x1 >> y1 >> x2 >> y2;
     9 for(i = 2; i < n; ++i) {
    10        cin >> x3 >> y3;
    11        vs = (x2-x1) * (y3-y1) - (x3-x1) * (y2-y1);     //有向面积
    12      A += vs;
    13        cx += (x1+x2+x3)*vs, cy += (y1+y2+y3)*vs;
    14        x2 = x3, y2 = y3;                                 //此处迭代x2, y2, 固定点x1, y1
    15 }
    16 cx /= (3.0*A), cy /= (3.0*A);                   // 最后坐标

    练习: hdoj 1115
      链接:http://acm.hdu.edu.cn/showproblem.php?pid=1115

  • 相关阅读:
    [root@192 ~]# ls /etc/sysconfig/network-scripts
    解决unknown import path "golang.org/x/sys/unix": unrecognized import path "golang.org/x/sys"
    Centos 修改IP地址、网关、DNS
    Centos7 下安装golang
    yum国内镜像配置
    grep -R --include=*.log warning /var/log
    第五章 单例模式(待续)
    第四章 工厂模式(待续)
    第三章 装饰者模式(待续)
    第二章 观察者模式(待续)
  • 原文地址:https://www.cnblogs.com/Duahanlang/p/3074339.html
Copyright © 2011-2022 走看看