我最近尝试开发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.53.0。
BG中Polygon
的概念解释了大多数高级决策:
多边形是由一个外部边界和零个或多个内部边界(OGC简单特征规范)定义的平面。
因此,Boost.Geometry多边形的定义与Wiki有点不同,Wiki中的多边形没有洞。Boost的多边形。Geometry是带孔或不带孔的多边形。(没有孔的多边形是Boost.geometry中的辅助几何体,称为环。)
在Ring
下,我们发现:
traits::point_order
可能有一个特殊化,定义了其点clockwise
或counterclockwise
的顺序或方向- 可能存在定义闭包的
traits::closure
的专门化open
或closed
在Rules
下,您将找到问题的大多数答案:
除了对编译时间进行检查的Concepts之外,有效多边形还必须满足其他一些规则。这遵循开放地理空间规则(请参见上面的链接)。
- 多边形是简单的几何对象(另请参见wiki,但Boost.Geometry多边形中允许有洞)
- 如果ring_type下的多边形定义为顺时针,则外部环必须具有顺时针方向,并且任何内部环都必须相对于定义的方向反转(因此:顺时针外部环为逆时针方向)。如果ring_type是逆时针定义的,则反之亦然
- 如果ring_type下的多边形定义为闭合,则所有环都必须闭合:第一个点必须在空间上等于最后一个点
- 内部是一个连接的点集
- 不应存在自相交,但允许自相切(外部/内部环之间)(只要内部是连接点集即可)
- 不应有切割线、尖刺或穿孔
- 内环应位于外环内。内环可能不位于彼此内部
注意
- 可以使用
boost::geometry::correct
更正不符合上述所有要求的环形/多边形 - Boost 1.56.0添加了
boost::geometry::is_valid
,以便验证几何体的有效性。对于旧版本,请参见使用boost的多边形并集