zoukankan      html  css  js  c++  java
  • Gdal库计算形心方法。

    Gdal库计算形心方法。

    在Gdal库中计算形心的方法如下:

    int OGRGeometry::Centroid( OGRPoint *poPoint ) const

    其函数实现中,是调用的Geos库中的GEOSGetCentroid()方法,最终在Geos的bool

    Geometry::getCentroid(Coordinate& ret) const函数中创建了CentroidArea对象,并将几何对象添加进去,获取到其形心。代码如下:

    CentroidArea cent;

    cent.add(this);

    if ( ! cent.getCentroid(c) )

    return false;

    可见,关键就是这个类CentroidArea。

    返回的形心坐标结果:

    ret = Coordinate(cg3.x/3.0/areasum2, cg3.y/3.0/areasum2);

    计算流程:

    此类的方法add添加几何对象,最终会执行如下步骤(略去内环考虑):

    void

    CentroidArea::addShell(const CoordinateSequence *pts)

    {

    bool isPositiveArea=!CGAlgorithms::isCCW(pts);

    std::size_t const n=pts->getSize()-1;

    for(std::size_t i=0; i<n; ++i)

    {

    addTriangle(basePt, pts->getAt(i), pts->getAt(i+1), isPositiveArea);

    }

    addLinearSegments(*pts);

    }

    函数中的basePt被初始化为环的第一个点。

    如代码所述,依次将每一个点加进类中,调用私有方法addTriangle ,其代码如下:

    CentroidArea::addTriangle(const Coordinate &p0, const Coordinate &p1,

    const Coordinate &p2, bool isPositiveArea)

    {

    double sign=(isPositiveArea)?1.0:-1.0;

    centroid3(p0,p1,p2,triangleCent3);

    double area2res=area2(p0,p1,p2);

    cg3.x+=sign*area2res*triangleCent3.x;

    cg3.y+=sign*area2res*triangleCent3.y;

    areasum2+=sign*area2res;

    }

    成员属性cg3和areasum2得到了值。

    其中area2res和triangleCent3计算如下:

    double CentroidArea::area2(const Coordinate &p1, const Coordinate &p2, const Coordinate &p3)

    {

    return (p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y);

    }

    计算的是面积的2倍。

    void CentroidArea::centroid3(const Coordinate &p1, const Coordinate &p2,

    const Coordinate &p3, Coordinate &c)

    {

    c.x=p1.x+p2.x+p3.x;

    c.y=p1.y+p2.y+p3.y;

    }

    c的xy除以3的话就是p1,p2,p3的均值了。

    还有其他分支,似是一些备选,这里略过了。

    所以是相当遍历所有点,将环的0点和当前点及当前点的下一个点构成一个三角形,进行累计计算。对于每一步:

    clip_image002

    clip_image004

    clip_image006

    clip_image008

    clip_image010

    clip_image012

    wiki上的多边形形心计算公式:

    一个由N个顶点xi , yi确定的不自交闭多边形的中心能如下计算: [4]

    记号 xN , yN与顶点 x0 , y0相同。多边形的面积为:

    clip_image013

    多边形的中心由下式给出:

    clip_image014

    clip_image015

    以面积中心来求:

    面积中心和质量中心非常类似,面积中心只取决于图形的几何形状。如果物体是均匀的,质量中心将位于面积中心

    对于两部分组成的图形,将有如下等式:

    clip_image016

    clip_image017是特定部分的面积中心到所选参考系的距离。clip_image018是特定部分的面积。

    当一个复杂几何图形可以分成一些已知的简单几何图形时,先计算各部分的面积中心,然后通过下面一般的公式计算整个图形的面积中心:

    clip_image019

    clip_image020

    这里从y-轴到中心的距离是clip_image021,从x-轴到中心的距离是clip_image017[1],中心的坐标是clip_image022

    http://zh.wikipedia.org/wiki/%E5%87%A0%E4%BD%95%E4%B8%AD%E5%BF%83

  • 相关阅读:
    mysql 中 时间函数 now() current_timestamp() 和 sysdate() 比较
    在spring boot 中使用itext和itextrender生成pdf文件
    dockerfile构建的镜像
    在linux环境下使用itext生成pdf
    在spring data jpa中使用自定义转换器之使用枚举转换
    Sping Boot返回Json格式自定义
    【强化学习RL】model-free的prediction和control — MC, TD(λ), SARSA, Q-learning等
    【强化学习RL】必须知道的基础概念和MDP
    【GAN与NLP】GAN的原理 —— 与VAE对比及JS散度出发
    【NLP】使用bert
  • 原文地址:https://www.cnblogs.com/xiarl/p/4494233.html
Copyright © 2011-2022 走看看