//import controlP5.*; //ControlP5 cp5; button resetbutton = new button(); button stepbutton = new button(); switch_button runbutton = new switch_button(); switch_button showzoa = new switch_button(); switch_button showdata = new switch_button(); switch_button zoachoice = new switch_button(); switch_button degrade = new switch_button(); slider cc = new slider(); slider rateslider = new slider(); slider initialslider = new slider(); slider stochasticslider = new slider(); int initial_CC = 800; boolean step = false; int buttonsX = 95; int buttonsY = 340; int buttonsR = 20; float Rate = 0.9; //int Go = 0; int capacity = initial_CC; boolean plotdatatoggle = true; boolean plotzoatoggle = true; int initial = 4; int pop_size = 0; zoon population[] = new zoon[2000]; boolean initialized = false; int delta = 0; float stochastic; int maxdata = 10000; dataelement alldata[] = new dataelement[maxdata]; int datapoint = 0; int mode = 1; int num_images = 2; int imagenumber; PImage zoonimage[] = new PImage[num_images]; PImage ibestlogo = new PImage(); PImage engineeringlogo = new PImage(); int nextupdate = 0; boolean degradetoggle = true; boolean runboolean = false; boolean resetboolean = true; void setup(){ zoonimage[0] = loadImage("redFish4.png"); zoonimage[1] = loadImage("rabbit2.png"); ibestlogo = loadImage("ibest-logo-effects.png"); // engineeringlogo = loadImage(""); size(1000,600); frameRate(60); int buttonDY = 50; resetbutton.set_position(buttonsX-50,buttonsY,buttonsR); resetbutton.set_text("Reset"); stepbutton.set_position(buttonsX+50,buttonsY,buttonsR); stepbutton.set_text("Step"); stepbutton.set_value(false); runbutton.set_position(buttonsX,buttonsY+buttonDY*0.8,buttonsR); runbutton.set_text("Run","Pause"," "); //runbutton.set_color(color(100,100,100),color(0,0,0)); zoachoice.set_position(buttonsX,buttonsY+buttonDY*1.6,buttonsR); zoachoice.set_text("Fish","Hares",""); showzoa.set_position(buttonsX,buttonsY+buttonDY*2.4,buttonsR); showzoa.set_text("Show","Hide","Animals"); showzoa.set_value(true); showdata.set_position(buttonsX,buttonsY+buttonDY*3.4,buttonsR); showdata.set_text("Show","Hide","Data"); showdata.set_value(true); //zoachoice.set_color(color(150,255,150),color(150,150,255)); degrade.set_position(buttonsX,buttonsY+buttonDY*4.4,buttonsR); degrade.set_text("Degrade","Stable","Resources"); degrade.set_value(true); cc.set_values(0,1000); cc.set_value(initial_CC); cc.set_position(40,50); cc.set_label("Carrying\nCapacity"); rateslider.set_values(0.1,3); rateslider.set_value(1.1); rateslider.set_position(140,50); rateslider.set_label("Growth\nRate"); initialslider.set_values(1,100); initialslider.set_value(10); initialslider.set_position(40,210); initialslider.set_label("Initial\nPopulation"); stochasticslider.set_values(0,3); stochasticslider.set_position(140,210); stochasticslider.set_label("Stochasticity"); stochasticslider.set_value(0); } void draw(){ if(imagenumber == 0) background(150,150,255); if(imagenumber == 1) background(150,255,150); fill(180); rect(0,0,200,600); // image(ibestlogo, 201,0,600/3,133/3); resetbutton.draw(); runbutton.draw(); showzoa.draw(); showdata.draw(); zoachoice.draw(); degrade.draw(); stepbutton.draw(); cc.draw(); rateslider.draw(); initialslider.draw(); stochasticslider.draw(); if(resetboolean){ reset(); } else if(!runboolean){ plotdata(); } else{ update(); plotdata(); } if(plotzoatoggle){ for(int i =0; i < pop_size; i++){ population[i].draw(); population[i].update(); } } // cp5.getController("capacity").setValue(capacity); checkbuttons(); } void mouseClicked(){ resetbutton.clicked(); runbutton.clicked(); showzoa.clicked(); showdata.clicked(); zoachoice.clicked(); degrade.clicked(); stepbutton.clicked(); } void mouseReleased(){ cc.release_slider(); rateslider.release_slider(); initialslider.release_slider(); stochasticslider.release_slider(); } void mouseDragged(){ cc.drag_slider(); rateslider.drag_slider(); initialslider.drag_slider(); stochasticslider.drag_slider(); } void mousePressed(){ cc.jump_slider(); rateslider.jump_slider(); initialslider.jump_slider(); stochasticslider.jump_slider(); } void checkbuttons(){ if(stepbutton.get()){ step = true; stepbutton.set_value(false); } if(degrade.get()){ degradetoggle = true; // degrade.set_text("Switch to Stable Resources"); }else{ degradetoggle = false; // degrade.set_text("Switch to Resources Degrade"); } if(showzoa.get()){ plotzoatoggle = true; // showzoa.set_text("Hide Zoa"); }else{ plotzoatoggle = false; // showzoa.set_text("Show Zoa"); } if(showdata.get()){ plotdatatoggle = true; // showdata.set_text("Hide Data"); }else{ plotdatatoggle = false; // showdata.set_text("Show Data"); } if(zoachoice.get()){ imagenumber = 0; // zoachoice.set_text("Switch to Hares"); } else{ imagenumber = 1; // zoachoice.set_text("Switch to Fish"); } // reset if(resetbutton.get()){ resetboolean = true; resetbutton.set_value(false); cc.set_value(initial_CC); if(runboolean == true){ // runbutton.set_text("Run"); runbutton.set_value(false); runboolean = false; } } //run if(runbutton.get() || step){ runboolean = true; // runbutton.set_text("Pause"); resetboolean = false; step = false; } else{ runboolean = false; capacity = int(cc.get()); // paused so get new capacity // runbutton.set_text("Run"); } } void imagenumber(int a){ imagenumber = a; if(imagenumber == -1){ imagenumber = 0; } } void reset(){ // initial = initial_CC; // cc.set_value(cc.get()); initial = int(initialslider.get()); int delta = initial - pop_size; datapoint = 0; for(int i = pop_size; i < pop_size+delta; i++){ population[i] = new zoon(); } pop_size = initial; capacity = int(cc.get()); } void update(){ if(millis() < nextupdate) return; nextupdate = millis()+ 500; Rate = rateslider.get(); stochastic = stochasticslider.get(); int delta = int(pop_size*Rate*(1+random(-stochastic,stochastic))*(1-(pop_size/float(capacity)))); if(delta > 0){ for(int i = pop_size; i < pop_size+delta; i++){ population[i] = new zoon(); } } pop_size += delta; if(pop_size < 0) pop_size = 0; if((pop_size > capacity) && degradetoggle && pop_size !=0){ capacity = int(capacity*(capacity/float(pop_size))); if(capacity < 0) capacity = 0; cc.set_value(capacity); } updateData(); } void updateData(){ alldata[datapoint] = new dataelement(); alldata[datapoint].pop = pop_size; alldata[datapoint].cc = capacity; datapoint++; if(datapoint >= maxdata) datapoint = 0; } void plotdata(){ if(!plotdatatoggle) return; if(datapoint <= 1) return; noFill(); strokeWeight(3); float dx = 800.0/(datapoint-1); float dy = 600/1000.0; for(int i=1; i< datapoint; i++){ stroke(0); line(200+(i-1)*dx,600-(alldata[i-1].pop*dy),200+(i*dx),600-(alldata[i].pop*dy)); stroke(0,100,0); line(200+(i-1)*dx,600-(alldata[i-1].cc*dy),200+(i*dx),600-(alldata[i].cc*dy)); } strokeWeight(1); stroke(0); fill(0); for(int i = 0; i < 5; i++){ line(200+2+i*((800-8)/4),600,200+2+i*((800-8)/4),600-15); } textSize(20); textAlign(CENTER,TOP); text("Generation: " + datapoint,200+800/2,7); textAlign(RIGHT); if(alldata[datapoint-1].cc < 950){ text("Capacity = "+alldata[datapoint-1].cc, 1000,(590-alldata[datapoint-1].cc*dy)); if(abs(alldata[datapoint-1].cc - alldata[datapoint-1].pop) > 20){ text("Population = "+alldata[datapoint-1].pop, 1000,(590-alldata[datapoint-1].pop*dy)); } else{ text("Population = "+alldata[datapoint-1].pop, 1000,(610-alldata[datapoint-1].pop*dy)); } } else{ text("Capacity = "+alldata[datapoint-1].cc, 900,(610-alldata[datapoint-1].cc*dy)); if(abs(alldata[datapoint-1].cc - alldata[datapoint-1].pop) > 20){ text("Population = "+alldata[datapoint-1].pop, 1000,(590-alldata[datapoint-1].pop*dy)); } else{ text("Population = "+alldata[datapoint-1].pop, 900,(625-alldata[datapoint-1].pop*dy)); } } textAlign(LEFT); } class zoon{ float x; float y; float imageScale; float speed; boolean orientation; zoon(){ imageScale = 0.9 + random(-0.5,0.5); x = 200 + int(random(800-(50*imageScale))); y = 10 + int(random(600-10-(30*imageScale))); speed = (imageScale*3.0)*(imageScale*3.0)/30.0; if(random(0,2) > 1) orientation = true; else{ orientation = false; speed = speed * -1; } } void draw(){ pushMatrix(); translate(x,y); if(imagenumber == 0){// fish tint(100,200,200); } if(orientation){ image(zoonimage[imagenumber], 0,0,50*imageScale,30*imageScale); //rect(0,0,50,30); } else{ pushMatrix(); scale(-1.0, 1.0); image(zoonimage[imagenumber],-50*imageScale,0,50*imageScale,30*imageScale); // rect(0,0,50,30); popMatrix(); } popMatrix(); noTint(); } void update(){ x+=speed; if((x> 1000-(50*imageScale)) || x < 200){ speed = -1*speed; orientation = !orientation; x+=speed; } } }; class dataelement{ public int pop; public int cc; };