Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // This project was coded in Processing ----> https://processing.org/
- int TRAJANJE = 60 * 30;
- int POPULUS = 1000;
- float MUTACIJA = 0.005;
- float VISINA = 250;
- Scena scena;
- void setup(){
- size(1280,720,OPENGL);
- scena = new Scena();
- frameRate(60);
- }
- void draw(){
- scena.korak();
- }
- class Avion{
- float maxBrzina;
- float okretniUgao;
- PVector lok;
- PVector brz;
- // pogled :
- float visinaUd;
- float udaljenost;
- PVector yLinija,zLinija;
- float duzina;
- boolean rot; // kontrolise pogled
- boolean ziv;
- color boja, bojaInc, bojaKraj, bojaCilj;
- boolean cilj;
- DNK dnk;
- int brojac;
- Avion(float x, float y, float z, DNK dnk_){
- maxBrzina = 2;
- okretniUgao = 0.024;
- lok = new PVector(x,y,z);
- brz = new PVector(maxBrzina,0,0);
- visinaUd = VISINA+90;
- udaljenost = 200;
- yLinija = new PVector(0,1,0);
- zLinija = new PVector(0,0,1);
- duzina = 30;
- rot = true;
- ziv = true;
- cilj = false; // bitno
- bojaInc = color(255);
- bojaKraj = color(255,0,0);
- bojaCilj = color(255,255,0);
- boja = bojaInc;
- dnk = dnk_;
- brojac = 0;
- }
- void korak(){
- if(ziv){
- mozak();
- kretanje();
- granice();
- }
- prikazi();
- }
- void mozak(){
- kontrole(dnk.potez(brojac));
- brojac++;
- }
- void kretanje(){
- lok.add(brz);
- }
- void kontrole(int kontrola){ // 1 - desno, 2 - lijevo, 3 - dolje, 4 - gore
- if(kontrola > 2){
- yLinija = new PVector(brz.x,brz.y,0);
- yLinija.normalize();
- yLinija.rotate(PI/2);
- }
- switch(kontrola){
- case 1 : brz = rotiraj(zLinija,brz,okretniUgao);
- break;
- case 2 : brz = rotiraj(zLinija,brz,-okretniUgao);
- break;
- case 3 : brz = rotiraj(yLinija,brz,okretniUgao);
- break;
- case 4 : brz = rotiraj(yLinija,brz,-okretniUgao);
- break;
- }
- }
- void prikazi(){
- pushMatrix();
- translate(lok.x,lok.y,lok.z);
- fill(boja);
- PVector tacka = new PVector(brz.x,brz.y,brz.z);
- tacka.normalize();
- tacka.mult(duzina);
- strokeWeight(1);
- stroke(0);
- beginShape();
- vertex(0,0,0);
- vertex(tacka.x,tacka.y,tacka.z);
- PVector strana = new PVector(tacka.x,tacka.y,0);
- strana.normalize();
- strana.rotate(PI/2);
- strana.mult(duzina/4);
- vertex(strana.x,strana.y,strana.z);
- endShape(CLOSE);
- beginShape();
- vertex(0,0,0);
- vertex(tacka.x,tacka.y,tacka.z);
- strana.rotate(PI);
- vertex(strana.x,strana.y,strana.z);
- endShape(CLOSE);
- beginShape();
- vertex(0,0,0);
- vertex(tacka.x,tacka.y,tacka.z);
- tacka.normalize();
- PVector dolje = rotiraj(tacka,strana,PI/2);
- dolje.normalize();
- dolje.mult(duzina/6);
- vertex(dolje.x,dolje.y,dolje.z);
- endShape(CLOSE);
- noStroke();
- popMatrix();
- }
- void granice(){
- PVector tacka = tacka();
- if(tacka.x < 0){
- kraj();
- }
- else if(tacka.x > width){
- kraj();
- }
- if(tacka.y < 0){
- kraj();
- }
- else if(tacka.y > height){
- kraj();
- }
- if(tacka.z < 0){
- kraj();
- }
- else if(tacka.z > VISINA){
- kraj();
- }
- }
- void pogledTreceLice(){
- PVector bla = new PVector(brz.x,brz.y);
- if(rot){
- bla = new PVector(10,0);
- }
- bla.normalize();
- bla.mult(-udaljenost);
- PVector treca = PVector.add(lok,bla);
- PVector oci = PVector.add(lok,brz);
- camera(treca.x, treca.y, visinaUd, oci.x, oci.y, oci.z, 0, 0, -1);
- }
- PVector rotiraj(PVector k, PVector v, float ugao){
- PVector prvi = PVector.mult(v,cos(ugao));
- PVector kopija = new PVector(k.x,k.y,k.z);
- PVector drugi = kopija.cross(v);
- drugi.mult(sin(ugao));
- PVector treci = PVector.mult(k,k.dot(v));
- treci.mult(1-cos(ugao));
- prvi.add(drugi);
- prvi.add(treci);
- return prvi;
- }
- PVector tacka(){
- PVector tacka = new PVector(brz.x,brz.y,brz.z);
- tacka.normalize();
- tacka.mult(duzina);
- tacka.add(lok);
- return tacka;
- }
- void kraj(){
- ziv = false;
- boja = bojaKraj;
- }
- void cilj(){
- kraj();
- boja = bojaCilj;
- cilj = true;
- }
- }
- class DNK{
- int[] lista;
- int duzinaGena;
- DNK(){
- lista = new int[TRAJANJE];
- duzinaGena = 12; // mora bit djeljivo sa trajanjem
- init();
- }
- void init(){
- for(int i=0;i<TRAJANJE/duzinaGena;i++){
- int rand = int(random(1,5));
- for(int j=0;j<duzinaGena;j++)
- lista[i*duzinaGena+j] = rand;
- }
- }
- int potez(int broj){
- return lista[broj];
- }
- void sastavi(DNK d1, DNK d2){
- rekombinacija(d1, d2);
- mutacija();
- }
- void mutacija(){
- for(int i=0;i<TRAJANJE/duzinaGena;i++){
- if(random(1)<MUTACIJA){
- int rand = int(random(1,5));
- for(int j=0;j<duzinaGena;j++)
- lista[i*duzinaGena+j] = rand;
- }
- }
- for(int i=0;i<lista.length;i++){
- }
- }
- void rekombinacija(DNK d1, DNK d2){
- for(int i=0;i<lista.length;i++){
- if((i / duzinaGena) % 2 == 0){
- lista[i] = d1.lista[i];
- }else{
- lista[i] = d2.lista[i];
- }
- }
- }
- }
- class Kutija{
- float lokX, lokY;
- float w, h;
- float visina;
- color boja;
- Kutija(float lx, float ly, float w_,float h_, float v, color b){
- lokX = lx; lokY = ly;
- w = w_; h = h_;
- visina = v;
- boja = b;
- }
- void korak(){
- prikazi();
- }
- void prikazi(){
- fill(boja);
- strokeWeight(1);
- stroke(1);
- pushMatrix();
- translate(lokX+w/2,lokY+h/2,visina/2+1);
- box(w,h,visina-1);
- popMatrix();
- noStroke();
- }
- boolean granice(PVector lok){
- if(lok.x > lokX && lok.x < lokX+w &&
- lok.y > lokY && lok.y < lokY+h &&
- lok.z > 0 && lok.z < visina){
- return true;
- }
- return false;
- }
- }
- class Nagrada{
- PVector lok;
- float r;
- color boja;
- Nagrada(float x, float y, float z, float r_, color b){
- lok = new PVector(x,y,z);
- r = r_;
- boja = b;
- }
- void korak(){
- prikazi();
- }
- void prikazi(){
- fill(boja);
- pushMatrix();
- translate(lok.x,lok.y,lok.z);
- sphere(r);
- popMatrix();
- }
- boolean granice(PVector lok2){
- if(dist(lok.x,lok.y,lok.z,lok2.x,lok2.y,lok2.z)< r){
- return true;
- }else{
- return false;
- }
- }
- }
- class Scena{
- Svijet svijet;
- Scena(){
- svijet = new Svijet();
- }
- void korak(){
- svijet.korak();
- }
- }
- class Svijet{
- int pogled;
- Nagrada nagrada;
- ArrayList<Avion> avioni;
- ArrayList<Kutija> kutije;
- color bojaKutija;
- float rez;
- color bojaPoda0, bojaPoda1, bojaZida0, bojaZida1;
- PVector lok;
- DNK[] dnk;
- int brojac;
- float[] fitnes;
- Svijet(){
- pogled = 0;
- avioni = new ArrayList<Avion>();
- kutije = new ArrayList<Kutija>();
- bojaKutija = color(50,50,255);
- rez = 40;
- bojaPoda0 = color(30,200,30);
- bojaPoda1 = color(0,255,0);
- bojaZida0 = color(170);
- bojaZida1 = color(200);
- lok = new PVector(100,100,100);
- dnk = new DNK[POPULUS];
- fitnes = new float[POPULUS];
- dnkInit();
- init();
- nagradaInit();
- brojac = 0;
- }
- void korak(){
- if(brojac == TRAJANJE || kraj()){
- background(0); // privremeno
- for(Avion a : avioni){
- a.ziv = false;
- }
- evolucija();
- brojac++;
- reset();
- }else if(brojac < TRAJANJE){
- korak_();
- brojac++;
- }
- }
- void korak_(){
- prikazi();
- kutije();
- avioni();
- nagrada();
- kamera();
- }
- void evolucija(){
- fitnes();
- selekcija();
- }
- void selekcija(){
- for(int n=0;n<dnk.length;n++){
- int sampion1 = int(random(dnk.length));
- int sampion2 = int(random(dnk.length));
- for(int i=0;i<2;i++){
- for(int j=0;j<20;j++){ // 20 mzd var ?
- int protivnik = int(random(dnk.length));
- if(i==0){
- if(fitnes[sampion1]<fitnes[protivnik]){
- sampion1 = protivnik;
- }
- }else{
- if(fitnes[sampion2]<fitnes[protivnik]){
- sampion2 = protivnik;
- }
- }
- }
- }
- DNK d1 = dnk[sampion1];
- DNK d2 = dnk[sampion2];
- dnk[n].sastavi(d1,d2);
- }
- }
- void fitnes(){
- float najduzi = dist(0,0,VISINA,nagrada.lok.x,nagrada.lok.y,nagrada.lok.z);
- for(int i=0;i<POPULUS;i++){
- float udaljenost = dist(avioni.get(i).lok.x,avioni.get(i).lok.y,avioni.get(i).lok.z,nagrada.lok.x,nagrada.lok.y,nagrada.lok.z);
- fitnes[i] = (1-(udaljenost/najduzi)) * (avioni.get(i).brojac);
- }
- }
- void prikazi(){
- noStroke(); // mzd ostane
- background(#ACEDE2);
- lights();
- pod();
- zid();
- }
- void avioni(){
- for(Avion a : avioni){
- a.korak();
- }
- }
- void kutije(){
- for(Kutija k : kutije){
- for(Avion a : avioni){
- if(a.ziv && k.granice(a.tacka())){
- a.kraj();
- }
- }
- k.korak();
- }
- }
- void nagrada(){
- for(Avion a : avioni){
- if(a.ziv && nagrada.granice(a.tacka())){
- a.cilj();
- }
- }
- nagrada.korak();
- }
- void kamera(){
- if(pogled == 0){
- camera(width/2-400, height/2+170, (height/2) / tan(PI/6)+190, width/2-150, height/2, 100, 0, 1, 0); // default
- }else if(pogled == 1){
- avioni.get(avioni.size()-1).pogledTreceLice(); // za sd samo zadnji
- }
- // x,y,h (oci) x,y,h(centar) [0,0,-1]
- }
- void reset(){
- avioni = new ArrayList<Avion>();
- kutije = new ArrayList<Kutija>();
- init();
- brojac = 0;
- }
- boolean kraj(){
- for(Avion a : avioni){
- if(a.ziv){
- return false;
- }
- }
- return true;
- }
- void init(){
- avioniInit();
- // faza 1 :
- kutije.add(new Kutija(7*40,1,2*40,11*40,VISINA,bojaKutija));
- kutije.add(new Kutija(7*40,13*40,2*40,2*40,110,bojaKutija));
- // faza 2 :
- kutije.add(new Kutija(16*40,3*40,3*40,15*40-1,VISINA,bojaKutija));
- kutije.add(new Kutija(17*40,1,40,3*40-1,VISINA-50,bojaKutija));
- }
- void avioniInit(){
- for(int i=0;i<dnk.length;i++){
- avioni.add(new Avion(lok.x,lok.y,lok.z,dnk[i]));
- }
- }
- void dnkInit(){
- for(int i=0;i<dnk.length;i++){
- dnk[i] = new DNK();
- }
- }
- void nagradaInit(){
- nagrada = new Nagrada(30*40,8*40,50,50,color(255,255,0));
- }
- void pod(){
- // pod
- fill(bojaPoda0);
- rect(0,0,width,height);
- int i_ = int(width/rez);
- int j_ = int(height/rez);
- // za sd :
- fill(bojaPoda1);
- for(int i = 0;i<i_;i++){
- for(int j = 0;j<j_;j++){
- if((j+i) % 2 == 0){
- pushMatrix();
- translate(0,0,1);
- rect(i*rez,j*rez,rez,rez);
- popMatrix();
- }
- }
- }
- }
- void zid(){
- fill(bojaZida0);
- pushMatrix();
- rotateX(PI/2);
- rect(0,0,width,VISINA);
- popMatrix();
- pushMatrix();
- translate(0,height,0);
- rotateX(PI/2);
- rect(0,0,width,VISINA);
- popMatrix();
- fill(bojaZida1);
- pushMatrix();
- rotateY(-PI/2);
- rect(0,0,VISINA,height);
- popMatrix();
- pushMatrix();
- translate(width,0,0);
- rotateY(-PI/2);
- rect(0,0,VISINA,height);
- popMatrix();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement