使用闭合路径进行剪裁,并尝试使用带有 c# 的 Clipper 库获取解决方案中的开放路径
本文关键字:路径 Clipper 解决方案 获取 剪裁 | 更新日期: 2023-09-27 18:34:32
我正在使用 C# 版本的 Clipper。我想用封闭的剪辑路径剪辑一个封闭的subj路径,但结果是多条开行。例如,将星形切成两部分,长矩形,但子形状的两侧剩下的是两条开线。
在这个剪裁问题中,安格斯说,要剪裁的线条必须打开才能打开结果。有没有办法用两个封闭的路径进行剪切操作? 作为一种解决方法,我认为我可以对两条封闭路径进行简单的区分,然后遍历结果。每次我发现 subj 路径中不包含的顶点时,都会从下一个顶点开始一条新路径。当我到达终点时,将第一条路径连接到找到的最后一条路径的末尾。还有别的办法吗?
Clipper 库中的路径可以是打开的,也可以是关闭的。您只需通过 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);
更好的解决方法是将它们转换为开放路径并附加第一个顶点。然后,您可以将它们作为开放路径处理,而它们仍表示相同的折线。这样,您就不会有再次遍历多边形的开销。