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