5.4 Koordinaatiston kierto
Yhteenveto
Koordinaatiston kierto
|
Komento |
Merkitys |
|---|---|
|
rotate(kulma) |
Komento kiertää xy-akselia myötäpäivään kulman verran. |
|
kulma |
Kulma kertoo kierron suuruuden radiaaniasteina. Positiivisilla asteilla kierto on myötäpäivään ja negatiivisilla asteilla kierto on vastapäivään. |
Komennolla saadaan koordinaatistoa pyöritettyä. Oheinen kuva havainnollistaa asiaa.
Esimerkki: Viiva ennen ja jälkeen kierron
|
// Ohjelman tehnyt e-Oppi Oy
// 30.8.2017
void setup () {
size(400,400); // Ikkunan koko
background(255); // Valkea taustan väri
stroke(0); // Musta viivan väri
}
void draw() {
line(200,100,300,100); // Viiva ennen kiertoa
rotate(radians(45)); // Kierrä koordinaatisto
line(200,100,300,100); // Viiva kierron jälkeen
}
Kun ohjelma ajetaan, niin huomataan koko koordinaatiston kiertyneen 45° myötäpäivään.
Kuten tästä esimerkistä havaitsemme, niin vaakasuoraviiva on 45° astetta vinossa kierron jälkeen. Jos kierto on yli 90 astetta niin viiva ei enää ole ikkunan sisällä. Jos halutaan, että kuvio kiertyy keskellä ikkunaa, niin ennen kiertoa meidän on siirrettävä koordinaatiston origo (0, 0) ikkunan keskelle. Tutkitaan tätä seuraavaksi.
Esimerkki: Komentojen yhdistäminen
Kuvassa alkuperäinen ellipsi saadaan komennolla ellipse(100,150,100,200); missä ellipsin keskipiste on (100, 150) ja ellipsin leveys on 100 ja korkeus 200.
Nyt kun otetaan komento: translate(400,150); niin koordinaatiston origo on siirretty pisteeseen (400, 150). Kun seuraavaksi otetaan komento: rotate(radians(90)); ja sama ellipse-komento, niin ellipsi kääntyy vaakasuuntaan kuten kuvassa eli koordinaatisto pyörähtää myötäpäivään 90 astetta.
Alkuperäisessä koordinaatistossa tämän uusi ellipsi saataisiin komennolla: ellipse(250,250,200,100); mutta tässä uudessa koordinaatistossa ellipsi saadaan samalla komennolla eli ellipse(100,150,100,200);.

Kokeile muuttaa translate(x,y) komennon arvoja, sekä rotate(radians(kulma)); arvoja.
Esimerkki: Viivan pyörittäminen ikkunan keskellä
|
// Ohjelman tehnyt e-Oppi Oy
// 30.8.2017
void setup () {
size(400,400); // Ikkunan koko
background(255); // Valkea taustan väri
stroke(0); // Musta viivan väri
}
void draw() {
translate(200,200); // Siirrä origo ikkunan keskelle
line(-100,0,100,0); // Piirrä 1. vaakaviiva
rotate(radians(45)); // Kierrä 45° myötäpäivään
line(-100,0,100,0); // Piirrä 2. vaakaviiva
rotate(radians(45)); // Kierrä 45° myötäpäivään
line(-100,0,100,0); // Piirrä 3. vaakaviiva
rotate(radians(45)); // Kierrä 45° myötäpäivään
line(-100,0,100,0); // Piirrä 4. vaakaviiva
}
Kuvio saadaan pyörimään, kun ensin siirretään origo eli piste (0, 0) ikkunan keskelle translate(x,y) komennolla. Viiva on nyt piirretty siten, että viivan keskipiste on origossa. Viivan alkupiste on nyt kohdassa (-100, 0) ja loppupiste kohdassa (100, 0). Nyt kun koordinaatistoa kierretään, niin viivan keskipiste pysyy samana koko ajan. Alla oleva kuva havainnollistaa ohjelman ajoa.
Kuinka muuttaisit koodia, jos sinun pitäisi piirtää yllä olevan kuvan jokaiseen väliin vielä uusi viiva, jolloin viivoja olisi jo yhteensä kahdeksan?
Kierto vastapäivään
|
// Ohjelman tehnyt e-Oppi Oy
// 30.8.2017
void setup () {
size(400,400); // Ikkunan koko
background(255); // Taustaväri valkoinen
stroke(0); // Musta viivan väri
}
void draw () {
translate(200,200); // Origo ikkunan keskelle
scale(1,-1); // Peilaa y-koordinaatit
line(-100,0,100,0); // Viiva ennen kiertoa
rotate(radians(30)); // Kierrä 30° vastapäivään
line(-100,0,100,0); // Viiva kierron jälkeen
}

