Java种子填充算法 四向和八向

种子填充算法多用于计算机对图形的处理。例如ps中填充区域一样。当我们要填充某一块区域,首先我们要让电脑识别出你要填充的每个像素点,种子算法通过给定种子的坐标获取该像素的颜色值,通过对比颜色信息来判断周围的像素是否是我们要选择的。

接下来我们用一个字符数组来代表我们的图片,*号的点则是我们要选中的像素,选择后我们则将他改成#。

第一种:四向填充         

我们没给定一个种子,我们则只获取左、上、右、下四个点。通过递归或循环处理所有的点。但是用递归会存在递归的深度问题,当我们的图片足够大时,Java虚拟机就会报出栈溢出的错误!

所以我们选取循环+队列的方式。我们都知道队列有个特性:先进先出!当我们根据种子点获取周围四个点加入队列,下一次循环则从队列头部去除一个点作为下一次的种子,并删除他,依次这样循环直到队列大小为零则停止。

Demo1.COL、Demo1.ROW为定义字符数组的行列

/**
	 * 四向
	 * @param seed
	 */
	public void DemoFill4(Point se) {
		Point seed = se;
		do {
			//左
			if(0<=(seed.x-1)&&(seed.x-1)<Demo1.ROW&&0<=(seed.y)&&(seed.y)<Demo1.COL&&!point[seed.x-1][seed.y].equals(c)) {
				point[seed.x-1][seed.y] = c;
				queue.offer(new Point(seed.x-1,seed.y));
				
			}
			//上
			if(0<=(seed.x)&&(seed.x)<Demo1.ROW&&0<=(seed.y-1)&&(seed.y-1)<Demo1.COL&&!point[seed.x][seed.y-1].equals(c)) {
				point[seed.x][seed.y-1] = c;
				queue.offer(new Point(seed.x,seed.y-1));
				
			}
			//右
			if(0<=(seed.x+1)&&(seed.x+1)<Demo1.ROW&&0<=(seed.y)&&(seed.y)<Demo1.COL&&!point[seed.x+1][seed.y].equals(c)) {
				point[seed.x+1][seed.y] = c;
				queue.offer(new Point(seed.x+1,seed.y));
				
			}
			//下
			if(0<=(seed.x)&&(seed.x)<Demo1.ROW&&0<=(seed.y+1)&&(seed.y+1)<Demo1.COL&&!point[seed.x][seed.y+1].equals(c)) {
				point[seed.x][seed.y+1] = c;
				queue.offer(new Point(seed.x,seed.y+1));
				
			}

			if(queue.size()>0) {
				point[seed.x][seed.y] = c;
				Point s = (Point) queue.poll();
				point[s.x][s.y] = c;
				seed = s;
				
				
			}else {
				return;
			}

		}while(true);

	}

为了提高算法的性能,则可以在加入周围点的同时也改变周围点。

 

第二种:八向填充       八向填充和四向不同的地方就是他选取了八个方向的点主要是解决边角问题。

