如何通过Boost C ++库与3D多边形交叉?

时间:2018-02-27 10:13:56

标签: c++ boost boost-geometry

我想要交叉两个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";
    }
}

但它不起作用。

1 个答案:

答案 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