5.2 Koordinaatiston siirto
Yhteenveto
Koordinaatiston siirto
Käydään seuraavaksi komentoja, joilla voidaan muokata koordinaatistoa. Koordinaatiston muokkauskomentoja ovat: siirto, skaalaus, peilaus ja kierto. Aloitetaan koordinaatiston muokkaus siirto-komennosta.
|
Komento |
Merkitys |
|---|---|
|
translate(x,y); |
Komento siirtää xy-koordinaatiston x:n verran oikealle ja y:n verran alas. |
|
x |
Ilmaisee siirron suuruuden vaakasuunnassa. Positiiviset arvot siirtävät koordinaatistoa oikealle ja negatiiviset arvot siirtävät koordinaatistoa vasemmalle. |
|
y |
Ilmaisee siirron suuruuden pystysuunnassa. Positiiviset arvot siirtävät koordinaatistoa alaspäin ja negatiiviset arvot siirtävät koordinaatistoa ylöspäin. |
Tutkitaan seuraavaksi koordinaatiston siirtoa esimerkin avulla.
Esimerkki: Koordinaatiston siirto
|
// 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(100,100,200,200); // Viiva ennen siirtoa
translate(50,100); // Siirrä koordinaatisto
line(100,100,200,200); // Viiva siirron jälkeen
}
Kun ajat ohjelman, niin huomaat, että sinulla on kaksi viivaa eri paikassa, vaikka koordinaatit ovat samat. Alempi viiva on siirtynyt 50 pikseliä oikealle ja 100 pikseliä alaspäin. Se miksi viiva on eri paikassa, johtuu koordinaatiston siirrosta. Komento: translate(50,100); siirsi koko koordinaatistoa 50 px oikealle ja 100 px alas.
Kokeile siirrosta muuttamalla lukuarvoja translate(x,y); komennossa.
Esimerkki: Koordinaatisto ikkunan keskellä
Siirretään seuraavassa esimerkissä koordinaatisto ikkunan keskelle ja piirretään sininen ympyrä ilman täyttöä, vihreä neliö ilman reunaviivaa ja keltainen kolmio punaisella reunaviivalla.
Koska koordinaatisto on nyt siirretty ikkunan keskelle, mentäessä origosta vasemmalle x-koordinaatit muuttuvat negatiivisiksi. Vastaavasti mentäessä origosta ylöspäin y-koordinaatit muuttuvat negatiiviseksi.
|
// Ohjelman tehnyt e-Oppi Oy
// 20.2.2017
void setup() {
size(400,400); // Ikkunan koko
background(255); // Taustaväri valkoinen
}
void draw() {
translate(200,200); // Siirrä origo ikkunan keskelle
stroke(0,0,255); // Aseta sininen reunaviivan väri
strokeWeight(10); // Aseta reunaviivan paksuus arvoon 10
noFill(); // Poista täyttö
ellipse(-100,-100,100,100); // Piirrä ympyrä
noStroke(); // Poista reunaviiva
fill(0,255,0); //Aseta täyttöväri vihreäksi
rect(50,-150,100,100); // Piirrä neliö
strokeWeight(10); // Aseta viivan paksuudeksi 10
stroke(255,0,0); // Aseta reunaviivan väriksi punainen
fill(255,255,0); // Aseta täyttöväriksi keltainen
triangle(0,0,100,150,-100,150); // Piirrä kolmio
}
Mitkä olisivat kuvioiden koordinaattipisteet, jos suorittaisit komennon translate(400,400);?
Koordinaatisto automaattisesti ikkunan keskelle
|
// Ohjelman tehnyt e-Oppi Oy
// 30.8.2017
void setup () {
size(600,500); // Ikkunan koko voi olla mikä tahansa
background(255); // Taustaväri valkoinen
}
void draw () {
translate(width/2,height/2); // Siirto on puolet ikkunan koosta
line(-width/2,0,width/2,0); // Piirrä vaakaviiva
line(0,-height/2,0,height/2); // Piirrä pystyviiva
}
Kokeile muuttaa size(x,y); komennossa ikkunan kokoa ja origon pitäisi olla aina ikkunan keskellä.
Monta siirtoa peräkkäin
|
// 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() {
fill(255,255,0); // Keltainen täyttöväri
rect(100,100,100,50);
translate(20,40); // Siirrä koordinaatisto 20 oikealle ja 40 alas
rect(100,100,100,50);
translate(20,40); // Siirrä koordinaatisto 20 oikealle ja 40 alas
rect(100,100,100,50);
translate(-40,-80); // Siirrä koordinaatisto 40 vasemalle ja 80 ylös
fill(0,255,0); // Vihreä täyttöväri
rect(200,100,100,50);
}
Ohjelman suoritus näyttää tältä.

