检查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.53.0。
答案
BG中Polygon
的概念解释了大多数高层决策:
多边形是多边形是由一个外部边界和零个或多个内部边界定义的平面表面(OGC简单特征规范)。
因此,Boost.Geometry多边形的定义与例如Wiki,多边形没有孔。 Boost.Geometry的多边形是带或不带孔的多边形。 (没有孔的多边形是Boost.Geometry中的辅助几何,并称为环。)
在Ring
下,我们发现:
- 可能有
traits::point_order
的特化定义其点的顺序或方向,clockwise
或counterclockwise
- 可能有
traits::closure
的特化定义封闭,open
或closed
在Rules
下,您将找到大多数问题的答案:
除了对编译时进行检查的概念外,还有一些其他有效多边形必须满足的规则。这遵循opengeospatial规则(见上面的链接)。
- 多边形是简单的几何对象(另请参见wiki,但Boost.Geometry多边形中允许使用孔)。
- 如果将ring_type下面的多边形定义为顺时针方向,则外环必须具有顺时针方向,并且任何内环必须反转为w.r.t.定义的方向(所以:逆时针方向为顺时针外圈)。如果ring_type是逆时针定义的,则反之亦然。
- 如果将基础ring_type的多边形定义为闭合,则必须关闭所有环:第一个点必须在空间上等于最后一个点。
- 内部是连接点集。
- 应该没有自交叉点,但允许自身切线(在外部/内部环之间)(只要内部是连接点集。
- 应该没有切割线,尖刺或穿孔。
- 内圈应位于外圈内。内圈可能不在彼此之内。
注意
- 您可以使用
boost::geometry::correct
来修正不符合上述所有要求的环/多边形。 - Boost 1.56.0添加了
boost::geometry::is_valid
,因此您可以验证几何的有效性。对于旧版本,请参阅例如polygons union using boost
以上是关于检查boost中的面要素的主要内容,如果未能解决你的问题,请参考以下文章
使用 C++ 和 Boost(或不使用?)检查是不是正在使用特定端口?