Clipperlib не ведет себя так, как задумано, когда выполняется объединение на мультиполигоне
Я пытаюсь объединить мультиполигон, но он не работает должным образом, как показано на рисунке ниже:
Код, который я использую:
using ClipperLib;
using Polygon = System.Collections.Generic.List<ClipperLib.IntPoint>;
using Polygons = System.Collections.Generic.List<System.Collections.Generic.List<ClipperLib.IntPoint>>;
namespace Ylp.ComputationalGeometry
{
public static class Merge
{
public static IList<IList<double>> Multipolygon(IList<IList<IList<IList<double>>>> multiPolygon)
{
const double precisionFactor = 1000000000000000.0;
//precondition: all your polygons have the same orientation
//(ie either clockwise or counter clockwise)
Polygons polys = new Polygons();
multiPolygon.ForEach(x =>
{
Polygon polygon = x.First().Select( y => new IntPoint()
{
X = (long)(y[0] * precisionFactor),
Y = (long)(y[1] * precisionFactor)
}).ToList();
polys.Add(polygon);
});
Polygons solution = new Polygons();
Clipper c = new Clipper();
c.AddPaths(polys, PolyType.ptSubject,true);
c.Execute(ClipType.ctUnion, solution,
PolyFillType.pftNonZero, PolyFillType.pftNonZero);
var coordinates = solution.SelectMany(x => x.Select(y=> (IList<double>)new List<double>()
{
y.X / precisionFactor,
y.Y / precisionFactor
}).ToList()) .ToList();
return coordinates;
}
}
}
Я действительно хочу, чтобы результат объединения выглядел следующим образом, поэтому любые пересечения в середине следует игнорировать и создать область, охватывающую обе фигуры: