Close menu
Close menu

Tunnistaudu

Kirjaudu

Etkö ole vielä jäsen?

Liity jäseneksi

Extra esimerkkejä

Pomppivat pallot

Tehdään vielä ohjelma, jossa arvotaan 200 kappaletta palloja taulukkoon. Jokasielle pallolle määrätään satunnaisesti alkupaikka (x,y), nopeus vaaka-suunnassa vx ja nopeus pystysuunnassa vy, sekä pallon väri ( R G B A). Jos pallo törmää ikkunan reunaan, niin silloin käänetään pallon nopeus vx tai vy vastakkaiseksi. Vaaka suuntaisesta (oikealle tai vasemalle) törmäyksestä muuttuu nopeus vx vastakkaiseksi ja pystysuuntaisesta törmäyksestä (ylös tai alas) muuttuu nopeus vy vastakkaiseksi. Ohjelman koodi on seuraava.

var pallot = [];                // Luodaan tyhjä taulukko
var r = 30;                     // Pallon säde
var tausta = 0;                 // Tausta-muuttujan arvo 0
function setup() {
  createCanvas(600, 600);            // Ikkunan koko 600 x 600
  for (var a = 0; a < 200; a++) {    // Luodaan 200 solua taulukkoon
    pallot[a] = { x:random(50,550),    // Vaakasuuntainen paikka
                  y:random(50,550),    // Pystysuuntainen paikka
                  vx : random(-10,10), // Vaakasuuntainen nopeus
                  vy : random(-10,10), // Pystysuuntainen nopeus
                  R : random(255),     // Punainen 
                  G : random(255),     // Vihreä
                  B : random(255),     // Sininen
                  A : random(255)      // Peittävyys eli läpinäkyvyys
              };
  }
}

function draw() {
  if (tausta == 0) {
   background(220);                   // Tyhjennä tausta
  } 
  for (var a=0; a<200; a++) {
    pallot[a].x = pallot[a].x +pallot[a].vx;   // Muuta vaakasuuntaista paikkaa
    pallot[a].y = pallot[a].y +pallot[a].vy;   // Muuta pystysuuntaista paikkaa
    fill(pallot[a].R, pallot[a].G, pallot[a].B, pallot[a].A);    // Aseta pallon väri
    ellipse(pallot[a].x,pallot[a].y,2*r,2*r);                    // Piirrä pallo
    if (pallot[a].x < (width-r)) {             // Jos törmää oikeaan reunaan
       pallot[a].vx = -pallot[a].vx            // lähde vasemapaan päin
     }
     if (pallot[a].x > r) {                    // Jos törmää vasempaan reunaan
      pallot[a].vx = -pallot[a].vx             // Lähde oikeaan päin
    }
     if (pallot[a].y < (height-r)) {           // Jos törmää alareunaan
      pallot[a].vy = -pallot[a].vy             // Lähde ylöspäin
    }
     if (pallot[a].y > r) {                    // Jos törmää yläreunaan
      pallot[a].vy = -pallot[a].vy             // Lähde alaspäin
    }
    
  }
}
function mousePressed() {       //Jos hiirellä napsautetaan
   if (tausta == 0) {           // Jos tausta on 0
     tausta = 1;                // niin muuta arvoksi 1
   } else {                     // Jos tausta on 1
     tausta = 0;                // niin muuta arvoksi 0
   }
}

Kun ajat ohjelman niin se toimii seuraavasti. Kokeile napsauttaa hiirellä kuvan päällä, mitä huomaat?

Kaksiulotteinen taulukko ja Noise-funktio

Luodaan neljä 2-ulotteista taulukkoa. Yhdessä taulukko-taulukossa on ympyrän halkaisija, joka on alussa arvottu satunnaisesti. Lisäksi meillä on R-, G- ja B-taulukot, jossa on arvottu kullekkin ympyrälle väriarvot. Laitamme yhteen taulukkoon 100:n ympyrän arvot siten, että siinä on 10×10 = 100 solua. Kun haluamme käydä kaksi-ulotteisen taulukon kaikki solut läpi, niin silloin tarvitsemme kaksi sisäkkäistä for-silmukkaa. Sisemmällä silmukalla käymme läpi taulukon sarakkeet ja ulomalla silmukalla käymme läpi taulukon rivit. Kokonainen ohjelma on seuraava.

var taulukko = [];   // Luodaan tyhjä taulukko halkaisijaa varten
var R = [];          // Luodaan tyhjä taulukko punaista värisävyä varten
var G = [];          // Luodaan tyhjä taulukko vihreää värisävyä varten
var B = [];          // Luodaan tyhjä taulukko sinistä värisävyä varten
function setup() {
  createCanvas(600, 600);           // Ikkunan koko               
  noStroke();                       // Ei reunaviivaa
  frameRate(5);                     // Ruudun päivitys nopeus 5 Hz
  for (var a = 0; a <= 10; a++) {   // Luodaan sarakkeet
      taulukko[a] = [];            
      R[a] = [];
      G[a] = [];
      B[a] = [];
      for (var b = 0; b <= 10; b++) {  // Luodaan rivit
        taulukko[a][b] = noise(random(100))*width/8;
        R[a][b] = random(255);
        G[a][b] = random(255);
        B[a][b] = random(255);
      }
  }  
}

