我想要交叉两个3D多边形,我的编译器是VC ++ 2013。我想使用Boost几何库。但是怎么做呢?我尝试过以下方法:
#include <boost/geometry/geometry.hpp>
#include <boost/geometry/geometries/register/point.hpp>
#include <boost/geometry/geometries/register/ring.hpp>
struct MyPoint
{
double x, y, z;
};
BOOST_GEOMETRY_REGISTER_POINT_3D(MyPoint, double, boost::geometry::cs::cartesian, x, y, z)
typedef boost::geometry::model::polygon<MyPoint> Polygon;
BOOST_GEOMETRY_REGISTER_RING(Polygon::ring_type)
......
int main()
{
using boost::geometry::append;
using boost::geometry::correct;
using boost::geometry::dsv;
Polygon poly1;
Polygon poly2;
append(poly1, MyPoint{ 2, 0, 1 });
append(poly1, MyPoint{ 2, 2, 1 });
append(poly1, MyPoint{ 0, 2, 1 });
append(poly1, MyPoint{ 0, 0, 1 });
append(poly1, MyPoint{ 2, 0, 1 });
append(poly2, MyPoint{ 3, 0, 1 });
append(poly2, MyPoint{ 3, 3, 1 });
append(poly2, MyPoint{ 0, 3, 1 });
append(poly2, MyPoint{ 0, 0, 1 });
append(poly2, MyPoint{ 3, 0, 1 });
correct(poly1);
correct(poly2);
std::vector<Polygon> polys;
if (boost::geometry::intersection(poly1, poly2, polys))
{
for (Polygon const& inter : polys)
std::cout << "Intersection polygon area is " << boost::geometry::area(inter) << " with " << dsv(inter) << "\n";
}
}
但它不起作用。
不,这似乎没有实现。
例如。 area(Polygon)
只是断言维度必须等于2.这隐含地意味着correct
不支持3d几何,虽然intersection
算法触发了不同的错误(第一),但根本原因仍然是相同的。
引用Boost Geometry实现的OGC“简单特征”规范:
§6.1.2.5 Use of Z and M coordinate values
点值可以包括z坐标值。 z坐标值传统上表示第三维(即3D)。 [...]
空间操作在数据的“地图几何”中工作,因此不会在计算(例如,等于,长度)中或在新几何值的生成中反映z或m值(例如,Buffer,ConvexHull,Intersection)。这是通过将几何对象投影到水平平面上以获得对象的“足迹”或“阴影”来实现的,以用于地图计算。换句话说,可以存储和获得z(和m)坐标值,但在基于地图几何的所有其他操作中忽略它们。实现可以包括真正的3D几何操作,但应与ISO 19107一致。