ClipperLib Обрезать несколько квадратов прямоугольником дает 1 результат
Я использую v6.4.2 C# версии ClipperLib. У меня есть много квадратов, составляющих сетку. У меня также есть прямоугольник. Я хочу получить результат, в котором возвращаются только квадраты, которые находятся внутри прямоугольника и частично перекрываются. Объекты выделены зеленым цветом, а клип - красным:
В результате я получаю коричневый / серый прямоугольник, который представляет собой только один многоугольник:
Я бы ожидал иметь 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 секунды. Так что что-то дополнительное сделано. Я думаю, что это слияние полученных квадратов.
Я не хочу, чтобы результат слился. Как я могу предотвратить это? Или, возможно, мой код неисправен?
2 ответа
Согласно документации Clipper Execute
метод:
Следует обратить внимание на несколько вещей, касающихся возвращаемых путей решения:
... полигоны могут редко иметь общее ребро (хотя сейчас это очень редко, начиная с версии 6)
что, я думаю, означает, что пути объединяются при выполнении любых операций отсечения.
Я пытался сделать то же самое с разными PolyFillType, но безуспешно.
Вы можете попробовать запустить Execute
метод на каждом квадрате индивидуально (субъект) по отношению к области отсечения на каждой итерации, которая должна выполнять работу, хотя в результате производительность может снизиться.
В этом конкретном случае вы можете легко вычислить результат вручную без использования lib.
Тот факт, что все прямоугольники являются выровненными по оси объектами, позволяет ускорить вычисления, поэтому даже выполнение операции может быть быстрее.