import java.applet.*; import java.awt.*; import java.awt.image.*; import java.awt.event.*; import java.io.*; import java.net.*; import java.text.*; import java.util.*; import java.util.zip.*; import netscape.javascript.*; import javax.comm.*; import javax.sound.midi.*; import javax.sound.midi.spi.*; import javax.sound.sampled.*; import javax.sound.sampled.spi.*; import javax.xml.parsers.*; import javax.xml.transform.*; import javax.xml.transform.dom.*; import javax.xml.transform.sax.*; import javax.xml.transform.stream.*; import org.xml.sax.*; import org.xml.sax.ext.*; import org.xml.sax.helpers.*; public class florafauna_1b extends BApplet {// FLORA-FAUNA -  something between trees and neurons
// built with processing alpha 0.68
// 5 august 2004
// by Alessandro Capozzo  
// www.abstract-codex.net
// www.ghostagency.net 
float vectX=0;
float vectY=0;
float posX=100;
float posY=100;
float noiseM;
float pos;
int num;
int counter;
cell[] amount;
void setup(){
size(600,600);
background(230,230,220);
startAgain(15,2,12,3);
} 
void startAgain(int n,int nRaggio, int coefN, int coefR){
 int startN=n;
 int startCoefN=coefN;
 int startCoefR=coefR;
 int startRadius=nRaggio;
 background(230,230,220);
 num=4+(int)(random(startN));
 vectX=0;
 vectY=0;
 posX=300;
 posY=300;
 float numAng=TWO_PI/num;
 float numAngR=PI/(num*startRadius);
 float distP;
 amount=new cell[num];
 for (int index=0;index<num;index++){
    distP=40+random(startCoefN)*10;
   float newAng=numAng*index+(random(startCoefR)*numAngR);
   amount[index]=new cell(newAng,distP,100,posX,posY);
 }
}
void mouseReleased(){
startAgain(15,4,12,10);
}
void loop(){
 counter++;
 for(int i=0; i<num; i++) { 
   
   if (amount[i].stopMe){
     if (amount[i].checkDist()){
     amount[i].draw(); 
         } else {
         float q=(PI*.01f)*random(15);
     float nang=amount[i].Ang_target-(q);
     float x=amount[i].posX;
     float y=amount[i].posY;
     float a=amount[i].alphaPar;
     float d=amount[i].maxDist;
     d=d-((d*.1f)*random(4));
     cell pippo=new cell(nang,d,a, x, y);
     add(pippo);
     //ramo 2
     nang=amount[i].Ang_target+((PI*.2f)-q);
     x=amount[i].posX;
     y=amount[i].posY;
     d=amount[i].maxDist;
     d=d-((d*.1f)*random(4));
     pippo=new cell(nang,d,a, x, y);
     add(pippo);
     removeA(i);
     }
     
     
     }
  } 
}
// this piece of code is based on a Ben Fry's example
void add(cell what) { 
  if (num == amount.length) {  
    cell temp[] = new cell[num<<1]; 
    System.arraycopy(amount, 0, temp, 0, num); 
    amount = temp; 
  } 
  amount[num++] = what; 
}
//
void removeA(int who) { 
     amount[who].stopMe=false;
     }
class cell{
    float vectY,vetX,noiseM;
    float Ang_target;
    float posX,posY;
    float coef;
    float oldx,oldy;
    float alphaPar;
    float originX,originY;
    float maxDist;
       public boolean stopMe;
    cell (float ang,float distP, float range, float myX, float myY){
    Ang_target=ang;
    posX=myX;
    posY=myY;
    originX=myX;
    originY=myY;
    vectX=0;
    vectY=0;
    coef=(distP/50)*(ang/ang);
    alphaPar=range;
    maxDist=distP;
    stopMe=true;
      }
     boolean checkDist(){
       if (dist(posX,posY,originX,originY)<maxDist){
          return true;
      } else {
          return false;
          
          }
     }
    void draw(){
   noiseM=noise(posX,posY,Ang_target);
   pos=Ang_target;
   vectY=sin(pos)+(coef*(noiseM-.5f));
   vectX=cos(pos)+(coef*(noiseM-.5f));
   oldx=posX;
   oldy=posY;
   posX+=vectX;
   posY+=vectY;
   alphaPar=alphaPar-.35f;
   stroke(250-noiseM*100,220-noiseM*80,210-noiseM*100,alphaPar);
   line(oldx,oldy,posX,posY);
   //spegne cell e ricorsivit\u00e0
   if((alphaPar<=2)||(maxDist<2)){
     stopMe=false;
   }
   
    }
}
}