function draw() {
  background(0);
  for (var a= 0; a <= 10; a++) {
    for (var b = 0; b <= 10; b++) {
        taulukko[a][b] = taulukko[a][b]+0.01;               // Kasvata arvoa 0.01 verran
        fill(R[a][b],G[a][b],B[a][b]);                      // Aseta ympyrän väri
        taulukko[a][b] = noise(taulukko[a][b])*width/8;     // Muuta halkaisijaa satunnaisesti noise-funktion avulla
        ellipse(60*a,60*b,taulukko[a][b],taulukko[a][b]);   // Piirrä ympyrä
   }
  }
}

Koska pallon halkaisijaa muutetaan laskurin ja noise-funktion  avulla, niin pallot suurenevat ja pienenevät satunnaisesti. Lopputulos näyttää tältä.

Generatiivinen taide

Tehdään ohjelma, jossa ikkunan koko on 600 x 600. Ikkuna on jaettu 10×10  pikselin kokoisiin soluihin, jolloin muodostuu 60×60 solua, joka on myös taulukon koko. Jokaiselle solulle on määrätty väriarvo. Jos väriarvo on 0, niin väri on musta. Alussa kaikkien solujen väriarvo on 0.  Jos hiirellä napsautetaan jossain kohtaa ikkunaa, niin silloin siihen kohtaan lisätään luku 2000. Mutta välittömästi tätä lukua aletaan siirtää vireisiin soluihin, kunnes luku on 0. Lukujen siirtäminen tapahtuu automaattisesti, koska siirtäminen on draw-lohkon sisällä, joka siis oli ikuisessa silmukassa. Niin kauan kun luku on suurempi kuin 6, niin solu väritetään valkoiseksi. Luomalla useita ehtoja ja värejä kun luku saa arvoja 6:sta 0:aan, niin voimme kuvata värin leviämisen ympäristöön eri väreillä. Koska itse laitamme väripisteet ohjelman suorituksen aikana, niin sanomme että kyseessä on ns. generatiivinen taide eli toisin sanoen ohjelma reagoi meidän toimintaan ja luo samalla taidetta etukäteen määrätyn säännön mukaisesti. Katsotaan koodia tarkemmin.

var taulukko = [];                   // Luodaan tyhjä taulukko
function setup() {
  createCanvas(600, 600);            // Ikkunan koko
  noStroke();
  for (var a = 0; a < 60; a++) {     // Luodaan sarakkeet
      taulukko[a] = [];
      for (var b = 0; b < 60; b++) { // Luodaan rivit
        taulukko[a][b] = 0;          // Alkuarvo on nolla (= väri musta)
      }
  }  
}

function draw() {
  for (var a = 1; a < 59; a++) {        // Silmukka ei ala nollasta, eikä mene viimeiseen soluun
      for (var b = 1; b < 59; b++) {    // koska pistettä ei voi siirtää yli taulukon
        if (taulukko[a][b] >= 4) {                    // Jos on vähintään solun arvo 4
             taulukko[a][b] = taulukko[a][b] - 4;     // Niin vähennä väriarvoa 4:llä
             taulukko[a+1][b] = taulukko[a+1][b] + 1; // Siirrä yksi oikealle
             taulukko[a-1][b] = taulukko[a-1][b] + 1; // Siirrä yksi vasemmalle
             taulukko[a][b+1] = taulukko[a][b+1] + 1; // Siirrä yksi alas  
             taulukko[a][b-1] = taulukko[a][b-1] + 1; // Siirrä yksi ylös
        }
      }
  }
  for (var c = 0; c < 60; c++) {
      for (var d = 0; d < 60; d++) {
        if (taulukko[c][d] == 0 ) { fill(0,0,0);       }  // Aseta väri arvon mukaan
        if (taulukko[c][d] == 1 ) { fill(255,0,0);     }
        if (taulukko[c][d] == 2 ) { fill(255,0,255);   }
        if (taulukko[c][d] == 3 ) { fill(0,0,255);     }
        if (taulukko[c][d] == 4 ) { fill(0,255,255);   }
        if (taulukko[c][d] == 5 ) { fill(0,255,0);     }
        if (taulukko[c][d] == 6 ) { fill(255,255,0);   }
        if (taulukko[c][d] > 6 )  { fill(255,255,255); }
        rect(c*10,d*10,10,10);                             // Piirrä neliö
      }
  }
  fill(255,255,255);                                       // Aseta valkea väri
  rect(mouseX,mouseY,10,10);                               // Hiiren kohdistin on neliö
}

function mousePressed () {                                 // Kun hiirtä on napsautettu, niin aseta soluun luku 2000
   if ((mouseX >= 10) && (mouseX < (width-10)) && (mouseY >= 10) && (mouseY < (height-10))) {
      taulukko[round(mouseX/10.0)][round(mouseY/10.0)] = 2000;
   }
}

Napsauta hiirellä ruudussa, niin monta kertaa kuin haluat. Jokainen napsautus asettaa 2000 hiekanjyvää, jotka leviävät ympärille.