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

Posted

技术标签:

【中文标题】如何通过 Boost C++ 库与 3D 多边形相交?【英文标题】:How to intersection to 3D polygons by Boost C++ library? 【发布时间】:2018-02-27 10:13:55 【问题描述】:

我想相交两个 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】:

没有,这似乎没有实现。

例如area(Polygon) 简单地断言维度必须等于 2。这隐含意味着 correct 不支持 3d 几何图形,尽管 intersection 算法会触发不同的错误(首先),但有理由认为根本原因仍然是一样。

引用 Boost Geometry 实现的 OGC“简单特征”规范:

§6.1.2.5 Z 和 M 坐标值的使用

Point 值可以包括 z 坐标值。 z 坐标值传统上表示 第三维(即 3D)。 [...]

空间操作在数据的“地图几何”中起作用,并将 因此在计算中不反映 z 或 m 值(例如,Equals、 长度)或生成新的几何值(例如,缓冲区, ConvexHull,交叉口)。这是通过投影几何 将物体放到水平面上以获得“足迹”或“阴影” 用于地图计算的对象。换句话说, 可以存储和获取 z(和 m)坐标值,但是 它们在基于地图的所有其他操作中被忽略 几何形状。 实现可以免费包含真正的 3D 几何 操作,但应符合 ISO 19107

【讨论】:

以上是关于如何通过 Boost C++ 库与 3D 多边形相交?的主要内容,如果未能解决你的问题,请参考以下文章

Boost Geometry:联合多个多边形 C++

C++ 上不正确的工作 boost::geometry::union_

C++中Boost.Geometry中的多边形变换:平移、旋转、绕线反射

如何在Leaflet地图多边形上触发事件?

Boost::geometry::intersection 与 C++

使用 C++ 在 OpenGL 中移动自动旋转的 3d 多边形