You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多LineSegment分割LinearRing:递归函数调用困惑及代码求助

多条切割线分割LinearRing的递归实现问题

我想用多条线把一个LinearRing分割成多个LinearRing,预期得到LinearRing集合。目前单条线切割多边形已经能实现,但多条线切割的逻辑搞不定——每次用当前线把当前多边形切成两部分时,要把原多边形从结果里移除,这部分处理起来很复杂。现在卡在递归函数的调用上,以下是我写的代码。

主函数

static void Main(string[] args)
{
    Coordinate c22 = new Coordinate(2889.0, 1277.0);
    Coordinate c23 = new Coordinate(2894.0, 1288.0);
    Coordinate c24 = new Coordinate(2901.0, 1284.0);
    Coordinate c25 = new Coordinate(2909.0, 1289.0);
    Coordinate c26 = new Coordinate(2916.0, 1281.0);
    Coordinate c27 = new Coordinate(2912.0, 1270.0);
    Coordinate c28 = new Coordinate(2906.0, 1275.0);
    Coordinate c29 = new Coordinate(2898.0, 1273.0);
    LinearRing outerBoundary = new LinearRing(new Coordinate[] { c22, c23, c24, c25, c26, c27, c28, c29, c22 });
    List<LineString> lines = new List<LineString>();
    Coordinate p30 = new Coordinate(2892.0, 1270.0);
    Coordinate p31 = new Coordinate(2900.0, 1294.0);
    LineString ln1 = new LineString(new Coordinate[] { p30, p31 });
    lines.Add(ln1);
    Coordinate p32 = new Coordinate(2909.0, 1268.0);
    Coordinate p33 = new Coordinate(2907.0, 1294.0);
    LineString ln2 = new LineString(new Coordinate[] {p32, p33});
    lines.Add(ln2);
    Coordinate p34 = new Coordinate(2886.0, 1286.0);
    Coordinate p35 = new Coordinate(2922.0, 1278.0);
    LineString ln3 = new LineString(new Coordinate[] {p34, p35});
    lines.Add(ln3);
    Coordinate p36 = new Coordinate(2883.0, 1281.0);
    Coordinate p37 = new Coordinate(2923.0, 1273.0);
    LineString ln4 = new LineString(new Coordinate[] {p36, p37});
    lines.Add(ln4);
    Geometry polygons = CookieCutter(outerBoundary, new List<LineString>() { ln1, ln2, ln3, ln4 });
}

递归函数(此处是卡点)

public static Geometry CookieCutter(LinearRing polygon, List<LineString> cuttingEdges, Geometry pieces = null)
{
    if (pieces == null) { pieces = Polygonize(polygon.Union(cuttingEdges[0])); }
    foreach (var cuttingEdge in cuttingEdges)
    {
        for (int i = 0; i < pieces.NumGeometries; i++)
        {
            pieces = pieces.GetGeometryN(i);
            Geometry newPieces = Polygonize(polygon.Union(cuttingEdge));
            // 我知道这里应该对新生成的块调用CookieCutter
            // 但该怎么实现...?
        }
    }
}

Polygonize函数

public static Geometry Polygonize(Geometry geometry)
{
    var lines = LineStringExtracter.GetLines(geometry);
    var polygonizer = new Polygonizer(false);
    polygonizer.Add(lines);
    var polys = new List<Geometry>(polygonizer.GetPolygons());
    var polyArray = GeometryFactory.ToGeometryArray(polys);
    return geometry.Factory.BuildGeometry(polyArray);
}

内容的提问来源于stack exchange,提问作者dotnetexplorer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 07:01:08