🌱 种子填充算法

Seed Fill Algorithm - 从种子点开始递归/迭代填充封闭区域

边界(障碍物)
填充颜色
当前处理点
种子点

🎮 控制面板

📍 模式:绘制边界
点击并拖动鼠标绘制边界

操作模式:

✏️ 绘制边界
🌱 选择种子

填充算法:

动画速度:

50 ms/步
📊 填充统计:
已填充像素:0
栈/队列大小:0
处理速度:0 像素/秒
栈/队列状态:
等待开始...

💡 种子填充算法原理

🔑 核心思想:
从一个种子点(Seed Point)开始,向四周扩散填充,直到遇到边界或已填充区域为止。

算法类型:

1. 四连通(4-Connected)填充
从当前点扩散到4个相邻点:
    ↑
  ← ● →   只考虑上下左右
    ↓

邻居:(x, y-1), (x, y+1), (x-1, y), (x+1, y)
            
2. 八连通(8-Connected)填充
从当前点扩散到8个相邻点:
  ↖ ↑ ↗
  ← ● →   包含对角线方向
  ↙ ↓ ↘

邻居:上述4个 + (x-1,y-1), (x+1,y-1), (x-1,y+1), (x+1,y+1)
            

实现方法:

方法1:递归实现(简单但可能栈溢出)
function floodFill(x, y, targetColor, fillColor) {
    // 越界检查
    if (x < 0 || y < 0 || x >= width || y >= height) return;
    
    // 检查是否需要填充
    if (getPixel(x, y) != targetColor) return;
    if (getPixel(x, y) == fillColor) return;
    
    // 填充当前像素
    setPixel(x, y, fillColor);
    
    // 递归填充邻居(4-连通)
    floodFill(x+1, y, targetColor, fillColor);
    floodFill(x-1, y, targetColor, fillColor);
    floodFill(x, y+1, targetColor, fillColor);
    floodFill(x, y-1, targetColor, fillColor);
}
            
方法2:栈/队列实现(推荐,避免栈溢出)
function floodFill(seedX, seedY, targetColor, fillColor) {
    const stack = [{x: seedX, y: seedY}];
    
    while (stack.length > 0) {
        const {x, y} = stack.pop();  // 或 shift() 用于队列
        
        // 检查并填充
        if (x < 0 || y < 0 || x >= width || y >= height) continue;
        if (getPixel(x, y) != targetColor) continue;
        if (getPixel(x, y) == fillColor) continue;
        
        setPixel(x, y, fillColor);
        
        // 将邻居加入栈
        stack.push({x: x+1, y: y});
        stack.push({x: x-1, y: y});
        stack.push({x: x, y: y+1});
        stack.push({x: x, y: y-1});
    }
}
            
⚡ 关键点:
✓ 需要记录原始颜色(targetColor)
✓ 填充颜色不能与原始颜色相同
✓ 已填充的点不再处理(避免死循环)
✓ 使用栈(DFS)或队列(BFS)管理待处理点

应用场景:

优化技巧:

🎓 使用说明

  1. 绘制边界:选择"绘制边界"模式,点击并拖动鼠标画出封闭区域
  2. 选择种子点:切换到"选择种子"模式,在封闭区域内点击一个点
  3. 选择算法:选择4-连通或8-连通填充方式
  4. 开始填充:点击"开始填充"按钮,观看动画演示
  5. 调整速度:使用滑块控制动画速度
💡 提示:
• 试试在复杂形状中放置种子点
• 对比4-连通和8-连通的填充差异
• 观察栈/队列的大小变化
• 点击"加载示例"可以快速测试