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

问题描述 投票:2回答:1

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

但它不起作用。

c++ boost boost-geometry
1个回答
0
投票

不,这似乎没有实现。

例如。 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一致。

© www.soinside.com 2019 - 2024. All rights reserved.