检查boost中的面要素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了检查boost中的面要素相关的知识,希望对你有一定的参考价值。

我最近尝试使用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. 它关闭了吗?

顺便说一句,我使用的是升级版1.53.0。

答案

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

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

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

Ring下,我们发现:

  • 可能有traits::point_order的特化定义其点的顺序或方向,clockwisecounterclockwise
  • 可能有traits::closure的特化定义封闭,openclosed

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

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

  • 多边形是简单的几何对象(另请参见wiki,但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

以上是关于检查boost中的面要素的主要内容,如果未能解决你的问题,请参考以下文章

使用 C++ 和 Boost(或不使用?)检查是不是正在使用特定端口?

拓扑检查的步骤

检查线程是不是为增强线程

SQL在数据检查中的应用

使用 Boost Graph [BGL] 检查在 add_edge 之前是不是已经存在顶点

检查 Boost Interprocess managed_shared_memory 是不是已经存在? [复制]