// // Java Flies - http://www.alxvy.org // // // You are welcome to do whatever you wish with this code, as long // as Jeff Cragg and I (Alex Vulliamy) are given a credit. // updated 12th February 98 to speed it up // updated 3rd March 98 to make it less processor-greedy // updated 10th March to speed up a little bit by not drawing background in first // updated 5th April 98 to add controls // updated 19th April 98 to stop bugs due to browser's ill-written java VMs // updated 13th January 2001 to make 3d. Also fixed minor bug with explorer import java.awt.*; import java.applet.*; import java.io.*; import java.lang.String; import java.util.Random; import java.util.Date; public class flies3d extends Applet implements Runnable { Image off_g; int delay=20; int delaymax=80; int delaymin=5; Label l1,l2; Thread runner; Random nrand; int NF; int REVDIST; int ACC; int ACCTOMID; int MAXSPEED; int BOUNCESPEED; int[] flyx; int[] flyy; int[] flyz; int[] flyvx; int[] flyvy; int[] flyvz; int[][] flyn; int[] lpx; int[] lpy; int[] lpz; int[] lp2x; int[] lp2y; int[] lp2z; int WIDTH,HEIGHT,DEPTH,ZOOM; int j; Graphics g,g2; Panel flypanel=new Panel(); Panel flycontrols=new Panel(); BorderLayout layout=new BorderLayout(); GridLayout layout2=new GridLayout(2,2); Scrollbar nfscroll=new Scrollbar(Scrollbar.HORIZONTAL); Scrollbar speedscroll=new Scrollbar(Scrollbar.HORIZONTAL); public int rand(int range) { return( java.lang.Math.abs(nrand.nextInt()) % range); } public void init() { Float temp; Date d=new Date(); nrand=new Random(0); // d.getTime() setBackground(Color.black); setForeground(Color.white); String s; s=getParameter("NF"); if (s==null) NF=30; else NF = Integer.parseInt(s); s=getParameter("REVDIST"); if (s==null) REVDIST=2000000; else REVDIST = Integer.parseInt(s); s=getParameter("ACCTOMID"); if (s==null) ACCTOMID=10; else { temp=new Float(s); ACCTOMID = 100*temp.intValue(); } s=getParameter("ACC"); if (s==null) ACC=30; else { temp=new Float(s); ACC = 100*temp.intValue(); } s=getParameter("MAXSPEED"); if (s==null) MAXSPEED=500; else { temp=new Float(s); MAXSPEED = 100*temp.intValue(); } s=getParameter("BOUNCESPEED"); if (s==null) BOUNCESPEED=80; else { temp=new Float(s); BOUNCESPEED = 100*temp.intValue(); } flyx = new int[NF*3+1]; flyy = new int[NF*3+1]; flyz = new int[NF*3+1]; flyvx = new int[NF*3+1]; flyvy = new int[NF*3+1]; flyvz = new int[NF*3+1]; flyn = new int[NF*3+1][2]; lpx = new int[NF*3+1]; lpy = new int[NF*3+1]; lpz = new int[NF*3+1]; lp2x = new int[NF*3+1]; lp2y = new int[NF*3+1]; lp2z = new int[NF*3+1]; int i; setLayout(layout); add("Center",flypanel); add("South",flycontrols); speedscroll.setValues(delaymax-delay,delaymax/4,0,delaymax-delaymin); nfscroll.setValues(NF,3*NF/4,0,NF*3); flycontrols.setLayout(layout2); flycontrols.add(nfscroll); flycontrols.add(speedscroll); l1=new Label("Number"); l1.setAlignment(Label.CENTER); l2=new Label("Speed"); l2.setAlignment(Label.CENTER); flycontrols.add(l1); flycontrols.add(l2); validate(); speedscroll.setValue(delaymax-delay); nfscroll.setValue(NF); WIDTH=this.size().width; HEIGHT=flypanel.size().height; DEPTH=(WIDTH+HEIGHT)/2; ZOOM=2*DEPTH/3; flypanel.setBackground(Color.black); for(i=0;iMAXSPEED) flyvx[tick]=MAXSPEED; if (flyvx[tick]<-MAXSPEED) flyvx[tick]=-MAXSPEED; if (flyvy[tick]>MAXSPEED) flyvy[tick]=MAXSPEED; if (flyvy[tick]<-MAXSPEED) flyvy[tick]=-MAXSPEED; if (flyvz[tick]>MAXSPEED) flyvz[tick]=MAXSPEED; if (flyvz[tick]<-MAXSPEED) flyvz[tick]=-MAXSPEED; if (flyx[tick]<0) flyvx[tick]=BOUNCESPEED; if (flyx[tick]>WIDTH*100) flyvx[tick]=-BOUNCESPEED; if (flyy[tick]<0) flyvy[tick]=BOUNCESPEED; if (flyy[tick]>HEIGHT*100) flyvy[tick]=-BOUNCESPEED; if (flyz[tick]<0) flyvz[tick]=BOUNCESPEED; if (flyz[tick]>DEPTH*100) flyvz[tick]=-BOUNCESPEED; if (flyx[tick]WIDTH*50) flyvx[tick]-=ACCTOMID; if (flyy[tick]HEIGHT*50) flyvy[tick]-=ACCTOMID; if (flyz[tick]DEPTH*50) flyvz[tick]-=ACCTOMID; flyx[tick]+=flyvx[tick]; flyy[tick]+=flyvy[tick]; flyz[tick]+=flyvz[tick]; } public void doneighbours(int tick) { // this re-assigns neighbours if the neighbour's neighbours are closer to the fly than the // neighbours. int k,l,m; for (k=0;k<2;k++) { m=flyn[tick][k]; for (l=0;l<2;l++) { if (dist(flyn[m][l],tick)