/*-------------------------------// DLA 2002/3/1 Ishihama Yoshiaki //------------------------------*/ import java.awt.*; import java.applet.*; import java.io.*; import java.lang.String; import java.util.Random; import java.util.Date; public class DLA extends Applet implements Runnable { Thread runner; int WIDTH,HEIGHT; Graphics g2; Random nrand; int MaxNum; int RAD,MAXRAD, cx,cy,num; int P[][],p0[]; boolean moving=false; public void init() { Date d=new Date(); nrand=new Random(d.getTime()); WIDTH=this.size().width; HEIGHT=this.size().height; String s; g2=this.getGraphics(); g2.setColor(Color.black); g2.fillRect(0,0,WIDTH,HEIGHT); s=getParameter("NUM"); if (s==null) MaxNum=1000; else MaxNum = Integer.parseInt(s); setBackground(Color.black); setForeground(Color.white); cx=WIDTH/2; cy=HEIGHT/2; P=new int[MaxNum][2]; p0=new int[2]; P[0][0]=0; P[0][0]=0; num=1; drawPoint(P[0],true); RAD=10; MAXRAD=20; } public void start() { if (runner == null) { runner= new Thread(this); runner.start(); } } public void stop() { if (runner!=null) { runner.stop(); runner=null; } } public void run() { while (true) { try { Thread.sleep(10); } catch (InterruptedException e){}; if ( isVisible() ) { DomyRun(); } } } public void DomyRun()//----------------------------------// { if(!moving){ doGetNewP(p0); moving=true; drawPoint(p0,true); } if(!doCheckOver(p0,num)) drawPoint(p0,false); switch(randomise(4)){ case 0: p0[0] --; break; case 1: p0[0] ++; break; case 2: p0[1] --; break; case 3: p0[1] ++; break; } if(doCheckOut(p0)) { moving=false;} else{ drawPoint(p0,true); if(doCheck(p0,num)){ P[num][0]=p0[0]; P[num][1]=p0[1]; num++; if(num>=MaxNum) DomyInit(); else{ moving=false; doCalcMinRad(num); } } } }//-----------------------------------------------------// public void paint(Graphics g2) { //g2.drawImage(offscreen, 0, 0,Color.black,this); } int myabs(int s) { if(s<0) return -s; return s; } private void doGetNewP(int dst[]) { int xx,yy,s0,min,max; int val; min=(RAD*RAD*3)/4; max=(RAD*RAD*4)/3; val=(RAD*3)/2; while(true){ xx=randomise(val*2)-val; yy=randomise(val*2)-val; s0=xx*xx + yy*yy; if(s0min) break; } dst[0]=xx; dst[1]=yy; } private boolean doCheck(int src[],int N) { int i; for(i=0;i1 || y>1) return false; return true; } private boolean doCheckOut(int src[]) { int xx,yy,s0; xx=src[0]; yy=src[1]; s0=xx*xx + yy*yy; if(s0>MAXRAD*MAXRAD) return true; return false; } private void drawPoint(int srcP[],boolean draw) { if(draw) g2.setColor(Color.cyan); else g2.setColor(Color.black); g2.drawLine(srcP[0]+cx,srcP[1]+cy,srcP[0]+cx,srcP[1]+cy); } private void doCalcMinRad(long N) { int i,n0=0,xx,yy,val; double d0; for(i=0;in0) n0=val; } d0=n0; d0=Math.sqrt(d0); RAD=(int)d0; if(RAD<10) RAD=10; MAXRAD=RAD*2; if(MAXRAD - RAD>100) MAXRAD=RAD+100; } private boolean doCheckOver(int src[],long N) { int i; for(i=0;i