使用带有c#的Clipper库,使用封闭路径剪切并尝试在解决方案中获取开放路径

时间:2014-12-16 19:22:16

标签: c# polygon

我正在使用Clipper的c#版本。我想用一个封闭的剪辑路径剪切一个封闭的subj路径,但结果是多个打开的行。例如,切片将星形描述为具有长矩形的两个部分,但是subj形状的两边留下的是两条开放线。

在这个clipping question中,安格斯说要剪裁的线必须打开才能打开结果。有没有办法用两个封闭的路径进行剪切操作?作为一种解决方法,我想我可以对两个封闭路径做一个简单的区别,然后遍历结果。每次我找到一个未包含在subj路径中的顶点,然后用下一个vert开始一个新路径。当我到达最后,加入第一条路径到最后找到的路径的末尾。还有另一种方式吗?

2 个答案:

答案 0 :(得分:0)

Paths中的{p> Clipper library可能会被公开或关闭。您只需通过Clipper对象的AddPath方法中的Closed参数指示提供的路径是打开还是关闭。如果所有路径都已关闭,那么可以确保裁剪解决方案中的所有路径也将关闭。

      Path s = new Path();
      s.Add(new IntPoint(10, 40));
      s.Add(new IntPoint(40, 40));
      s.Add(new IntPoint(50, 10));
      s.Add(new IntPoint(60, 40));
      s.Add(new IntPoint(90, 40));
      s.Add(new IntPoint(65, 60));
      s.Add(new IntPoint(75, 90));
      s.Add(new IntPoint(50, 70));
      s.Add(new IntPoint(25, 90));
      s.Add(new IntPoint(35, 60));

      Path c = new Path();
      c.Add(new IntPoint(49, 0));
      c.Add(new IntPoint(51, 0));
      c.Add(new IntPoint(51, 100));
      c.Add(new IntPoint(49, 100));

      Paths solution = new Paths();
      Clipper cpr = new Clipper();
      cpr.AddPath(s, PolyType.ptSubject, true);
      cpr.AddPath(c, PolyType.ptClip, true);
      cpr.Execute(ClipType.ctDifference, solution, PolyFillType.pftEvenOdd, PolyFillType.pftEvenOdd);                   

答案 1 :(得分:0)

更好的解决方法是将它们转换为开放路径并附加第一个顶点。然后,您可以将它们作为开放路径处理,同时它们仍然表示相同的折线。这样,您就不会再次遍历多边形。