【问题标题】:Polygon difference - strange results from Clipperlib多边形差异 - Clipperlib 的奇怪结果
【发布时间】:2013-11-16 19:13:09
【问题描述】:

我正在尝试从一组轮廓创建等面积多边形(“甜甜圈”)。这是过程:

  1. 生成轮廓。
  2. 将等高线排序为树形结构,这样特定等高线内的所有等高线都是该等高线的子代。
  3. 对于每个轮廓,使用 Clipperlib 对其所有子项执行差异运算。

生成的多边形和孔构成等面积“甜甜圈”。然后可以将这些等值区域渲染为等高线图,或用于其他目的。请注意,如果我只想渲染轮廓,我可以在初始排序后停止并按顺序渲染轮廓,这样最里面的渲染就在顶部。我确实需要实际区域。

首先 - Clipperlib 是一个很棒的库,我很乐意花大价钱购买它 - 感谢 Angus!

我的问题是在某些情况下我似乎从差异操作中得到了一些奇怪的结果 - 我怀疑这可能是我的用户错误,所以我将说明问题:

这张图片显示了两个多边形 - 主体用红色勾勒,孩子们用蓝色填充。我想从主题中减去孩子。注意鼠标指针附近的小区域。我对这个差异的期望是两个外部多边形 - 靠近鼠标指针的小多边形和大多边形。我还希望所有“岛屿”都是第二个大多边形内的洞。

我实际上得到的是两个外部(如预期的那样),每个外部都有子(孔):

在第二张图片中,鼠标指针附近的小多边形是“外部”,所有其他填充的多边形都是属于它的“孔”。请注意,我在两张图片中都显示了两种解决方案的轮廓 - 只需关注填充的多边形。

我正在执行clipperlib,使用第一张图像中的红色多边形作为主题,所有子元素作为剪辑。剪辑类型是 ctDifference (我也尝试过 Xor 得到相同的结果 - 他们应该是这样,因为所有孩子都在主题内)。 我要一个 PolyTree 回来,它有两个孩子。我正在使用 c# 库,也尝试过 v6。

在一个层面上,我需要的结果都在那里 - 所有的“洞”都被指定为这样,问题是这些洞中有许多是作为右上角的微小外部区域的子级返回的图片。我是在错误地读取 PolyTree,错误地使用 ClipperLib,还是这个结果完全错误?

进一步说明 - 我注意到新的 ClipperLib (v6) 现在接受 Z 值。我现在想知道是否有比我用来从给定的无序轮廓线集合生成这些等值区域更好的方法?

谢谢, 马特

编辑:我已将多边形的原始数据上传到文本文件中。

here is the link

文件将主题多边形作为第一组顶点,然后是每个子顶点。每个多边形在一行中表示为 X/Y 对,每个多边形之间有一个换行符。

【问题讨论】:

  • 你输入的轮廓是什么?是不是像网格一样的东西?
  • 输入轮廓是一系列描述闭合路径的坐标。它们在地理坐标中指定 - WGS84 度。它们按 10e7 缩放,以便它们可以作为整数提供给 ClipperLib。
  • 啊啊,我明白了。有趣的是,现在这一切都变得有意义了。很高兴了解 Clipperlib,总有一天它可能会派上用场......

标签: c# polygon clipperlib


【解决方案1】:

在第二张图片中,鼠标指针附近的小多边形是“外部”,所有其他填充的多边形都是属于它的“孔”。请注意,我在两张图片中都显示了两种解决方案的轮廓 - 只需关注填充的多边形。


这听起来像是某处存在错误,但如果没有原始数据很难判断。

此外,这不是 Clipper 支持的最佳地点,有一个 discussion forum 和一个 report suspected bugs SourceForge 的地方。无论如何,现在最好在这里发布您的原始数据(请尽可能少,同时仍然重现问题)。

编辑:

好的,我查看了数据,但我不明白你为什么相信......“所有其他填充的多边形都是属于它的“洞”。

      PolyTree solutiontree = new PolyTree();
      cpr.Execute(ClipType.ctDifference, solutiontree, 
          PolyFillType.pftNonZero, PolyFillType.pftNonZero);
      solution = new Polygons(solutiontree.ChildCount);
      foreach (PolyNode pn in solutiontree.Childs)
        solution.Add(pn.Contour);

只需使用上面的代码 sn-p 过滤解决方案 PolyTree 的顶层 PolyNode(并且顶层节点必须是“外部”),这就是我得到的(解决方案为绿色阴影)...

从这个结果来看,“鼠标指针附近的小多边形”不可能拥有其他多边形。 话虽如此,显然解决方案中仍然存在漏洞,因此某处存在需要修复的错误。

编辑 2: 我发现并修复了这个错误,并将 Clipper 6.0.2 版上传到SourceForge repository。在正式更新主 Zip 包之前,我需要做更多的错误检查。

编辑 3: 毕竟显然仍然不对。

编辑 4: 我想我终于解决了这个错误(参见 SourceForge 存储库中的修订版 420)。 跟进there

【讨论】:

  • 感谢 Angus - 我不确定在哪里发帖,因为我进行了搜索,所以弹出了一些 Clipperlib 问题。顺便说一句,很棒的图书馆。这方面的原始数据在主题中有大约一千个点 - 我会看看我是否可以创建一个重现这个问题的简单案例。
  • 已添加到原始数据的链接(在文本文件中)。我确实尝试(一段时间)使用更简单的多边形来重现这个问题,但我做不到。
  • 好的,我现在有了 27 个多边形的坐标,但不清楚哪些是主题多边形,哪些是剪切多边形。
  • 我是否正确假设第一个多边形只是主题,其余的都是剪切多边形?抱歉,我现在可以看到您已在修改后的帖子中指出了这一点。
  • 您好 Angus,感谢您抽出宝贵时间查看此内容。我的解决方案中有两个外部节点,它们都有关联的孔(即 PolyTree 中的两个顶级节点,它们都有 IsHole==true 的子节点)。你得到不同的结果吗?编辑添加:我在剪辑操作期间一直在使用 pftEvenOdd。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-15
相关资源
最近更新 更多