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

Godot用Geometry.merge_polygons_2d()合并多边形实现邻接共边无内轮廓

问题描述

遍历Polygon2D数组单独提取轮廓传入绘制脚本的实现,会在邻接多边形的公共边界处重复绘制线条。需要基于现有逻辑调用Geometry.merge_polygons_2d()完成多边形合并,消除公共边的多余轮廓。

改造方案

主逻辑修改(_ready函数)

核心调整为在全局坐标系下依次合并所有待处理多边形,合并操作会自动移除内部邻接公共边,仅保留整体外边界,再统一转换到轮廓绘制节点的本地坐标系传入:

func _ready():
    var provs = [$Polygon2D4,$Polygon2D,$Polygon2D3]
    var outline_drawer = $outline_drawer
    outline_drawer.color = Color(0.06,0.71,0.74) / Color(2,2,2)
    
    var merged_polys_global := []
    for poly_node in provs:
        # 转全局坐标
        var points_global = poly_node.global_transform.xform(poly_node.polygon)
        # 第一个多边形直接初始化合并队列
        if merged_polys_global.is_empty():
            merged_polys_global.append(points_global)
            continue
        # 后续多边形依次和已有合并结果做并集运算
        var temp_merge_result := []
        for existing_poly in merged_polys_global:
            temp_merge_result.append_array(Geometry.merge_polygons_2d(existing_poly, points_global))
        merged_polys_global = temp_merge_result
    
    # 合并结果转绘制节点本地坐标
    var outlines_local := []
    var global_to_local: Transform2D = outline_drawer.global_transform.affine_inverse()
    for outline_global in merged_polys_global:
        outlines_local.append(global_to_local.xform(outline_global))
    
    outline_drawer.outlines = outlines_local

轮廓绘制脚本

原有轮廓绘制脚本无需任何改动,合并后的轮廓集合已剔除所有内部公共边,原有逐段画线逻辑可直接渲染出正确的无冗余外轮廓。

注意事项
  • 所有待合并Polygon2D的多边形顶点需满足:绕序统一(同为顺时针/逆时针)、无自交、邻接边顶点坐标完全重合,否则会出现合并失败、轮廓缺失问题
  • 若合并后出现意外空洞,一般是多边形绕序不一致导致,统一所有多边形点的绕序即可修复
  • 若邻接多边形存在像素级坐标缝隙,合并后仍会保留缝隙处线条,需调整顶点坐标保证完全对齐

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 07:39:20