Ringjoonega seotud arvutused
Ring kipub vähegi graafilisemate lahenduste juures ikka ette tulema. Olgu siis
tegemist elementide paigutamise, liikumise või vaatesuundade arvutamisega.
Ringjoone parameetriline võrrand
Lisaks mehhaanikas asukoha leidmiseks tarvilikule x=x0+v0t+at2/2 ning
kaugusearvutusearvutusele on kolmandaks tähtsaks ettetulevaks arvutustehteks
ringjoone parameetriline võrrand: x=x0+r*cos(a), y=y0+r*sin(a). Selle abil saab
lihtsamal juhul panna näiteks täpi mööda ekraani ringikujuliselt liikuma.
Ringi arvutused
Ringjoone parameetriline võrrand
Ülesandeid
Käivita näide
Muuda liikumise keskkohta ja raadiust
Pane ekraanil korraga ringikujuliselt liikuma kaks täppi
Ruudud ringjoonel
Kui ühekorraga ruudud valmis joonistada ja mitte andmeid muuta ja ekraani
tühjendada, siis saab soovitud kujundid ilusti ringi peale paigutada.
Ringi arvutused
Ruudud ringjoonel
Ülesandeid
Käivita näide
Koosta kella numbrilaud - ringikujuliselt arvud 1-st 12ni.
Pane iga numbri juurde ka keskkoha poole suunduv joon.
Eelpool olevat ringjoonel liikumise näidet arvestades püüa tööle panna
osutitega kell.
Hulknurk
Järgnevalt veidi pikem näide, kus üheaegselt tegeldakse mitme punkti
keeramisega. Korrapärase hulknurga puhul tuleb teada nurkade arvu ning nende
kaugust keskpunktist. Edasi saab selle põhjal juba jooned tõmmata. Esimesse
punkti tasub minna moveTo-ga, edasi igasse järgmisse nurka saab lineTo abil
joone tõmmata kui tahta ühtlaselt ühendatud hulknurka saada. Ning viimasest
punktist sammu võrra edasi minnes jõutakse jälle algusesse tagasi.
Ringi arvutused
Ruudud ringjoonel
Ülesandeid
Käivita näide
Muuda nurkade arvu ja raadiust
Loo lehele slaiderid raadiuse ja nurkade arvu sujuvaks muutmiseks
Keerlev hulknurk
Hulknurga ühtlaselt keerlema panekuks tuleb esimese punkti algusnurka sujuvalt
muutma hakata. Kui teised esimese järgi arvutada, siis hakkabki nõnda kogu
hulknurk keerlema.
Ringi arvutused
Ruudud ringjoonel
Ülesandeid
Pane näide käima
Võimalda hulknurga pöörlemiskiirust slaideri abil muuta.
Võimalda ta ka teistpidi pöörlema panna
Nurga määramine
Ümmarguste asjade joonistamisel ning ringi ja kaart pidi liigutamisel on hea
ringjoone parameetrilise võrrandi abil nurga, keskpunkti ja raadiuse järgi
koordinaate leida. Hiirega rakendust juhtides aga tuleb mõnikord kasuks
vastupidine - tuleb leida hiire asukohale vastav nurk mõne punkti suhtes, et
saaks ekraanil kujundeid sobivalt pöörata ja liikuma panna. Õnneks on
Javaskriptis selle tarbeks kohandatud arkustanensi funktsioon Math.atan2(x, y),
mis annab etteantud koordinaatidega punkti paiknemise nurga nullpunkti suhtes.
Nõnda on asimuudi leidmine lihtsaks tehtud, tuleb vaid rakendusele sobivad
andmed ette sööta. Järgnevas näites näeb ekraani peal kahte punkti. Üks püsib
paigal, teise paiknemise suunda selle keskpunkti suhtes saab aga hiirega
määrata. Hiire asukoha ja keskpunkti kauguse põhjal leitakse keskpunktist hiire
poole suunduv nurk. Sinnapoole püsiva raadiuse kaugusele joonistatakse
ringjoone parameetrilise võrrandi abil täpp. Nii saabki hiire abil praegu ühte
täppi, aga soovi korral ka tunduvalt keerukamat kujundit ümber keskpunkti
pöörata.
Nurga leidmine
Ruudud ringjoonel
Ülesandeid
Pane näide käima
Kujunda ekraanile nupp, mida on võimalik koos sellel oleva kriipsuga hiire abil
pöörata
Pane selliseid nuppe ekraanile kaks. Kummagi nupu piires saab just selle nupu
pöördenurka sättida.
Rool
Täpi keeramise edasiarenduseks on lihtsa rooli keeramine. Hiire asukohast
leitud nurga järgi joonistatakse kaar punktist mõlemale poole. Ringjoone
parameetrilise võrrandi abil saab ümmarguse täpi kaare keskele soovitud suunda.
Teksti pööramiseks rooli keskosas sobib aga reeperi /koordinaatteljestiku
nihutus ja pööre. Salvestuskäsklusega talletatakse algne olek, et selle juurde
saaks tagasi minna. Edasi translate nihutab nullpunkti rooli keskkoha juurde.
Siis on võimlik tekst selle koha juures sobiva nurga alla keerata ja ekraanile
joonistada. Ning lõpuks restore-käsklus taastab endise olukorra, et muud
joonistuskäsud jälle arusaadavatesse kohtadesse läheksid.
g.save();
g.translate(keskx, kesky);
g.rotate(nurk+(Math.PI/2));
g.fillText("Rool", 0, 0);
g.restore();
Edasi juba töötav kood tervikuna.
Nurga leidmine
Ruudud ringjoonel
Ülesandeid
Pane näide käima
Asenda rooliratta suunda tähistav ringike sobiva nurga alla keeratud R-tähega
Liikur
Tavapäraselt kipume arvutigraafikas eraldi x- ja y-suunda arvestama ja meeles
pidama. Samas nurga all liikumise ja pööramiste puhul on mõnigikord mugavam
meeles pidada pigem asukohta ning liikumissuuna nurka. Edasised arvutused saab
juba nende andmete põhjal teha. Praegusel juhul arvutatakse iga sammu puhul
siinus ka koosiinus uuesti, mis üsnagi töömahukad arvutile. Koodi kiirust
võimalik siitkaudu kasvatada, aga ka nii paistab liikume täiesti õnnestuma.
Ringi arvutused
Ringjoone parameetriline võrrand
Ülesandeid
Pane näide käima
Lisa ekraanile nupud liikuri keeramiseks päri- ja vastupäeva
Pane korraga liikuma mitu liikurit
Joonista joone liikumissuunda näitavasse otsa väike ringike
Keerav liikur
Auto juhtmist jäljendades rooli pööramine ei tähenda mitte korraks sihi
muutust, vaid pööratud rool paneb edasisõidu ajal auto pidevalt vastavas suunas
pöörama. Sarnast tulemust püütakse ka siin saavutada. Ehk siis kui liikur
sõitma pannakse, siis määratakse talle lisaks asukohale, kiirusele ja
algnurgale ka nurgamuutus, et kui palju iga sammuga liikur uuesti pöörab.
Selliselt tehtud liikur sõidab siis vähegi otsesihist kõrvale kallutatuna
mitmesuguse suurusega ringe vastavalt etteantud nurgamuutusele.
Pööramissuuna ja -ulatuse paremaks jälgimiseks on sihtjoone otsas kümne
ekraanipunkti suurune juhtlõik, mis selgema nägemise huvides kolmekordse
võimendusega annab teada, et kui palju ja millises suunas pööratakse.
Pööramisjoone arvutamiseks võetakse liikumisjoone ots ning sealt edasi siis
arvutatakse vajaliku nurga ja pööramisjoone pikkuse järgi uued koordinaadid.
Ringi arvutused
Ringjoone parameetriline võrrand
Ülesandeid
Pane näide tööle
Lisa pööramisnurga suurendamiseks ja vähendamiseks nupud
Rool ja liikur
Autosõidu puhul saab pidevalt sõiduki pööramist muuta. Nii ka siin püütakse
nüüd kaks eraldi loodud lahendust kokku ühendada. Rooli juurest saab küsida, et
kui palju peaks keerama ning liikuri ülesandeks on siis need andmed vastu võtta
ning nende põhjal sujuvalt mööda ekraani liikuda. Suuremalt jaolt saab Rooli ja
Liikuri tüübid kokku kopeerida. Ning lihtsalt liikumise juures siis iga sammu
puhul küsida rooli käest selle pööratuse nurk ning määrata see autole uueks
rooli asendiks ehk nurgamuutuseks iga sammu juures.
auto1.uusRooliAsend(rool1.kysiNurk()/10);
Katseliselt selgus, et suhteliselt mugav oli autot juhtida praeguste
parameetrite järgi siis, kui keeramine sammu juures oli kümnendik rooli
tegelikust pöördenurgast. Aga eks selliste suhete paika sättimine olegi
rakenduse loomise juures mugavuse tekitamise ja katsetamise küsimus.
Ringi arvutused
Ringjoone parameetriline võrrand
Jooniselt võib näha, kuidas siis saab rooli abil liikurit mitut moodi sättida.
Ülesandeid
Pane näide käima
Muuda pööramise suurust vastavalt rooli asendile.
Ringrajasõit
Pane auto sõitma ümber täpi, loe mitu ringi on läbitud
Ringi kraadide järgi saab määrata "väravad", kui kaugelt mingi nurk tuleb
läbida. Väravad on näha joonisel ning nende õiget läbimist kontrollitakse
ringide kohta punktide arvutamisel.