如何在像素网格中实现高效的 Flood Fill 算法(递归 DFS 版本)

雨敏小哥_4064

雨敏小哥_4064

2026-07-26

952人浏览

原创

如何在像素网格中实现高效的 Flood Fill 算法(递归 DFS 版本)

本文详解如何在基于 css grid 的像素画板中,使用原生 javascript 实现可靠的 flood fill 功能——通过递归深度优先搜索(dfs)遍历连通区域,精准替换相同背景色的相邻格子,兼顾可读性与实际可用性。

本文详解如何在基于 css grid 的像素画板中,使用原生 javascript 实现可靠的 flood fill 功能——通过递归深度优先搜索(dfs)遍历连通区域,精准替换相同背景色的相邻格子,兼顾可读性与实际可用性。

Flood Fill 是像素编辑器中的核心功能之一,其目标是:当用户点击某个格子时,将所有与该格子连通且颜色相同的相邻格子,统一填充为新选颜色。在你当前的网格结构中,.pixel-grid 是一个动态生成的 CSS Grid 容器,其子元素 .grid-item 按行优先顺序排列(即第 0 行从左到右,接着第 1 行……),这为基于索引的邻域计算提供了坚实基础。

以下是经过优化、健壮性增强的 floodFill 实现(已适配你的 DOM 结构与变量命名):

function floodFill(element) {
  // 1. 获取被点击的格子及其父容器
  const clickedItem = element;
  if (!clickedItem || !clickedItem.classList.contains('grid-item')) return;

  const gridContainer = clickedItem.parentNode;
  const gridItems = Array.from(gridContainer.children); // 转为数组便于索引操作
  const clickedIndex = gridItems.indexOf(clickedItem);

  // 2. 计算网格维度
  const selectedValue = myRange[indexRangeInput.value]; // 当前网格边长(如 8×8)
  const itemsPerRow = selectedValue;

  // 3. 获取原始颜色(注意:需处理空值或 transparent 情况)
  const originalColor = clickedItem.style.backgroundColor || 'white';

  // 4. 边界与终止条件检查(避免重复填充/栈溢出)
  if (originalColor === selectedColor) return; // 目标色与原色相同,直接退出

  // 5. 核心递归函数(DFS)
  function dfs(index) {
    // 越界检查
    if (index = gridItems.length) return;

    const current = gridItems[index];
    const currentColor = current.style.backgroundColor || 'white';

    // 颜色不匹配 → 终止递归分支
    if (currentColor !== originalColor) return;

    // 填充当前格子
    current.style.backgroundColor = selectedColor;

    // 向四个正交方向递归(上、下、左、右)
    // 注意:需防止跨行误连(如最右列向右会跳到下一行首列,故需额外行列校验)
    const row = Math.floor(index / itemsPerRow);
    const col = index % itemsPerRow;

    // 上:同一列,上一行
    if (row > 0) dfs(index - itemsPerRow);
    // 下:同一列,下一行
    if (row  0) dfs(index - 1);
    // 右:同一行,后一列(需防跨行)
    if (col <p>✅ <strong>关键设计说明:</strong>  </p>
  • 索引映射准确:利用 Array.from().indexOf() 获取点击格子在线性数组中的位置,并通过 Math.floor(index / itemsPerRow) 和 index % itemsPerRow 还原行列坐标,确保上下左右移动不越界或跨行错误。
  • 空背景兼容:|| 'white' 处理未显式设置 backgroundColor 的格子(默认为白色),避免 '' === originalColor 判定失效。
  • 提前终止优化:首行检查 originalColor === selectedColor,杜绝无意义递归,防止栈溢出或性能浪费。
  • 方向安全校验:每个方向移动前均验证行列有效性(如 row > 0、col

⚠️ 注意事项:

  • 递归深度风险:对于大网格(如 64×64),极端情况下可能触发浏览器调用栈限制。生产环境建议改用迭代版 BFS(借助 Array 模拟队列),代码更长但绝对安全。
  • 颜色匹配局限:当前依赖 style.backgroundColor 字符串全等匹配(如 "rgb(0, 0, 0)" === "rgb(0, 0, 0)")。若需支持 #000、black 等等效色,应引入标准化颜色解析函数(如转为十六进制或 HSL 统一比较)。
  • 事件绑定时机:确保 floodFill 仅在 isFillSelected 为 true 且 mousedown 触发时调用,避免与画笔逻辑冲突——你现有的事件监听结构已正确隔离。

至此,你的像素画板已具备专业级 Flood Fill 能力。只需将上述函数替换原 JS 中的空 floodFill 占位符,即可立即生效。后续可进一步扩展为 8 方向填充、抗锯齿边缘检测,或集成撤销栈以支持历史回退——坚实的基础,始于一次精准的递归遍历。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
html版权符号
html版权符号

html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.14

5175

7

html在线编辑器
html在线编辑器

html在线编辑器是用于在线编辑的工具,编辑的内容是基于HTML的文档。它经常被应用于留言板留言、论坛发贴、Blog编写日志或等需要用户输入普通HTML的地方,是Web应用的常用模块之一。php中文网为大家带来了html在线编辑器的相关教程、以及相关文章等内容,供大家免费下载使用。

2023.06.21

2992

4

html网页制作
html网页制作

html网页制作是指使用超文本标记语言来设计和创建网页的过程,html是一种标记语言,它使用标记来描述文档结构和语义,并定义了网页中的各种元素和内容的呈现方式。本专题为大家提供html网页制作的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.31

2650

5

html空格
html空格

html空格是一种用于在网页中添加间隔和对齐文本的特殊字符,被用于在网页中插入额外的空间,以改变元素之间的排列和对齐方式。本专题为大家提供html空格的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.01

2699

5

html是什么
html是什么

HTML是一种标准标记语言,用于创建和呈现网页的结构和内容,是互联网发展的基石,为网页开发提供了丰富的功能和灵活性。本专题为大家提供html相关的各种文章、以及下载和课程。

2023.08.11

4619

6

html字体大小怎么设置
html字体大小怎么设置

在网页设计中,字体大小的选择是至关重要的。合理的字体大小不仅可以提升网页的可读性,还能够影响用户对网页整体布局的感知。php中文网将介绍一些常用的方法和技巧,帮助您在HTML中设置合适的字体大小。

2023.08.11

2641

3

html转txt
html转txt

html转txt的方法有使用文本编辑器、使用在线转换工具和使用Python编程。本专题为大家提供html转txt相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.31

2429

3

html文本框代码怎么写
html文本框代码怎么写

html文本框代码:1、单行文本框【<input type="text" style="height:..;width:..;" />】;2、多行文本框【textarea style=";height:;"></textare】。

2023.09.01

2208

6

HTML嵌入CSS样式的方法
HTML嵌入CSS样式的方法

HTML嵌入CSS样式的方法有内联样式、内部样式表和外部样式表。本专题为大家提供CSS样式相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.20

2188

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.3万人学习