8.1 Laskeminen funktioilla
Processing ohjelman matemaattiset funktiot
Processing-ohjelman mukana tulee valmiita funktioita laskemiseen. Esitetään niistä tässä yleisimmät.
Katsotaan seuraavaksi funktioiden käyttöä esimerkkien avulla. Tässä kappaleessa ei ole tehtäviä, vaan näitä esimerkkejä on tarkoitus käydä ja soveltaa samalla, kun asiaa käydään läpi matematiikan kirjassa.
| FUNKTIO | MERKITYS | ESIMERKKI |
|---|---|---|
| sq(luku) | Luvun neliö | sq(3)= 9 |
| sqrt(luku) | Luvun neliöjuuri | sqrt(25) = 5 |
| nfc(a,n) | Pyöristää luvun a n:n desimaalin tarkkuudella. | nfc(12.451,1) = 12.5 |
| pow(a,n) | Kantaluvun a eksponentti n | pow(2,3) = 8 |
| max(a,b) | Luvuista suurempi | max(3,6) = 6 |
| min(a,b) | Luvuista pienempi | min(3,6) = 3 |
| abs(luku) | Luvun itseisarvo | abs(-4) = 4 |
| ceil(luku) | Lukua suurempi kokonaisluku | ceil(6.7) = 6 |
| floor(luku) | Lukua pienempi kokonaisluku | ceil(6.7) = 7 |
| norm(luku,min,max) | Muuttaa luvun 0:n ja 1:n välissä olevaksi desimaaliluvuksi. | norm(20,0,50)=0.4 |
| round(luku) | Pyöristää luvun | round(5.6) = 6 |
| PI | Ilmoittaa piin arvon | 3.142 |
| radians(kulma) | Muuttaa asteet radiaaneiksi | radians(180)=3.142 |
| degrees(kulma) | Muuttaa radiaanit asteiksi | degrees(PI/2)=90.000 |
| sin(kulma) | Kulman sini | sin(radians(30)) =0.5 |
| cos(kulma) | Kulma kosini | cos(radians(30))=0.87 |
| tan(kulma) | Kulman tangentti | tan(radians(30))=0.58 |
| asin(kulma) | Sinin käänteisfunktio | degrees(asin(0.5)))=30 |
| acos(kulma) | Kosinin käänteisfunktio | degrees(acos(0.5))=60 |
| atan(kulma) | Tangentin käänteisfunktio | degrees(atan(1))=45 |
| atan2(x,y) | Origosta lähtevän viivan ja pystyakselin välinen kulma | degrees(atan2(3,4))=37 |
| dist(x1,y1,x2,y2) | Kahden pisteen välinen etäisyys | dist(0,0,3,4)=5 |
| mag(x,y) | Pisteen etäisyys origosta | mag(3,4)=5 |
Katsotaan seuraavaksi funktioiden käyttöä esimerkkien avulla. Tässä kappaleessa ei ole tehtäviä, vaan näitä esimerkkejä on tarkoitus käydä ja soveltaa samalla, kun asiaa käydään läpi matematiikan kirjassa.
Polynomin arvon laskeminen
Haluamme laskea polynomin f(x) = x2 –3x + 5 arvon, kun x = –5. Ohjelma, joka laskee sen, on seuraava.
Ohjelma tulostaa seuraavaa.

// Ohjelman tehnyt e-Oppi Oy
// 30.8.2017
void setup () {
size(400,200); // Ikkunan koko
background(255); // Taustaväri valkoinen
textSize(24); // Tekstin koko
fill(0); // Tekstin väri musta
}
void draw () {
float x = -5; // Muuttujan arvo
float y = sq(x)-3*x+5; // Polynomin arvo
text("f(x) = x\u00B2-3x+5",10,50); // Tulostetaan lauseke
text("f("+x+") = "+y,10,100); // Tulostetaan muuttujat
}
Ohjelma tulostaa seuraavaa.

