我想要交叉两个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";
}
}
但它不起作用。
答案 0 :(得分:0)
不,这似乎没有实现。
E.g。 area(Polygon)
只是断言维度必须等于2.这隐含地意味着correct
不支持3d几何,虽然intersection
算法触发了不同的错误(第一个),但它仍然有理由根本原因仍然是一样的。
引用Boost Geometry实现的OGC“简单特征”规范:
§6.1.2.5使用Z和M坐标值
点值可以包括z坐标值。 z坐标值传统上代表 第三维(即3D)。 [...]
空间操作在数据的“地图几何”中工作 因此,在计算中不反映z或m值(例如,等于, 长度)或生成新几何值(例如,缓冲区, ConvexHull,Intersection)。这是通过投影几何图形来完成的 物体到水平面上以获得“足迹”或“阴影” 用于地图计算的对象。换一种说法, 可以存储和获得z(和m)坐标值但是 它们在基于map的所有其他操作中被忽略 几何形状。 实现可以免费包含真正的3D几何 操作,但应符合ISO 19107 。