Esimerkki: Gravitaatio
Haluamme, että pallo putoaa alaspäin kiihtyen ja pomppaa ylöspäin hidastuen. Tutkitaan seuraavaa esimerkkiä:
Pallon pystysuuntainen paikka on ilmaistu muuttujalla y. Laskurin y = y +vy avulla pallo saadaan liikkumaan. Kun lisäys vy on positiivinen, niin pallo menee alaspäin, koska y:n arvo kasvaa. Kun lisäys vy on negatiivinen, niin pallo menee ylöspäin, koska y:n arvo pienenee. Koska myös muuttujalla vy on oma laskuri eli vy = vy +0.1; niin myös lisäyksen vy suuruus muuttuu. Kun vy on positiivinen, niin lisäys koko ajan kasvaa eli on kiihtyvässä liikkeessä. Kun vy on negatiivinen, niin lisäys koko ajan pienenee eli on hidastuvassa liikkeessä. Hidastuva liike jatkuu, kunnes vy on muuttunut positiiviseksi, jolloin se on taas kiihtyvää liikettä. Kun haluat muuttaa kiihtyvän liikkeen hidastuvaksi, niin sitä varten on ohjelmaan lisättävä ehto eli if-lause. Kun pallon alareuna (y+r) on vähintään yhtä suuri kuin ikkunan korkeus (height), niin tällöin muuta kiihtyvyys hidastuvuudeksi (vy = -vy*0.9). Tähän muutokseen on lisätty kerroin 0.9 eli muutoksesta säilyy vain 90 % jokaisella pompulla, niin pallo ei pääse pomppaamaan enää niin korkealle kuin edellisellä kierroksella. Samalla on hyvä antaa y:lle uusi alkuarvo, niin ei tule pyöristysvirheistä johtuvia heittoja. Oheinen kuva havainnollistaa ohjelman käyttämiä muuttujia.

Lisätään mukaan vielä vaakasuuntainen liike, niin pallo saadaan pomppimaan ikkunan sisällä realistisesti.
Voit kokeilla muuttaa ikkunan kokoa, muuttujien alkuarvoja tai kertoimia 0.1 ja 0.9 laskukaavoissa. Ohjelmaa voitaisiin kehittää esimerkiksi siten, että arvottaisiin pallon aloituspaikka ja nopeus alussa.
|
// Ohjelman tehnyt e-Oppi Oy
// 30.8.2017
float x = 400; // Pallon alkukoordinaatti vaakasuunnassa
float y = 50; // Pallon alkukoordinaatti pystysuunnassa
float vy = 0; // Laskurin lisäyksen suuruus alussa
float r = 20; // Pallon säde
void setup() {
size(800,600); // Ikkunan koko
fill(0,0,255); // Täyttöväri sininen
smooth(); // Pehmeä liike
}
void draw () {
background(255); // Tyhjennä tausta
ellipse(x,y,2*r,2*r); // piirrä ympyrä muuttujien avulla
y = y + vy; // Kasvata y:n arvoa lisäyksen verran (liike alas/ylös)
vy = vy + 0.1; // Kasvata lisäyksen suuruutta (kiihdytys/jarrutus)
if (y+r >= height) { // Jos saavutetaan alareuna, niin
vy = -vy*0.9; // Muuta lisäys negatiiviseksi
// ja samalla vähennä maksimia 10 %
y = height-r; // Anna y:lle uusi alkuarvo
}
}
Pallon pystysuuntainen paikka on ilmaistu muuttujalla y. Laskurin y = y +vy avulla pallo saadaan liikkumaan. Kun lisäys vy on positiivinen, niin pallo menee alaspäin, koska y:n arvo kasvaa. Kun lisäys vy on negatiivinen, niin pallo menee ylöspäin, koska y:n arvo pienenee. Koska myös muuttujalla vy on oma laskuri eli vy = vy +0.1; niin myös lisäyksen vy suuruus muuttuu. Kun vy on positiivinen, niin lisäys koko ajan kasvaa eli on kiihtyvässä liikkeessä. Kun vy on negatiivinen, niin lisäys koko ajan pienenee eli on hidastuvassa liikkeessä. Hidastuva liike jatkuu, kunnes vy on muuttunut positiiviseksi, jolloin se on taas kiihtyvää liikettä. Kun haluat muuttaa kiihtyvän liikkeen hidastuvaksi, niin sitä varten on ohjelmaan lisättävä ehto eli if-lause. Kun pallon alareuna (y+r) on vähintään yhtä suuri kuin ikkunan korkeus (height), niin tällöin muuta kiihtyvyys hidastuvuudeksi (vy = -vy*0.9). Tähän muutokseen on lisätty kerroin 0.9 eli muutoksesta säilyy vain 90 % jokaisella pompulla, niin pallo ei pääse pomppaamaan enää niin korkealle kuin edellisellä kierroksella. Samalla on hyvä antaa y:lle uusi alkuarvo, niin ei tule pyöristysvirheistä johtuvia heittoja. Oheinen kuva havainnollistaa ohjelman käyttämiä muuttujia.

Lisätään mukaan vielä vaakasuuntainen liike, niin pallo saadaan pomppimaan ikkunan sisällä realistisesti.
|
// Ohjelman tehnyt e-Oppi Oy
// 30.8.2017
float x = 50; // Pallon vaakasuunnan alkuarvo
float y = 50; // Pallon pystysuunnan alkuarvo
float vx= 2; // Vaakasuuntainen nopeus (vakio)
float vy = 0; // Nopeus alussa pystysuunnassa
float r = 20; // pallon säde
void setup() {
size(800,600); // Ikkunan koko
fill(0,0,255); // Täyttöväri sininen eli pallon väri
smooth(); // Pehmeä ruudun päivitys
}
void draw () {
background(255); // Tyhjennä tausta ja väritä se valkoiseksi
ellipse(x,y,2*r,2*r); // Piirrä pallo
x = x + vx; // Liiku vasemalle/oikealle
y = y + vy; // Liiku alas/ylös
vy = vy + 0.1; // Kiihtyvyys/hidastavuus pystyliikeessä
if (y+r >= height) { // Jos ikkunan alareuna saavutettu niin,
vy = -vy*0.9; // muuta kiihtyvyys hidastuvuudeksi ylöspäin
y = height-r; // Anna y:lle uusi alkuarvo (korjaa likiarvon)
}
if (x+r>= width) { // Jos ikkunan oikea reuna saavutettu niin
vx = -vx; // käännä suunta
}
if (x-r <=0) { // Jos ikkunan vasen reuna saavutettu, niin
vx = -vx; // Käännä suunta
}
}
Voit kokeilla muuttaa ikkunan kokoa, muuttujien alkuarvoja tai kertoimia 0.1 ja 0.9 laskukaavoissa. Ohjelmaa voitaisiin kehittää esimerkiksi siten, että arvottaisiin pallon aloituspaikka ja nopeus alussa.