如何通过 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 多边形相交?的主要内容,如果未能解决你的问题,请参考以下文章
C++ 上不正确的工作 boost::geometry::union_
C++中Boost.Geometry中的多边形变换:平移、旋转、绕线反射