/**
	 * 八向
	 * @par
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 种子填充算法是一种图形学中的填充算法,用于填充封闭区域内的颜色。Java中可以通过以下步骤实现种子填充算法: 1. 从一个种子点开始,将其颜色设置为目标颜色。 2. 检查该点周围的像素,如果该像素颜色与原始颜色相同,则将其颜色设置为目标颜色,并将其加入队列中。 3. 重复步骤2,直到队列为空。 以下是Java代码实现: ```java import java.awt.Color; import java.awt.image.BufferedImage; import java.util.LinkedList; import java.util.Queue; public class SeedFill { public static void seedFill(BufferedImage image, int x, int y, Color targetColor, Color replacementColor) { Queue<Point> queue = new LinkedList<>(); queue.add(new Point(x, y)); while (!queue.isEmpty()) { Point p = queue.remove(); int px = p.getX(); int py = p.getY(); if (image.getRGB(px, py) == targetColor.getRGB()) { image.setRGB(px, py, replacementColor.getRGB()); if (px > 0) { queue.add(new Point(px - 1, py)); } if (px < image.getWidth() - 1) { queue.add(new Point(px + 1, py)); } if (py > 0) { queue.add(new Point(px, py - 1)); } if (py < image.getHeight() - 1) { queue.add(new Point(px, py + 1)); } } } } private static class Point { private int x; private int y; public Point(int x, int y) { this.x = x; this.y = y; } public int getX() { return x; } public int getY() { return y; } } } ``` 在使用该算法时,可以先创建一张空白的图片,然后在需要填充的区域上使用Graphics2D绘制出形状,最后传入图片、种子点、目标颜色和替换颜色调用`seedFill`方法即可。 ### 回答2: 种子填充算法是图形学中的一种常见算法,它用于填充某个封闭区域。下面是用Java编写图形学的种子填充算法的思路和步骤。 首先,我们需要定义一个二维数组(或者是一个图片)来表示图形的像素。假设该数组为pixels。 接下来,我们需要定义一个种子点,它是区域内部的一个点。假设该点的坐标为(x,y)。 然后,我们以该种子点为起点,从该点开始递归填充区域。传入参数为该点的坐标和所需填充的颜色。 在递归填充的函数中,首先判断当前点是否在区域内部。如果当前点在区域内部,那么将该点的颜色设置为所需填充的颜色。 接下来,判断当前点的四个相邻点(上、下、左、右)。如果相邻点的颜色与当前点的颜色一致,并且该相邻点没有被填充过,那么将该相邻点加入到递归队列中,继续下一轮递归。这样就可以实现种子填充的效果。 最后,当递归队列为空时,即所有相邻点都被填充过,算法结束。 通过以上步骤,我们就可以用Java编写图形学的种子填充算法。该算法可以实现对封闭区域的填充操作,为图形学领域中的图像处理和绘图提供了一种重要的技术手段。 ### 回答3: 种子填充算法(Seed Fill Algorithm)是一种图形学算法,用于将指定种子点附近的相邻像素填充成指定的颜色或图案。在Java编程语言中,我们可以使用图形库(如Java AWT或JavaFX)来实现种子填充算法。 首先,我们需要创建一个画布来绘制图形,并定义种子点的位置和填充的颜色。然后,我们可以使用递归或队列的方式遍历种子点附近的像素,并将其填充成指定的颜色。以下是使用递归实现种子填充算法的简单示例代码: ```java import java.awt.Color; import java.awt.Graphics; import javax.swing.JFrame; import javax.swing.JPanel; public class SeedFillAlgorithm extends JPanel { private static final int WIDTH = 400; private static final int HEIGHT = 400; private Color fillColor = Color.RED; private int seedX = WIDTH/2; private int seedY = HEIGHT/2; public void paint(Graphics g) { seedFill(g, seedX, seedY); } private void seedFill(Graphics g, int x, int y) { Color pixelColor = new Color(g.getRGB(x, y)); if (pixelColor.equals(fillColor)) { return; } g.setColor(fillColor); g.fillRect(x, y, 1, 1); if (x > 0) { seedFill(g, x-1, y); } if (x < WIDTH-1) { seedFill(g, x+1, y); } if (y > 0) { seedFill(g, x, y-1); } if (y < HEIGHT-1) { seedFill(g, x, y+1); } } public static void main(String[] args) { JFrame frame = new JFrame("Seed Fill Algorithm"); frame.setSize(WIDTH, HEIGHT); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); SeedFillAlgorithm panel = new SeedFillAlgorithm(); frame.add(panel); frame.setVisible(true); } } ``` 上述代码创建了一个窗口,绘制了一个尺寸为400x400像素的画布,并将种子点位置设为画布中心。通过调用`seedFill`方法,使用递归方式进行种子填充。在`seedFill`方法中,首先获取当前像素点的颜色,如果与填充颜色相同则返回,否则使用`fillColor`将该像素点填充,并递归调用`seedFill`方法填充其上下左右四个相邻像素。 通过运行上述代码,可以在窗口中看到一个填充了指定颜色的区域,该区域以种子点为中心向外扩散填充。这就是使用Java编写的种子填充算法的简单实现。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值