java填充算法_JAVA实现种子填充算法

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();

}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值