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

网格各彩色区域外边缘检测通用算法实现思路

区域外边缘提取通用实现方案

你的场景是规则构造点网格下的分区域轮廓提取,优先选边统计法,实现简单性能高,不需要复杂的几何计算。

方案一:边频次筛选法(规则网格首选,O(n)时间复杂度)

核心逻辑非常直接:区域内部的边一定会被两个同区域的相邻网格单元共享,外边缘的边只会隶属于一个同区域单元。
实现步骤:

  • 定义标准化边格式:对任意两个顶点构成的边,统一按坐标大小排序生成唯一标识——比如顶点A(x1,y1)、B(x2,y2),比较时先比X坐标、X相同比Y坐标,把坐标更小的点放在前面,保证同一条边不管从哪个端点出发遍历,生成的标识完全一致,避免重复计数。
  • 遍历当前区域包含的所有网格单元(四边形网格取4条边、三角网格取3条边),按上面的规则给每条边做计数,每出现一次对应计数+1。
  • 筛选所有计数为1的边,这些就是区域的外边缘;计数为2的边是同区域单元共享的内部边,直接剔除即可。
  • (可选)轮廓拼接:任选一条未访问的外边缘边作为起点,顺着边的公共端点依次连接相邻的未访问外边缘边,直到回到起点,就能得到闭合的外轮廓多边形,可直接用于渲染、碰撞体生成等后续逻辑。

算法效果展示图

方案二:回转追踪法(适配任意非规则网格)

如果你的网格不是严格对齐的规则构造网格,可以用通用的轮廓追踪逻辑,不需要依赖网格单元拓扑:

  • 找轮廓起点:取当前区域内X坐标最小(X相同取Y最小)的顶点,这个点必然在外轮廓上,作为追踪起始点。
  • 初始方向确定:从起点出发找所有属于当前区域的邻接顶点,按极角逆时针排序,选极角最小的点作为第二个轮廓点,记录第一条轮廓边。
  • 逐点追踪:每到达一个新的轮廓点,以上一步走过来的边为参考基准,在所有邻接的同区域顶点中,找到相对参考边逆时针偏转角度最小的点作为下一个轮廓点,标记已经走过的边避免重复遍历。
  • 循环直到回到起始点,就得到完整的闭合外轮廓;如果遍历完还有未访问的同区域边,说明区域内部存在孔洞,重复上述流程即可提取孔洞轮廓。

Unity C#开发注意事项

  • 不要直接用浮点数做顶点/边的比对键,建议按你的网格精度把坐标放大后转成整数类型(比如精度到0.01的话就乘100转long),避免浮点数精度误差导致同一条边被识别为两条不同的边。
  • 边的唯一标识可以直接用C#的值元组((long x1, long y1), (long x2, long y2)),自带值比较逻辑,不需要额外写哈希函数,性能远高于自定义类。
  • 提取完轮廓链如果要做线框渲染,直接把轮廓点按顺序传给LineRenderer组件,把最后一个点设为和起点重合即可保证闭合。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 01:24:33