实现“扫描线种子填充算法”完整代码(Java)

流程

下面是使用扫描线种子填充算法填充区域的基本步骤:

步骤 描述
1 选择种子点(Seed Point),并将其加入种子点队列(Seed Queue)
2 循环直到种子点队列为空:
3 从队列中取出一个种子点
4 向上下左右四个方向扫描像素,并判断是否需要填充
5 如果需要填充,则填充该像素并将其加入种子点队列

代码实现

定义Seed类

public class Seed {
    int x;
    int y;

    public Seed(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

扫描线种子填充算法实现

import java.util.LinkedList;
import java.util.Queue;

public class ScanLineSeedFill {
    public static void seedFill(int[][] image, int seedX, int seedY, int fillColor) {
        int width = image.length;
        int height = image[0].length;

        Queue<Seed> seedQueue = new LinkedList<>();
        seedQueue.offer(new Seed(seedX, seedY));

        while (!seedQueue.isEmpty()) {
            Seed seed = seedQueue.poll();
            int x = seed.x;
            int y = seed.y;

            if (x >= 0 && x < width && y >= 0 && y < height && image[x][y] != fillColor) {
                image[x][y] = fillColor;
                seedQueue.offer(new Seed(x + 1, y));
                seedQueue.offer(new Seed(x - 1, y));
                seedQueue.offer(new Seed(x, y + 1));
                seedQueue.offer(new Seed(x, y - 1));
            }
        }
    }
}

主函数示例

public class Main {
    public static void main(String[] args) {
        int[][] image = new int[10][10];
        int seedX = 5;
        int seedY = 5;
        int fillColor = 1;

        ScanLineSeedFill.seedFill(image, seedX, seedY, fillColor);
    }
}

类图

classDiagram
    class Seed {
        int x
        int y
        Seed(int x, int y)
    }
    class ScanLineSeedFill {
        + seedFill(int[][] image, int seedX, int seedY, int fillColor)
    }
    class Main {
        + main(String[] args)
    }

甘特图

gantt
    title 扫描线种子填充算法实现时间表
    section 初始化
        Seed类实现             :done, des1, 2021-10-01, 2d
        ScanLineSeedFill类实现 :done, des2, after des1, 3d
    section 开发
        Main函数示例代码编写   :active, a1, 2021-10-04, 2d
    section 测试
        测试代码功能           :a2, after a1, 3d

通过以上流程、代码实现和类图,我们可以很好地实现扫描线种子填充算法。希本这篇文章对你有所帮助,加油!