Hypotenuusan laskeminen suorakulmaisesta kolmiosta
Haluamme laskea suorakulmaisesta kolmiosta hypotenuusan arvon, kun kateetit ovat 7 ja 12. Ohjelma, joka laskee hypotenuusan arvon, on seuraava.
Periaatteessa mag()-funktio laskee pisteen etäisyyden origosta. Mutta soveltuu myös hypotenuusan laskemiseen.
// Ohjelman tehnyt e-Oppi Oy
// 30.8.2017
void setup () {
size(500,250); // Ikkunan koko
background(255); // Taustaväri valkoinen
textSize(24); // Tekstin koko
fill(0); // Tekstin väri musta
}
void draw () {
float a = 7; // Kateetit
float b= 12;
float c = sqrt(sq(a)+sq(b)); // Hypotenuusan arvo
text("Suorakulmaisen kolmion kateetit ovat: ",10,50);
text("a = "+a,10,100);
text("b = "+b,10,150);
text("Hypotenuusa c = "+nfc(c,1),10,200); // Pyöristys 1-desimaalin tarkkuudella
}
Ohjelma tulostaa seuraavaa.

Muuttujan c-arvo voidaan myös laskea seuraavasti:
float c = mag(a,b); // Hypotenuusan arvo
Periaatteessa mag()-funktio laskee pisteen etäisyyden origosta. Mutta soveltuu myös hypotenuusan laskemiseen.
Eksponentin laskeminen
Lasketaan potenssien arvoja.
Ohjelma tulostaa seuraavaa.

// Ohjelman tehnyt e-Oppi Oy
// 30.8.2017
void setup () {
size(500,250); // Ikkunan koko
background(255); // Taustaväri valkoinen
textSize(24); // Tekstin koko
fill(0); // Tekstin väri musta
}
void draw () {
text("2\u2075 = "+pow(2,5),10,50);
text("5\u00B2 = "+pow(5,2),10,100);
text("2\u00B3\u00B72\u2074 = 2\u2077 = "+pow(2,7),10,150);
text("(2\u00B2)\u00B3 ="+pow(pow(2,2),3),10,200);
}
Ohjelma tulostaa seuraavaa.

Suurin ja pienin
Tutkitaan, kumpi muuttujista on suurempi ja kumpi pienempi.
Jolloin ohjelma tulostaa seuraavaa.

// Ohjelman tehnyt e-Oppi Oy
// 30.8.2017
void setup () {
size(500,250); // Ikkunan koko
background(255); // Taustaväri valkoinen
textSize(24); // Tekstin koko
fill(0); // Tekstin väri musta
}
void draw () {
int a = 5;
int b = 8;
text("Suurempi luvuista "+a+" ja "+b+" on "+max(a,b),10,100);
text("Pienempi luvuista "+a+" ja "+b+" on "+min(a,b),10,150);
}
Jolloin ohjelma tulostaa seuraavaa.

Luvun pyöristäminen
Tutkitaan, kuinka lukua voidaan pyöristää.
Ohjelma tulostaa seuraavaa.

// Ohjelman tehnyt e-Oppi Oy
// 30.8.2017
void setup () {
size(500,300); // Ikkunan koko
background(255); // Taustaväri valkoinen
textSize(24); // Tekstin koko
fill(0); // Tekstin väri musta
}
void draw () {
text(abs(-4.835),10,30); // Itseisarvo
text(round(-4.835),10,60); // Pyöristys
text(int(-4.835),10,90); // Kokonaisosa
text(ceil(-4.835),10,120); // Suurempi kokonaisluku
text(floor(-4.835),10,150); // Pienempi kokonaisluku
text(ceil(4.835),10,180); // Suurempi kokonaisluku
text(floor(4.835),10,210); // Pienempi kokonaisluku
text(nfc(-4.835,1),10,240); // 1-desimaali
text(nfc(-4.835,2),10,270); // 2-desimaalia
}
Ohjelma tulostaa seuraavaa.

