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

JTS中Delaunay三角剖分异常求助:区域遗漏与凸角查找失败

JTS多边形三角剖分问题解决方案

问题1:带洞多边形三角剖分遗漏区域

DelaunayTriangulationBuilder是基于原始点集做三角剖分,不会自动识别多边形的边界约束(包括洞的边界),所以会出现区域遗漏的情况。解决步骤:

  • 提取多边形的所有顶点(外环+所有内环)作为sites传入构建器
  • 改用ConstrainedDelaunayTriangulator替代基础构建器,将多边形的外环边、内环边全部添加为约束边
  • 剖分完成后,用原多边形对生成的三角网格做裁剪,只保留落在多边形内部的三角形
  • 前置检查:确保原多边形是有效拓扑(无自交、重复顶点),可通过Geometry#isValid()验证,无效的话先用Geometry#buffer(0)修复

问题2:复杂多边形抛出IllegalStateException(提示“Unable to find a convex corner”)

这个异常是JTS内部耳切三角剖分算法陷入死循环导致的,根源是多边形拓扑存在问题:

  • 重复/重合顶点:顶点列表中有大量重复坐标,导致算法无法识别凸角
  • 自交多边形:多边形边界自身交叉,破坏拓扑结构
  • 极小几何特征:存在非常小的尖刺、重合边,使得算法无法找到合法凸角

解决方法:

  1. 先修复多边形有效性:调用yourPolygon.buffer(0),该操作会自动修复自交、合并重合顶点
  2. 简化顶点:用SimplifyOp.simplify(yourPolygon, tolerance)(tolerance设为合适精度,比如0.001)去掉冗余的近似重合顶点
  3. 检查顶点顺序:确保外环是逆时针,内环是顺时针(JTS标准拓扑要求),可通过LinearRing#isCCW()验证,不符合的话调用LinearRing.reverse()调整
  4. 替换剖分实现:如果上述修复后仍有问题,尝试使用PolygonTriangulator类,它对复杂多边形的兼容性更好

代码示例片段

// 修复多边形有效性
Geometry validPolygon = invalidPolygon.buffer(0);
// 提取所有顶点
Coordinate[] allCoords = validPolygon.getCoordinates();
// 构建约束Delaunay三角剖分
ConstrainedDelaunayTriangulator triangulator = new ConstrainedDelaunayTriangulator(allCoords);
// 添加所有约束边(外环+内环)
List<LineString> constraints = new ArrayList<>();
if (validPolygon instanceof Polygon poly) {
    constraints.add(poly.getExteriorRing());
    for (int i = 0; i < poly.getNumInteriorRing(); i++) {
        constraints.add(poly.getInteriorRingN(i));
    }
}
triangulator.setConstraints(constraints);
triangulator.compute();
// 获取三角网格并裁剪
Geometry triangles = triangulator.getTriangles(validPolygon.getFactory());
Geometry clippedTriangles = validPolygon.intersection(triangles);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 07:47:13