使用孔时的剪刀库问题

clipper lib problems when using holes

本文关键字:问题 孔时      更新时间:2023-10-16

我正在研究一个 gis 类型的 2d 地图生成器,我正在使用裁剪器库。我在施工过程中注意到一些错误,我认为我做错了什么,所以我运行了这个示例,问题是没有考虑内三角形,它应该是一个洞,它被添加为一个完整的多边形到解决方案中。如果我使用 lib 中的函数反转多边形,三角形将完全消失。从昨天开始,我就遇到了这个问题,我还没有弄清楚我做错了什么。有人对这个库有任何问题吗?这是一个常见的错误'?

<小时 />

我使用了这段代码,直接取自您的网站

包括"clipper.hpp">

//from clipper.hpp ...
//typedef signed long long long64;
//struct IntPoint {long64 X; long64 Y;};
//typedef std::vector<IntPoint> Polygon;
//typedef std::vector<Polygon> Polygons;
...
using namespace ClipperLib;
Polygons subj(2), clip(1), solution;
//define outer blue 'subject' polygon
subj[0].push_back(IntPoint(180,200));
subj[0].push_back(IntPoint(260,200));
subj[0].push_back(IntPoint(260,150));
subj[0].push_back(IntPoint(180,150));
//define subject's inner triangular 'hole' (with reverse orientation)
subj[1].push_back(IntPoint(215,160));
subj[1].push_back(IntPoint(230,190));
subj[1].push_back(IntPoint(200,190));
//define orange 'clipping' polygon
clip[0].push_back(IntPoint(190,210));
clip[0].push_back(IntPoint(240,210));
clip[0].push_back(IntPoint(240,130));
clip[0].push_back(IntPoint(190,130));
DrawPolygons(subj, 0x160000FF, 0x600000FF); //blue
DrawPolygons(clip, 0x20FFFF00, 0x30FF0000); //orange
//perform intersection ...
Clipper c;
c.AddPolygons(subj, ptSubject);
c.AddPolygons(clip, ptClip);
c.Execute(ctIntersection, solution, pftNonZero, pftNonZero);
DrawPolygons(solution, 0x3000FF00, 0xFF006600); //solution shaded green

我应该透过三角形雕刻出来的洞看到,对吗?我尝试了一个更简单的场景,里面有一个正方形和一个三角形,我执行了不同的操作,如减法异或和差值,我总是得到 2 个多边形,看起来根本没有执行操作。

Clipper 库已经过广泛的测试,并且拥有相当多的用户,所以我相信问题会出现在您的代码中。另外,我不确定您尝试了哪个示例代码,但所有提供的示例都已经过全面测试(在 C++、C# 和 Delphi 中(。

安格斯 - 快船图书馆的作者

必须使用带有PolyTree输出参数的Execute()而不是Paths参数(旧Polygons(才能获得完整的轮廓+孔解决方案。