packagePolygonScanningAndFilling;importjava.util.ArrayList;importjava.util.Iterator;importjava.util.Stack;importjava.util.Timer;importjava.util.TimerTask;import javax.swing.*;import java.awt.*;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.KeyEvent;importjava.awt.event.KeyListener;importjava.awt.event.MouseAdapter;importjava.awt.event.MouseEvent;importjava.io.IOException;public class SeedFulling extendsJPanel {static intX0;static intY0;static intX1;static intY1;static int a[]=new int [10]; //保存点击的10个x坐标
static int b[]=new int [10]; //保存点击的10个y坐标
static int index=0;static int time=0;static int time2=0;static booleanadd;
ArrayListallPoint=new ArrayList();
ArrayListdrawPoint=new ArrayList();
@Overrideprotected voidpaintComponent(Graphics g) {super.paintComponent(g);this.addMouseListener(newMouseAdapter() {public voidmouseExited(MouseEvent e) {
time++;
repaint();
}public voidmouseClicked(MouseEvent e) {
allPoint.clear();if(e.getButton() ==e.BUTTON1) {
add=true;if(index!=0)
{for(int i=0;i
{if(a[i]==e.getX()&&b[i]==e.getY())
add=false;
}
}if(add)
{ a[index]=e.getX();
b[index]=e.getY();
System.out.println("坐标为("+a[index]+","+b[index]+")");
index++;//frame.setVisible(true);
repaint();
System.out.print(time2);if(time2==0)
time2++;
}
}//if(e.getButton() == e.BUTTON3)//{//
//}
}
});
Graphics2D g2d=(Graphics2D)g;int Ymax=0;for(int i=0;i
{if(Ymax
Ymax=b[i];
}//System.out.println("Ymax"+Ymax);
/** 画出多边形*/
if(time2!=0)
{int Sum=0;for(;Sum<=index;Sum++) {if(Sum==index-1)
{
drawLine(a[Sum], b[Sum], a[0],b[0],g2d);break;
}else{
drawLine(a[Sum], b[Sum], a[Sum+1],b[Sum+1],g2d);
}
}
}/** 得到边界点*/
if(time!=0) {booleanspanNeedFill;
location l=newlocation();
l.x=a[0]+10;
l.y=b[0]+10;
Stack stack=new Stack(); //将第一个点压入栈
stack.push(l);int a=0;while(!stack.empty())
{
a++;
System.out.print("第"+a+"次");
location lo=stack.pop();int x=lo.x;int y=lo.y;if(a>50)
{ System.out.println("开始画上时x"+x);
System.out.println("开始画上时y"+y);
}//System.out.print("y"+y);
while(!allPoint.contains(new Point(x,y))&&!drawPoint.contains(newPoint(x,y)))
{//System.out.print(x);
drawPoint.add(newPoint(x,y));//System.out.println("需画点"+x+","+y);
x++;
}int xr=x-1;
x=lo.x-1;while(!allPoint.contains(new Point(x,y))&&!drawPoint.contains(newPoint(x,y)))
{
drawPoint.add(newPoint(x,y));//System.out.println("需画点"+x+","+y);//g2d.drawString(".", x,y);
x--;
}int xl=x+1;//处理上面的扫描线
x=xl;
y=y+1;while(x<=xr) {
spanNeedFill=false;while(!allPoint.contains(new Point(x,y))&&!drawPoint.contains(newPoint(x,y)))
{
spanNeedFill=true;
x++;//System.out.println("上扫描线边界为"+x);
}if(spanNeedFill)
{//System.out.print("入栈1");
location lc=newlocation();
lc.x=x-1;
lc.y=y;
stack.push(lc);//System.out.println("入栈1,此时 x="+lc.x);//System.out.println("入栈1,此时 y="+lc.y);
spanNeedFill=false;
}while(allPoint.contains(new Point(x,y))||drawPoint.contains(new Point(x,y))&&x<=xr)
x++;
}//下扫描线
x=xl;
y=y-2;while(x<=xr)
{
spanNeedFill=false;while(!allPoint.contains(new Point(x,y))&&!drawPoint.contains(newPoint(x,y)))
{
spanNeedFill=true;
x++;
}if(spanNeedFill)
{//System.out.print("入栈2");
lo.x=x-1;
lo.y=y;
stack.push(lo);
System.out.print("入栈2");
spanNeedFill=false;
}while(allPoint.contains(new Point(x,y))||drawPoint.contains(new Point(x,y))&&x<=xr)
x++;
}
}for(int i=0;i
{//System.out.println("画的y"+p.y);
Point p=drawPoint.get(i);
System.out.println("画的x"+p.x+"画的y"+p.y);
g2d.drawString(".",p.x,p.y);
}
}
}private static voidcreateAndShowGUI() {
JFrame frame= newJFrame();
frame.setLocationRelativeTo(null);
frame.setLayout(null);
JPanel jp=newJPanel();
frame.setVisible(true);
frame.setContentPane(newSeedFulling());
frame.setSize(600, 600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}public void drawLine(int x0,int y0,int x1,inty1,Graphics2D g) {int x =x0;int y =y0;int w = x1 -x0;int h = y1 -y0;int dx1 = w < 0 ? -1: (w > 0 ? 1 : 0);int dy1 = h < 0 ? -1: (h > 0 ? 1 : 0);int dx2 = w < 0 ? -1: (w > 0 ? 1 : 0);int dy2 = 0;int fastStep =Math.abs(w);int slowStep =Math.abs(h);if (fastStep <=slowStep) {
fastStep=Math.abs(h);
slowStep=Math.abs(w);
dx2= 0;
dy2= h < 0 ? -1 : (h > 0 ? 1 : 0);
}int numerator = fastStep>> 1;for (int i = 0; i <=fastStep; i++) {
g.drawString(".", x, y);
Point p=newPoint(x,y);
allPoint.add(p);
numerator+=slowStep;if (numerator >=fastStep) {
numerator-=fastStep;
x+=dx1;
y+=dy1;
}else{
x+=dx2;
y+=dy2;
}
}
}public static void main(String[] args) throwsIOException {
createAndShowGUI();
}
}