Aliohjelmassa translate(x,y) ja scale(koko); -komennot

Katsotaan seuraavaa esimerkkiä.

SANALLINEN ALGORITMI
  1. Aseta ikkunan kooksi 400 px vaakaan ja 400 px pystyyn.
  2. Aseta ikkunan taustaväriksi valkea.
  3. Aseta täyttöväriksi punainen.
  4. Kutsu aliohjelmaa: ympyra. Välitä aliohjelmalle ympyrän keskipiste (110,110) ja säde 20.
  5. Kutsu aliohjelmaa: ympyra. Välitä aliohjelmalle ympyrän keskipiste (180,110) ja neliön sivun pituus 50.
  6. Aloita aliohjelma ympyra (Määrittele kokonaislukumuuttujat x, y ja r).
    1. Ota nykyinen koordinaatisto muistiin.
    2. Siirrä origoa x:n verran oikealle ja y:n verran alas.
    3. Skaalaa kuviota isoamksi tai pienemmäksi kertoimella: 2*r/100.0, missä 2*r on ympyrän halkaisija.
    4. Piirrä ympyrä origoon eli pisteeseen (0,0). Ympyrän halkaisija on 100 eli leveys ja korkeus.
    5. Palauta muistissa oleva koordinaatisto takaisin.

// Ohjelman tehnyt e-Oppi Oy
// 30.8.2017
void setup() {
size(400, 400); // Ikkunan koko
background(255); // Taustaväri valkoinen
fill(255,0,0); // Täyttöväri punainen
}

void draw() {
ympyra(110, 110,20); // Kutsutaan aliohjelmaa
ympyra(180, 110,50);
}

void ympyra(int x, int y, int r) {
pushMatrix(); // Otetaan nykyinen koordinaatisto muistiin
translate(x, y); // Siiretään origo pisteeseen (x,y)
scale(2*r/100.0); // Skaalataan kuviota isommaksi tai pienemmäksi.
ellipse(0,0,100,100); // Piirretään origoon ympyrä, jonka halkaisija on 100
popMatrix(); // Palautetaan koordinaatisto takaisin
}


Ohjelman tulostus on seuraavanlainen.




Piirretään origoon ympyrä, jonka halkaisija on 100 px. Tässä ympyrä siirretään eri paikkaan translate(x,y); komennolla ja kuvion koko saadaan isommaksi scale(2*r/100.0); komennolla. Huomaa, että laskukaava 2*r/100.0 on kerroin, kuinka moninkertaiseksi kuvio skaalataan. Jos kerroin on yli yksi, kuvio suurenee alkuperäisestä (100 px). Jos kerroin on alle ykkösen, niin kuvio pienenee alkuperäisestä (100 px).

Nyt emme tarvitse välittää koordinaattitietoja, sekä kokotietoja ellipse(x,y,a,b); funktioon. Tämä oivallus helpottaa monimutkaisten kuvioiden siirtämistä ja suurentamista eri paikkaan. Koska kuvion paikka voidaan määrätä translate(x,y)-komennolla ja kuvion koko voidaan määrätä scale(koko)-komennolla. Tärkeintä on lopuksi siirtää origo samassa muodossa takaisin alkuperäiseen paikkaan. Helpoiten tämä onnistuu pushMatrix(); ja popMatrix(); komennoilla. pushMatrix() ottaa koordinaatiston muistiin ja popMatrix() palauttaa muistissa olevan koordinaatiston.