Как клип работает в объединении полигонов в библиотеке Clipper
Я использую клиперную библиотеку. На рисунке красный и черный - клипы, а зеленый - многоугольники. Код указан ниже. Тем не менее, я не понимаю, почему результирующий многоугольник объединения (7 3 4 14 9 1 2 6).
Я полагаю, это должно быть (1 4 14 9)
? Число вершин показано на рисунке.
using System;
using ClipperLib;
using Polygon = System.Collections.Generic.List<ClipperLib.IntPoint>;
using Polygons = System.Collections.Generic.List<System.Collections.Generic.List<ClipperLib.IntPoint>>;
namespace ClipperLibrary_Test
{
class Program
{
static void Main(string[] args)
{
Polygons subj = new Polygons(1);
subj.Add(new Polygon(4));
subj[0].Add(new IntPoint(0, 0));
subj[0].Add(new IntPoint(0, 70));
subj[0].Add(new IntPoint(100, 70));
subj[0].Add(new IntPoint(100, 0));
Polygons clip = new Polygons();
clip.Add(new Polygon(4));
clip[0].Add(new IntPoint(40, 0));
clip[0].Add(new IntPoint(40, 100));
clip[0].Add(new IntPoint(150, 100));
clip[0].Add(new IntPoint(150, 0));
clip.Add(new Polygon(4));
clip[1].Add(new IntPoint(-50, 0));
clip[1].Add(new IntPoint(-50, 100));
clip[1].Add(new IntPoint(60, 100));
clip[1].Add(new IntPoint(60, 0));
Polygons solution = new Polygons();
Clipper c = new Clipper();
c.AddPolygons(subj, PolyType.ptSubject);
c.AddPolygons(clip, PolyType.ptClip);
c.Execute(ClipType.ctUnion, solution, PolyFillType.pftEvenOdd, PolyFillType.pftEvenOdd);
foreach (Polygon p in solution)
{
Console.WriteLine("next ");
foreach (IntPoint pt in p)
{
Console.WriteLine("(" + pt.X + "; " + pt.Y + ")");
}
}
//Console.WriteLine("area: " + Clipper.Area(solution[0]).ToString());
Console.WriteLine(solution.Count);
Console.WriteLine("right: " + c.GetBounds().right + ": left: " + c.GetBounds().left);
}
}
}
Редактировать:
Если я изменю PolyFillType.pftEvenOdd
в PolyFillType.pftNonZero
работает нормально. Кто-нибудь может объяснить, как это влияет на результаты?
1 ответ
Это потому, что вы используете PolyFillType.pftEvenOdd
Тип заполнения для обоих subj
а также clip
, Указанные операции заполнения типа выполняются для обоих входных наборов соответственно. В вашем примере это ничего не делает на subj
, но очищает общую часть двух прямоугольников clip
, давая непересекающиеся прямоугольники. Объединение содержит эти два отдельных прямоугольника плюс объект без изменений.
Просто измените тип заполнения clip
в PolyFillType.pftPositive
и вы получите ожидаемый результат.
Я использовал этот источник: