检查boost中的多边形特征



我最近尝试开发boost::几何体库。我在下面找到了代码

#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. 它关闭了吗

顺便说一句,我使用的是增强版1.53.0。

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

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

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

Ring下,我们发现:

  • traits::point_order可能有一个特殊化,定义了其点clockwisecounterclockwise的顺序或方向
  • 可能存在定义闭包的traits::closure的专门化openclosed

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

除了对编译时间进行检查的Concepts之外,有效多边形还必须满足其他一些规则。这遵循开放地理空间规则(请参见上面的链接)。

  • 多边形是简单的几何对象(另请参见wiki,但Boost.Geometry多边形中允许有洞)
  • 如果ring_type下的多边形定义为顺时针,则外部环必须具有顺时针方向,并且任何内部环都必须相对于定义的方向反转(因此:顺时针外部环为逆时针方向)。如果ring_type是逆时针定义的,则反之亦然
  • 如果ring_type下的多边形定义为闭合,则所有环都必须闭合:第一个点必须在空间上等于最后一个点
  • 内部是一个连接的点集
  • 不应存在自相交,但允许自相切(外部/内部环之间)(只要内部是连接点集即可)
  • 不应有切割线、尖刺或穿孔
  • 内环应位于外环内。内环可能不位于彼此内部

注意

  1. 可以使用boost::geometry::correct更正不符合上述所有要求的环形/多边形
  2. Boost 1.56.0添加了boost::geometry::is_valid,以便验证几何体的有效性。对于旧版本,请参见使用boost的多边形并集

最新更新