Esimerkki: Gravitaatio

Haluamme, että pallo putoaa alaspäin kiihtyen ja pomppaa ylöspäin hidastuen. Tutkitaan seuraavaa esimerkkiä:

SANALLINEN ALGORITMI
  1. Määrittele globaali desimaalilukumuuttuja x ja anna sille alkuarvo 400 (ympyrän vaakasuuntainen liike).
  2. Määrittele globaali desimaalilukumuuttuja y ja anna sille alkuarvo 50 (ympyrän pystysuuntainen liike).
  3. Määrittele globaali desimaalilukumuuttuja vy ja anna sille alkuarvo 0 (ympyrän nopeus).
  4. Määrittele globaali desimaalilukumuuttuja r ja anna sille alkuarvo 20 (ympyrän säde).
  5. Aseta ikkunan kooksi 800 px vaakaan ja 600 px pystyyn.
  6. Aseta täyttöväriksi sininen.
  7. Aseta asetus, joka pehmentää liikettä.
  8. Tyhjennä ikkuna ja aseta tausta väriksi valkoinen.
  9. Piirrä ympyrä, jonka halkaisija on 2*r ja keskipiste on kohdassa (x,y).
  10. Kasvata muuttujaa y muuttujan arvolla vy, missä y on ympyrän paikka ja vy on nopeus.
  11. Kasvata muuttujaa vy arvolla 0.1. Jos muuttuja vy on positiivinen, niin vy tällöin kasvaa (kiihtyvä liike). Jos muuttuja vy on negatiivinen, niin tällöin vy pienenee (hidastuva liike).
  12. Jos pallon alareuna (y+r) on suurempi tai yhtä suuri kuin ikkunan korkeus (height), niin silloin
    muuta muuttuja vy negatiiviseksi ja samalla muuta sen arvo 10% pienemmäksi (0.9-kertaiseksi).
    Anna y:lle uusi alkuarvo alhaalta.

// 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.

SANALLINEN ALGORITMI
  1. Määrittele globaali desimaalilukumuuttuja x ja anna sille alkuarvo 400 (ympyrän vaakasuuntainen liike).
  2. Määrittele globaali desimaalilukumuuttuja y ja anna sille alkuarvo 50 (ympyrän pystysuuntainen liike).
  3. Määrittele globaali desimaalilukumuuttuja vx ja anna sille alkuarvo 2 (ympyrän nopeus vaakasuunnassa).
  4. Määrittele globaali desimaalilukumuuttuja vy ja anna sille alkuarvo 0 (ympyrän nopeus pystysuunnassa).
  5. Määrittele globaali desimaalilukumuuttuja r ja anna sille alkuarvo 20 (ympyrän säde).
  6. Aseta ikkunan kooksi 800 px vaakaan ja 600 px pystyyn.
  7. Aseta täyttöväriksi sininen.
  8. Aseta asetus, joka pehmentää liikettä.
  9. Tyhjennä ikkuna ja aseta tausta väriksi valkoinen.
  10. Piirrä ympyrä, jonka halkaisija on 2*r ja keskipiste on kohdassa (x,y).
  11. Kasvata muuttujaa x muuttujan arvolla vx, missä x on ympyrän vaakasuuntainen paikka ja vx on vaakasuuntainen nopeus.
  12. Kasvata muuttujaa y muuttujan arvolla vy, missä y on ympyrän pystysuuntainen paikka ja vy on pystysuuntainen nopeus.
  13. Kasvata muuttujaa vy arvolla 0.1. Jos muuttuja vy on positiivinen, niin vy tällöin kasvaa (kiihtyvä liike). Jos muuttuja vy on negatiivinen, niin tällöin vy pienenee (hidastuva liike).
  14. Jos pallon alareuna (y+r) on suurempi tai yhtä suuri kuin ikkunan korkeus (height), niin silloin
    muuta muuttuja vy negatiiviseksi ja samalla muuta sen arvo 10 % pienemmäksi (0.9-kertaiseksi).
    Anna y:lle uusi alkuarvo alhaalta.
  15. Jos ympyrän oikea reuna (x+r) saavuttaa ikkunan leveyden (width), niin silloin
    muuta vx:n arvo vastaluvuksi, jolloin liikesuunta muuttuu oikealta vasemmalle.
  16. Jos ympyrän vasen reuna (x-r) saavuttaa ikkunan leveyden (width), niin silloin muuta vx:n arvo vastaluvuksi, jolloin liikesuunta muuttuu vasemmalta oikealle.

// 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.