多边形差异 - 来自Clipperlib的奇怪结果

时间:2013-11-05 19:17:45

标签: c# polygon clipperlib

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

  1. 生成轮廓。
  2. 将轮廓分类为树形结构,使得特定轮廓内的所有轮廓都是该轮廓的子轮廓。
  3. 对于每个轮廓,使用Clipperlib对其所有子项执行差异操作。
  4. 得到的多边形和孔构成了等区“甜甜圈”。然后可以将这些等区域渲染为等高线图,或用于其他目的。请注意,如果我想要做的只是渲染轮廓,我可以在初始排序后停止并按顺序渲染轮廓,这样最内部渲染在顶部。我确实需要实际的区域。

    首先 - Clipperlib是一个很棒的图书馆,我非常乐意为这笔钱买单 - 感谢Angus!

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

    image one

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

    我实际得到的是两个(如预期的那样),每个孩子都有儿童(洞):

    image two

    enter image description here

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

    我正在使用第一个图像中的红色多边形作为主题执行clipperlib,并将所有子项作为剪辑执行。剪辑类型是ctDifference(我也尝试过Xor具有相同的结果 - 它们应该是,因为所有的孩子都在主题内)。 我正在请求PolyTree,它有两个Childs。我正在使用c#库,并尝试过v6。

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

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

    感谢, 马特

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

    here is the link

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

1 个答案:

答案 0 :(得分:3)

  

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

这听起来好像某处有一个错误,但没有原始数据就很难说出来。

此外,这不是Clipper支持的最佳位置,在discussion forumreport suspected bugsSourceForge的位置。无论如何,现在最好将这些原始数据发布到这里(尽可能少地再现问题)。

修改:

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

      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);

使用上面的代码片段过滤解决方案PolyTree的顶级PolyNodes(以及顶级节点必须是'outers'),这就是我得到的(解决方案是绿色阴影)......

enter image description here

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

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

编辑3: 显然仍然不是正确的。

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