2013-06-13 2 views
2

enter image description hereКак клип работает в многоугольник союза в Clipper библиотеке

clipper library Я использую. На рисунке красные и черные - это клипы, а зеленые - полигоны. Код указан ниже. Однако я не понимаю, почему итоговый союзный полигон равен (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); 
     } 
    } 
} 

Edit:

Если изменить PolyFillType.pftEvenOdd к PolyFillType.pftNonZero, он отлично работает. Может ли кто-нибудь объяснить, как это влияет на результаты?

ответ

6

Это потому, что вы используете PolyFillType.pftEvenOdd filltype для обоих subj и clip. Указанные операции filltype выполняются на обоих входных наборах соответственно. В вашем примере он ничего не делает на subj, но очищает общую часть двух прямоугольников clip, давая непересекающиеся прямоугольники. Объединение содержит эти два отдельных прямоугольника плюс объект без изменений.

Просто измените filltype clip на PolyFillType.pftPositive, и вы получите ожидаемый результат.

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

Смежные вопросы