Kuinka monta prosenttia?
Lasketaan, kuinka monta prosenttia luku a on luvusta b.
Ohjelma tulostaa seuraavaa. Voit kokeilla muuttaa a:n ja b:n arvoja.

// Ohjelman tehnyt e-Oppi Oy
// 30.8.2017
void setup () {
size(500,300); // Ikkunan koko
background(255); // Taustaväri valkoinen
textSize(24); // Tekstin koko
fill(0); // Tekstin väri musta
}
void draw () {
float a = 4;
float b = 14;
text("Kuinka monta prosenttia "+a+" on "+b+":sta?",10,50);
text(norm(a,0,b)+" = "+nfc(norm(a,0,b)*100,1)+" %",10,100);
}
Ohjelma tulostaa seuraavaa. Voit kokeilla muuttaa a:n ja b:n arvoja.

Ympyrän pinta-ala ja piiri
Laskemme ympyrän pinta-alan ja piirin.
Ohjelma tulostaa seuraavaa.

// Ohjelman tehnyt e-Oppi Oy
// 30.8.2017
void setup () {
size(500,200); // Ikkunan koko
background(255); // Taustaväri valkoinen
textSize(24); // Tekstin koko
fill(0); // Tekstin väri musta
}
void draw () {
float r = 4;
float A = PI*sq(r);
float p = 2*PI*r;
text("Ympyrän säde on "+r+" cm",10,50);
text("Pinta-ala A = "+nfc(A,1)+" cm\u00B2",10,100);
text("Piiri p = "+nfc(p,1)+" cm",10,150);
}
Ohjelma tulostaa seuraavaa.

Kulman laskeminen

Haluamme laskea kuvan mukaisen suorakulmaisen kolmion kulmat.
// Ohjelman tehnyt e-Oppi Oy
// 30.8.2017
void setup () {
size(500,200); // Ikkunan koko
background(255); // Taustaväri valkoinen
textSize(24); // Tekstin koko
fill(0); // Tekstin väri musta
}
void draw () {
float a = 3.0;
float b = 4.0;
float c = 5.0;
text("\u03B1 ="+nfc(degrees(asin(a/c)),1)+"\u00B0",10,50);
text("\u03B1 ="+nfc(degrees(acos(b/c)),1)+"\u00B0",10,100);
text("\u03B2 ="+nfc(degrees(atan(b/a)),1)+"\u00B0",10,150);
}

Sivun pituuden laskeminen kulman avulla

Haluamme laskea kuvan mukaisesta suorakulmaisesta kolmiosta a:n ja b:n pituudet.
// Ohjelman tehnyt e-Oppi Oy
// 30.8.2017
void setup () {
size(500,250); // Ikkunan koko
background(255); // Taustaväri valkoinen
textSize(24); // Tekstin koko
fill(0); // Tekstin väri musta
}
void draw () {
float alfa = 35;
float beeta = 55;
float c = 120;
text("a = "+nfc(c*sin(radians(alfa)),1)+" m",10,50);
text("b = "+nfc(c*cos(radians(alfa)),1)+" m",10,100);
text("b = "+nfc(c*sin(radians(beeta)),1)+" m",10,150);
text("a = "+nfc(c*cos(radians(beeta)),1)+" m",10,200);
}
Tulostuu seuraavaa.

Pisteen etäisyys origosta ja viivan ja pystyakselin välinen kulma
Komennolla dist(x1,y1,x2,y2) voimme selvittää kahden pisteen välisen etäisyyden toisistaan ja komennolla atan2(x,y) voimme laskea origosta lähtevän viivan kierokulman origon ympäri. Oheinen esimerkki havainnollistaa asiaa.
Kun ajat ohjelman, niin liikuta hiirtä. Ohjelman tulostus on esimerkiksi seuraavanlainen.

