/*	evo3.java  evolving image*/import java.awt.*;import java.applet.Applet;import java.util.Date;import java.awt.event.*;import java.awt.geom.*;import java.lang.Math.*;import Randomizer;import evoBlock;import waveBox;import dataSpace;public class evo3 extends Applet 			implements MouseListener, MouseMotionListener, Runnable { 		//for mouse dragging:	boolean moving = false;	int mousedown;	int mouseup;		//for double buffering:	Dimension size;	Image buffer;	Graphics bufferGraphics;	Thread animator;	boolean please_stop;		//randomizer with time-based seed:	Date time = new Date();	long seed = time.getTime();	Randomizer r = new Randomizer(seed);		//initialization:	evoBlock[] block = new evoBlock[10000];		//state characteristics:	int number_blocks = 0;	int fill_here = 0;	int killed = 0;	int which_block;		//life_cycle clocking:	int special_clock = 1;		//wave_series:	waveBox[] wave = new waveBox[10];	boolean wave_moving;	int waveX = 0;	int waveY = 0;	int wave_clock = 0;	int number_waves = 1;		//dataspace:	dataSpace data = new dataSpace();			//paint():	int co = 0;	Color c1 = new Color(45, 45, 31); 				// green grey	Color c2 = new Color(247, 252, 242);	Color net = new Color(35, 20, 20);	Color c4;			//run();	int pause_factor = 14;								public void init() {		size = this.size();		buffer = this.createImage(size.width, size.height);		bufferGraphics = buffer.getGraphics();						addMouseListener(this);		addMouseMotionListener(this);			}			public void paint(Graphics g)  {		this.setBackground(c2);		bufferGraphics.setColor(this.getBackground());		bufferGraphics.fillRect(0, 0, size.width, size.height);				if(wave_moving) {			this.drawWaves();		}						for(int i=0; i<number_blocks; i++)  {			int x_val = block[i].getX();			int y_val = block[i].getY();			int delta = block[i].getSize();			int co = (block[i].getGen());			if(co>15) co = 6;						if(!block[i].anchored) {				c4 = new Color(co*co, co*co, co*co);			}			else {				int temp = 30-block[i].anchor_clock;				if(temp>=0 && temp<60) {					c4 = new Color(50+2*temp, 65+2*temp, 60+2*temp);				}				else c4 = new Color(170, 185, 180);			}							bufferGraphics.setColor(c4);			bufferGraphics.fillRect(x_val, y_val, delta, delta);			}				g.drawImage(buffer, 0, 0, this);	}		public void update(Graphics g) { paint(g); }			//method for runnable		public void run()  {		while(!please_stop) {			int birth = r.randomInt(5)+pause_factor;						if (special_clock%birth == 1) {				this.giveBirth();			}			if (special_clock%30 == 0) {				this.giveGen();				this.killEm();			}			if (wave_moving) {				this.waveSeries();			}			special_clock++;				//change to 20 before posting to web			try { Thread.sleep(20); } catch (InterruptedException e) { ; }			repaint();		}		animator = null;	}		public void giveBirth()  {		int children = r.randomInt(2)+1;		int height_range = data.getRange();		int locus = data.average_X();		int spread = data.getOsc()*2+30;		int val = data.howMany();		if(val>0) {			for (int i=0; i<children; i++)  {				//PEND- this will include density of loucs:				int x_val = r.randomInt(3200)%spread;				x_val = locus+(spread/2)-x_val;				int y_val = r.randomInt(2000)%height_range+(175-height_range/2);				block[number_blocks] = new evoBlock(x_val, y_val, 7);				number_blocks += 1;			}		}		else {			for (int i=0; i<children; i++)  {				int x_val = r.randomInt(3200)%600;				int y_val = r.randomInt(600)%16+167;				block[number_blocks] = new evoBlock(x_val, y_val, 7);				number_blocks += 1;			}		}	}	public void giveGen()  {		for(int i=0; i<number_blocks; i++) {			block[i].addGen();			block[i].tallyLife();			block[i].killingSpree();		}		this.updateData();	}		public void updateData() {		for(int i=0; i<number_blocks; i++) {			if(block[i].anchored) {				if(!block[i].data_member) {					data.addOrg(block[i]);					System.out.println(data.howMany());					block[i].data_member = true;				}			}		}	}		public void killEm()  {		fill_here = 0;		for(int i=0; i<(number_blocks); i++)  {							if(block[i].getAlive()) {					block[fill_here] = block[i];					fill_here += 1;				}				else if(block[i].data_member) {					data.removeOrg(i);					System.out.println(data.howMany());				}		}			number_blocks = fill_here;	}			public void start()  {		if (animator == null)  {			please_stop = false;			animator = new Thread(this);			animator.start();		}	}		public void stop() { please_stop = true; }  		// will he notice this - yes					//methods for mouse press, clicked, entered, exited -- MouseListener	public void mousePressed(MouseEvent event) {		if (number_blocks != 0) {			int X = event.getX();			int Y = event.getY();						for (int i=0; i<number_blocks; i++)  {				int block_x = block[i].getX();				int block_y = block[i].getY();				int delta = block[i].getSize();							if( X>block_x && X<(block_x+delta) )  {					if( Y>block_y && Y<(block_y+delta) )  {						if(!block[i].anchored) {							moving = true;							which_block = i;						}					}				}			}						if(!moving) {				wave_moving = true;				waveX = X;				waveY = Y;			}		}		}	public void waveSeries() {		if (wave_clock == 0) wave[0] = new waveBox(waveX, waveY, 1);		wave[0].growWave();				wave_clock++;				int top = waveY+(wave[0].getSize()/2);		int bottom = waveY-(wave[0].getSize()/2);		int left = waveX-(wave[0].getSize()/2);		int right = waveX+(wave[0].getSize()/2);						for(int i=0; i<number_blocks; i++) {			if(!block[i].anchored) {				int block_y = block[i].getY();				int block_x = block[i].getX();							if(block_y-top<4 && block_y-top>-2)  {					if(block_x-left>0 && right-block_x>0) {						block[i].setY(top+2);					}				}								if(block_y-bottom<4 && block_y-bottom>-2)  {					if(block_x-left>0 && right-block_x>0) {						block[i].setY(bottom-2);					}				}			}		}	}				//atempt at networking the anchored blocks		/*		for(int j=0; j<number_blocks; j++) {			int block_y = block[j].getY();			int block_x = block[j].getX();						if(block_x-right <4 && block_x-right>-2) {				if(bottom-block_y>0 && block_y-top<0) {					block[j].setX(right+2);				}			}						if(block_x-left <-2 && block_x-left>4) {				if(bottom-block_y>0 && block_y-top<0) {					block[j].setX(left-9);				}			}			}		*/		//public void makeNetworks() {	public void drawWaves() {		for (int i=0; i<number_waves; i++)  {			bufferGraphics.setColor(wave[i].color());						bufferGraphics.drawRect(wave[i].getX(), wave[i].getY(), wave[i].getSize(), wave[i].getSize());		}	}		public void mouseReleased(MouseEvent event) {		moving = false;		wave_moving = false; 		wave_clock = 0;		number_waves = 1;	}		public void mouseClicked(MouseEvent event) {			if (number_blocks != 0) {				int X = event.getX();			int Y = event.getY();				for (int i=0; i<number_blocks; i++)  {				int block_x = block[i].getX();				int block_y = block[i].getY();				int delta = block[i].getSize();							if( X>block_x && X<(block_x+delta) )  {					if( Y>block_y && Y<(block_y+delta) )  {						if(!block[i].anchored) {							which_block = i;														block[which_block].increaseSize(4);														}						else {							block[i].amp += 2;							block[i].anchor_clock += 180;							data.addOsc(2);						}					}				}			}		}	}		public void mouseEntered(MouseEvent event) {}	public void mouseExited(MouseEvent event) {}				//methods for mouse moved, dragged -- MouseMotionListener	public void mouseMoved(MouseEvent event) {}	public void mouseDragged(MouseEvent event) {		if (moving) {			int X = event.getX();			int Y = event.getY();						block[which_block].setX(X);			block[which_block].setY(Y);		}	}}