检查boost中的面要素

时间:2014-10-02 12:43:04

标签: c++ boost boost-geometry

我最近尝试使用boost :: geometry库。我找到了下面的代码

#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point.hpp>
#include <boost/geometry/geometries/polygon.hpp>

#include <iostream>

namespace bg = boost::geometry;

int main(void)
{
    typedef bg::model::point<double, 2, bg::cs::cartesian> point;
    typedef bg::model::polygon<point> polygon;

    //! create a polygon
    polygon p;
    p.outer().push_back(point(0., 0.));
    p.outer().push_back(point(1., 0.));
    p.outer().push_back(point(1., 2.));
    p.outer().push_back(point(2., 3.));
    p.outer().push_back(point(0., 4.));

    //! display it
    std::cout << "generated polygon:" << std::endl;
    std::cout << bg::wkt<polygon>(p) << std::endl;

    return 0;
}

任何检查的想法:

  1. 这是一个简单的多边形吗?
  2. 方向是什么(顺时针方向,逆时针方向)
  3. 关闭了吗?
  4. 顺便说一句,我使用的是升级版1.53.0。

1 个答案:

答案 0 :(得分:1)

BG中Polygon的概念解释了大多数高层决策:

  

多边形是多边形是由 一个外部边界和零个或多个内部边界定义的平面 (OGC简单要素规范)。

     

因此,Boost.Geometry多边形的定义与例如Wiki,多边形没有孔。 Boost.Geometry的多边形是带或不带孔的多边形。 (没有孔的多边形是Boost.Geometry中的辅助几何体,并称为 。)

Ring下,我们发现:

  
      
  • traits::point_order可能会定义其点的顺序或方向,clockwisecounterclockwise
  •   
  • 可能有traits::closure专门化定义闭包,openclosed
  •   

Rules 下,您会找到问题的大多数答案:

  

除了对编译时进行检查的概念外,还有一些其他有效多边形必须满足的规则。这遵循opengeospatial规则(见上面的链接)。

     
      
  • 多边形是 简单几何对象 (另请参阅维基,但Boost.Geometry多边形中允许使用孔)。
  •   
  • 如果将ring_type下面的多边形定义为顺时针方向,则外环必须具有顺时针方向,并且任何内环必须反转为w.r.t.定义的方向(所以:逆时针方向为顺时针外圈)。如果ring_type是逆时针定义的,则反之亦然。
  •   
  • 如果将基础ring_type的多边形定义为闭合,则必须关闭所有环:第一个点必须在空间上等于最后一个点。
  •   
  • 内部是一个连接点集。
  •   
  • 不应该有自我交叉点,但允许自相切(在外部/内部环之间)(只要内部是连接点集。
  •   
  • 不应有切割线,尖刺或刺破。
  •   
  • 内圈应位于外圈内。内圈可能不在彼此之内。
  •   

请注意

  1. 您可以使用 boost::geometry::correct 来更正不符合上述所有要求的戒指/多边形。
  2. Boost 1.56.0添加了 boost::geometry::is_valid ,因此您可以验证几何的有效性。对于旧版本,请参阅例如的 polygons union using boost