void setup () {
size(400,400); // Ikkunan koko
textSize(24); // Tekstin koko
fill(0); // Tekstin väri musta
}
void draw () {
background(255); // Taustaväri valkoinen
translate(200,200); // Origo ikkunan keskelle
line(-200,0,200,2); // Vaaka-akseli
line(0,200,0,-200); // Pystyakseli
float x = mouseX-200; // Lue hiiren koordinaatit
float y = mouseY-200; // Lue hiiren koordinaatit
line(0,0,x,y); // Piirrä viiva origosta
float kulma=atan2(x,y); // Laske kulma radiaaneina
float pituus=dist(0,0,x,y); // Viivan pituus
text(nfc(degrees(kulma),1)+"\u00B0",x,y); // Tulosta kulma asteina
text(nfc(pituus,1),-200,-170); //Tulosta viivan pituus
}
Kun ajat ohjelman, niin liikuta hiirtä. Ohjelman tulostus on esimerkiksi seuraavanlainen.

Seuraaja
Tehdään ohjelma, jossa ympyrä liikkuu hiiren liikkeiden mukaan. Nuoli on seuraaja, joka menee aina kohti ympyrää. Ohjelman koodi on seuraava.
Ohjelman idea on se, että laskureilla a ja b liikutaan aina kohti hiirtä. Kun haluamme pyörittää nuolta, niin silloin vain pyörityksen ajaksi siirrämme origon nuolen paikalle. Oikea kulma pyöritykselle voidaan laskea tan2()-funktiolla. Kun nuoli on pyöritetty oikeaan asentoon, niin sen jälkeen palautamme koordinaatiston takaisin popMatrix()-komennolla. Ohjelman suoritus näyttää tältä.

// Ohjelman tehnyt e-Oppi Oy
// 30.8.2017
int a = 200; // Nuolen alkukoordinaatti
int b = 200; // Nuolen alkukoordinaatti
void setup () {
size(400,400); // Ikkunan koko
}
void draw () {
background(255); // Taustaväri valkoinen
float x = mouseX; // Hiiren vaaka koordinaatti
float y = mouseY; // Hiiren pysty koordinaatti
float kulma = degrees(atan2(x-a,y-b)); // Ympyrän ja hiiren välinen kulma
pushMatrix(); // Nuolen pyöritys alkaa, muistiin
translate(a,b); // Origo nuolen paikkaan
rotate(radians(90-kulma)); // Käännä nuoli kohti hiirtä
fill(255,0,0); // Punainen väri
noStroke(); // Ei reunaviivaa
rect(-20,-10,30,20); // Suorakulmio
triangle(20,0,0,20,0,-20); // Kolmio
popMatrix(); // Nuolen pyöritys loppuu, palauta muistista
if (a < x) { // Liiku kohti hiirtä
a++;
}
if (a > x) {
a--;
}
if (b < y) {
b++;
}
if (b > y) {
b--;
}
fill(0); // Musta väri
ellipse(x,y,20,20); // Ympyrä eli hiiren kursori
if((x==a) && (y==b)) { // Jos nuolen koordinaatit = hiiren koordinaatit
noLoop(); // Lopeta toisto
textSize(100); // Tekstin koko 100
fill(0,0,255); // Sininen väri
text("Game",50,150); // Peli
text("Over",50,250); // Loppui
}
}
Ohjelman idea on se, että laskureilla a ja b liikutaan aina kohti hiirtä. Kun haluamme pyörittää nuolta, niin silloin vain pyörityksen ajaksi siirrämme origon nuolen paikalle. Oikea kulma pyöritykselle voidaan laskea tan2()-funktiolla. Kun nuoli on pyöritetty oikeaan asentoon, niin sen jälkeen palautamme koordinaatiston takaisin popMatrix()-komennolla. Ohjelman suoritus näyttää tältä.
