ClipperLib 用矩形剪辑多个正方形产生 1 个结果
ClipperLib Clip multiple squares with rectangle produces 1 result
我使用的是 C# 版本的 ClipperLib v6.4.2。
我有很多正方形组成一个渔网。我也有一个长方形。
我想得到一个结果,其中只有矩形内的正方形被返回并且部分重叠被剪掉。
主题为绿色,剪辑为红色:
我得到的结果是 brown/gray 矩形,它只有一个多边形:
我本来希望得到 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 库。
所有矩形都是 axis-aligned objects 的事实使得可以加快计算速度,因此甚至可以更快地自己执行操作。
根据 Clipper documentation 的 Execute
方法:
There are several things to note about the solution paths returned:
...
polygons may rarely share a common edge (though this is now very rare as of version 6)
我认为这意味着在执行任何裁剪操作时路径会合并。
我尝试用不同的 PolyFillType 做同样的事情,但也没有成功。
您可能想尝试 运行 每个方块上的 Execute
方法(主题)针对每次迭代的裁剪区域,这应该可以完成工作,但性能可能会因此受到影响。
我使用的是 C# 版本的 ClipperLib v6.4.2。
我有很多正方形组成一个渔网。我也有一个长方形。
我想得到一个结果,其中只有矩形内的正方形被返回并且部分重叠被剪掉。
主题为绿色,剪辑为红色:
我得到的结果是 brown/gray 矩形,它只有一个多边形:
我本来希望得到 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 库。
所有矩形都是 axis-aligned objects 的事实使得可以加快计算速度,因此甚至可以更快地自己执行操作。
根据 Clipper documentation 的 Execute
方法:
There are several things to note about the solution paths returned:
... polygons may rarely share a common edge (though this is now very rare as of version 6)
我认为这意味着在执行任何裁剪操作时路径会合并。
我尝试用不同的 PolyFillType 做同样的事情,但也没有成功。
您可能想尝试 运行 每个方块上的 Execute
方法(主题)针对每次迭代的裁剪区域,这应该可以完成工作,但性能可能会因此受到影响。