2

我正在使用 ClipperLib 的 C# 版本的 v6.4.2。我有很多方格组成一个渔网。我也有一个长方形。我想得到一个结果,其中只有矩形内的正方形被返回并且部分重叠被剪裁。主题为绿色,剪辑为红色: 在此处输入图像描述

我得到的结果是棕色/灰色矩形,它只有一个多边形: 在此处输入图像描述

结果,我预计会有 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 秒。所以做了一些额外的事情。我认为这是合并产生的正方形。

我不希望结果合并。我怎样才能防止这种情况?还是我的代码有问题?

4

2 回答 2

2

根据该方法的 Clipper文档Execute

关于返回的解决方案路径,有几点需要注意:

... 多边形可能很少共享一个公共边(尽管这在版本 6 中现在非常罕见)

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

我尝试用不同的 PolyFillType 做同样的事情,但也没有成功。

您可能想尝试Execute在每个应该完成工作的迭代中针对剪切区域单独在每个正方形(主题)上运行该方法,尽管性能可能会因此受到影响。

于 2017-09-16T09:46:38.630 回答
1

在这种精确的情况下,您可以轻松地手动计算结果,而无需裁剪器库。

所有矩形都是轴对齐的对象这一事实可以加快计算速度,因此甚至可以更快地自己执行操作。

于 2017-09-15T12:29:32.297 回答