Kuten huomasit, niin uusi siirto tehdään aina laskien sen hetkisestä koordinaatistosta, ei alkuperäisestä koordinaatistosta. Kun haluamme palata takaisin alkuperäiseen koordinaatistoon, niin meidän pitää tehdä yhtä suuri siirto takaisin päin, mutta vastakkaiseen suuntaan eli negatiiviseen suuntaan.
Olisiko mahdollista palauttaa alkuperäinen koordinaatisto jollain komennolla? Kyllä, se onnistuu komennoilla: pushMatrix(); ja popMatrix();
| pushMatrix( ); | Komento ottaa muistiin tämän hetkisen koordinaatiston. |
| popMatrix( ); | Komento palauttaa muistissa olevan koordinaatiston takaisin. |
Edellinen esimerkki voidaan kirjoittaa nyt muodossa.
|
// 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() {
fill(255,255,0); // Keltainen täyttöväri
rect(100,100,100,50);
pushMatrix(); // Otetaan koordinaatisto muistiin
translate(20,40); // Siirrä koordinaatisto 20 oikealle ja 40 alas
rect(100,100,100,50);
translate(20,40); // Siirrä koordinaatisto 20 oikealle ja 40 alas
rect(100,100,100,50);
popMatrix(); // Palautetaan muistissa oleva koordinaatisto
fill(0,255,0); // Vihreä täyttöväri
rect(200,100,100,50);
}
Kokeile laittaa translate(x,y) komentoon mitä arvoja tahansa ja vihreä suorakulmio piirretään aina samaan paikkaan.
Kohteen liikuttelu hiirellä
| mouseX | Lukee hiiren vaaka- eli x-koordinaatin arvon. |
| mouseY | Lukee hiiren pysty- eli y-koordinaatin arvon. |
Hiiren koordinaatit voidaan lukea mouseX- ja mouseY- komennoilla. Koordinaatistoa voidaan liikutella myös hiiren avulla. Samalla kaikki kuviot koordinaatiston mukana liikkuvat. Tutkitaan seuraavaa esimerkkiä.
|
// Ohjelman tehnyt e-Oppi Oy
// 30.8.2017
void setup() {
size(400, 400); // Ikkunan koko
fill(255,0,0); // Punainen täyttöväri
}
void draw() {
background(255); // Tyhjennä tausta
pushMatrix(); // Koordinaatisto muistiin
translate(mouseX, mouseY); // Liikuta koordinnatistoa hiirellä
ellipse(0, 0, 50, 50); // Piirrä ympyrä
popMatrix(); // Palauta koordinaatisto
}
Lisää toinen ympyrä, mutta eri paikkaan. Laita ympyrä juuri ennen popMatrix(); komentoa. Mitä tapahtui? Entä, jos siirrät toisen ympyrän popMatrix(); komennon jälkeen. Mikä muuttui?
Esimerkki: Kaksi hiiriosoitinta yhtä aikaa
|
// Ohjelman tehnyt e-Oppi Oy
// 30.8.2017
void setup () {
size(800,800); // Ikkunan koko voi olla mikä tahansa
background(255); // Taustaväri valkoinen
noStroke(); // Ei reunaviivaa
}
void draw () {
int x = mouseX; // Lue hiiren x-koordinaatti
int y = mouseY; // 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
translate(100,50); // Siirrä koordinaatisto
fill(0,0,255); // Sininen väri
ellipse(x,y,20,20); // Piirrä ympyrä siirroksen jälkeen
}
}
Ohjelmaan on lisätty ehtolause. Jos hiiren painike on pohjassa (true), niin silloin piirrä kahta eriväristä ympyrää kahteen eri paikkaan. Punainen ympyrä on hiiren oikea paikka, sininen on hiiren siirretty paikka. Aja ohjelma, paina hiiren painike pohjaan ja liikuta hiirtä. Kuinka lisäisit kolmannen ympyrän eri paikkaan?



