1

我有几个重叠的形状。我希望能够在包含所有较小形状的最大形状上打孔。这些孔将代表较大形状中的较小形状。

示例图片: 在此处输入图像描述

我正在使用 C# 版本的 ClipperLib:

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.ctDifference, 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;

但返回的形状是上图中最大的形状。

GeoJson 文件: http ://s000.tinyupload.com/download.php?file_id=62259172894067221043&t=6225917289406722104327028

4

1 回答 1

2

当您说您“希望能够在最大的形状上打孔”时,我认为您误解了 Clipper 库管理/定义多边形区域的方式。在 Clipper 中,多边形由一系列闭合路径以及指定的多边形填充规则定义- 最常见的是 EvenOdd 或 NonZero 填充。(在图形显示库中几乎总是以这种方式定义多边形。)

因此,对于上面的数据,由于您使用的是非零填充,因此“孔”路径的方向必须与容器外部路径的方向相反。如果内部路径与外部容器具有相同的方向,则使用非零填充执行“差异”裁剪操作将正确忽略内部路径。

附带说明一下,在对一组多边形执行裁剪操作时(即没有裁剪路径时),执行“联合”操作更直观,因为主题路径是“联合”的(裁剪路径也是如此)在主题和剪辑区域之间的任何剪辑操作之前。

于 2015-10-24T21:21:25.350 回答