Как клип работает в объединении полигонов в библиотеке 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 и вы получите ожидаемый результат.

Я использовал этот источник:

Другие вопросы по тегам