我正在使用ClipperLib的C#版本的v6.4.2。
我有很多正方形组成鱼网。我也有一个矩形。
我想得到一个结果,其中仅返回矩形内的正方形,并且部分重叠的部分被裁剪。
主题为绿色,剪辑为红色:
c# - ClipperLib剪切带有矩形的多个正方形会产生1个结果-LMLPHP

我得到的结果是棕色/灰色矩形,它只有一个多边形:
c# - ClipperLib剪切带有矩形的多个正方形会产生1个结果-LMLPHP

我本来希望有15个完整的正方形和13个修剪的正方形。

这是我正在使用的代码:

var startX = 100;
var startY = 250;
const int numPolygons = 10;

var subj = new Polygons(numPolygons * numPolygons);
for (var i = 0; i < numPolygons; i++)
{
    for (var j = 0; j < numPolygons; j++)
    {
        var square = new Polygon(4)
        {
            new IntPoint(startX, startY),
            new IntPoint(startX + 10, startY),
            new IntPoint(startX + 10, startY - 10),
            new IntPoint(startX, startY - 10)
        };
        subj.Add(square);
        // Moving to the right
        startX = startX + 10;
    }
    // Moving down
    startY = startY - 10;
    startX = 100;
}

var clip = new Polygons(1);
clip.Add(new Polygon(4));
clip[0].Add(new IntPoint(165, 215));
clip[0].Add(new IntPoint(255, 215));
clip[0].Add(new IntPoint(255, 155));
clip[0].Add(new IntPoint(165, 155));

var solution = new Polygons();
var c = new Clipper.Clipper();
c.AddPaths(subj, PolyType.ptSubject, true);
c.AddPaths(clip, PolyType.ptClip, true);
c.Execute(ClipType.ctIntersection, solution, PolyFillType.pftEvenOdd, PolyFillType.pftEvenOdd);
Debug.WriteLine("solution.Count: " + solution.Count);


运行以上代码时,大约需要0.5秒。因为结果看起来像剪辑和主题已切换,所以我将它们切换了。结果是相同的,但是现在只需要0.1秒。因此,需要做一些额外的工作。我认为这是结果正方形的合并。

我不希望结果合并。我该如何预防?还是我的代码有错误?

最佳答案

根据Clipper documentationExecute方法:


  关于返回的解决方案路径,需要注意几件事:
  
  ...
  多边形可能很少共享公共边(尽管从版本6开始,这非常罕见)


我认为这意味着执行任何剪切操作时路径会合并。

我试图用不同的PolyFillType`s做同样的事情,也没有成功。

您可能想尝试在每个正方形上(对象)分别对应该执行此工作的每个裁剪区域运行Execute方法,尽管这样做可能会降低性能。

关于c# - ClipperLib剪切带有矩形的多个正方形会产生1个结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46235176/

10-13 07:08