Esimerkki: Kierto ympäri
|
// Ohjelman tehnyt e-Oppi Oy
// 30.8.2017
void setup () {
size(400,400); // ikkunan koko
background(255); // Valkea taustaväri
stroke(0); // Musta viivan väri
fill(255,0,0); // Punainen täyttöväri
}
void draw() {
translate(200,200); // Origo eli piste (0,0) on siirretty ikkunan keskelle
ellipse(100,0,20,20); // Piirrä 1. ympyrä
rotate(radians(45)); // Kierrä 45° myötäpäivään
ellipse(100,0,20,20); // Piirrä 2. ympyrä
rotate(radians(45)); // Kierrä 45° myötäpäivään
ellipse(100,0,20,20); // Piirrä 3. ympyrä
rotate(radians(45)); // Kierrä 45° myötäpäivään
ellipse(100,0,20,20); // Piirrä 4. ympyrä
rotate(radians(45)); // Kierrä 45° myötäpäivään
ellipse(100,0,20,20); // Piirrä 5. ympyrä
rotate(radians(45)); // Kierrä 45° myötäpäivään
ellipse(100,0,20,20); // Piirrä 6. ympyrä
rotate(radians(45)); // Kierrä 45° myötäpäivään
ellipse(100,0,20,20); // Piirrä 7. ympyrä
rotate(radians(45)); // Kierrä 45° myötäpäivään
ellipse(100,0,20,20); // Piirrä 8. ympyrä
}
Tässä ohjelmassa origo eli piste (0, 0) on ensin siirretty ikkunan keskelle translate(x,y)-komennolla. Ensimmäinen ympyrä on piirretty ikkunan keskikohdasta 100 pikseliä oikealle. Jonka jälkeen koordinaatistoa on kierretty 45° myötäpäivään ja piirretty uusi ympyrä. Ympyrällä on aina samat koordinaatit. Ympyrän paikka muuttuu, koska koordinaatisto kiertyy myötäpäivään. Alla on esitetty ohjelman esimerkkiajo.
Mikä olisi kierron suuruus, jos haluaisit piirtää 12 punaista ympyrää?
Esimerkki: Piirtelyä rotaation avulla
|
// Ohjelman tehnyt e-Oppi Oy
// 30.8.2017
void setup () {
size(800,800); // Ikkunan koko voi olla mikä tahansa
background(0); // Taustaväri musta
noStroke(); // Ei reunaviivaa
}
void draw () {
translate(width/2,height/2); // Origo ikkunan keskelle
int x = mouseX-(width/2); // Lue hiiren x-koordinaatti
int y = mouseY-(height/2); // Lue hiiren y-koordinaatti
if (mousePressed == true) { // Jos hiiren painike on pohjassa
fill(255,0,0); // Punainen väri
ellipse(x,y,20,20); // Piirrä ympyrä ennen siirrosta
rotate(radians(90)); // Pyöritä koordinaatistoa 90°:tta
fill(0,0,255); // Sininen väri
ellipse(x,y,20,20); // Piirrä ympyrä siirroksen jälkeen
rotate(radians(90)); // Pyöritä koordinaatistoa 90°:tta
fill(0,255,0); // Vihreä väri
ellipse(x,y,20,20); // Piirrä ympyrä siirroksen jälkeen
rotate(radians(90)); // Pyöritä koordinaatistoa 90°:tta
fill(255,255,0); // Keltainen väri
ellipse(x,y,20,20); // Piirrä ympyrä siirroksen jälkeen
}
}
Kun ajat ohjelman, voit piirtää yhtä aikaa neljällä eri värillä siten, että jokainen eri väri piirtojälki kiertyy 90 astetta myötäpäivään edelliseen nähden. Eli pidä hiiren vasen painike pohjassa ja liikuta hiirtä ikkunassa. Origo on nyt ikkunan keskellä. Kannattaa huomata, että translate()- komento ei vaikuta hiiren koordinaatteihin (mouseX, mouseY). Tarvitaan siis korjaus, kun määritellään muuttujille x ja y arvot. Koska origo on ikkunan keskellä, mouseX ja mouseY arvoista pitää vähentää puolet ikkunan koosta pois, jotta piirtäminen sujuu oikein.
Esimerkki: Skaalaus ja kierto hiiren avulla
|
// Ohjelman tehnyt e-Oppi Oy
// 30.9.2017
void setup () {
size(400,400); // ikkunan koko
fill(255,0,0); // Täyttöväri punainen
smooth(); // Pehmeä liike
}
void draw () {
background(255); // Tyhjennä tausta
int x = mouseX; // Lue hiiren vaakakoordinaatti
float y = map(mouseY,0,400,0,20); // Skaalaa asteikolle [0,20]
translate(200,200); // Siirrä origo ikkunan keskelle
rotate(radians(x)); // Hiiren vaakasuuntainen liike pyörittää
scale(y); // Hiiren pystysuuntainen liike kasvattaa kokoa
rect(-10,-10,20,20); // Piirrä 20x20 neliö ikkunan keskelle
}
Suorita ohjelma ja samalla liikuta hiirtä ylös ja alas, sekä oikealle ja vasemmalle. Huomaat, että kun hiiren liike on vaakasuuntainen, niin neliö pyörii ympäri ja kun hiiren liike on pystysuuntainen, niin neliön koko kasvaa.





