用C写的图形学填充算法已经很多了,看到不少帖子都是在问关于如何用Java编写图形学的填充算法,说来也巧,我刚好要做一个这个方面的实验,用的是扫描线种子填充算法,由于时间仓促,代码质量可能不算很高,希望大家见谅,并希望大家都来为我指点一下,小弟不胜感激~~
好了,废话就不说了,我们先一起来看一下相关的知识~
扫描线种子填充算法思想
首先填充种子所在的尚未填充的一区段,然后确定与这一区段相邻的上下两条扫描线上位于该区段内是否存在需要填充的新区段,如果存在,则依次把每个新区段最右端的象素作为种子放入堆栈。反复这个过程,直到堆栈为空。
扫描线种子填充算法步骤
1、初始化堆栈。
2、种子压入堆栈。
3、While(堆栈非空)从堆栈弹出种子象素。
{
(1)如果种子象素尚未填充,则:
① 求出种子区段:xleft、xright。
② 填充整个区段。
(2)检查相邻的上扫描线的xleft ≤ x ≤ xright区间内,是否存在需要填充的新区段,如果存在,则把每个新区段在xleft ≤ x ≤ xright范围内的最右边的象素,作为新的种子象素依次压入堆栈。
(3)检查相邻的下扫描线的xleft≤x≤xright区间内,是否存在需要填充的新区段,如果存在,则把每个新区段在xleft≤x≤xright范围内的最右边的象素,作为新的种子象素依次压入堆栈。
}
以上是一些相关的知识提要,接下来是一份算法的Java代码:
包括两个类:
package com.tony.view;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.Robot;
import java.awt.image.BufferedImage;
import java.util.Vector;
import javax.swing.JPanel;
public class DrawComponentPanel extends JPanel {
private int[] xPoints = new int[4];
private int[] yPoints = new int[4];
private Color fillColor;
private Color curColor;
private boolean fill = false;
public DrawComponentPanel() {
xPoints[0] = 0;
xPoints[1] = 0;
xPoints[2] = 0;
xPoints[3] = 0;
yPoints[0] = 0;
yPoints[1] = 0;
yPoints[2] = 0;
yPoints[3] = 0;
}
protected void paintComponent(final Graphics g) {
super.paintComponent(g);
Robot robot = null;
Point p;
try {
robot = new Robot();
} catch (