Ciele cvičení druhého týždňa:
- vyskúšať si prácu s premennými a podmienkami
- náhodné pochôdzky z korytnačej grafiky na tréning "if"-ov
Pokiaľ to nie je explicitne uvedené, nepredpokladajte, že sa korytnačka nachádza v strede kresliacej plochy (t.j. nepoužívajte center
). Rovnako nepredpokladajte konkrétnu farbu pozadia kresliacej plochy (napr. bielu). Pri riešení úloh použite len konštrukcie, ktoré boli obsahom prvých dvoch prednášok.
"Opakovačky"
- Naučte korytnačky triedy
SmartTurtle
metódu chain
, ktorá nakreslí retiazku z modrých korálov. Retiazka sa skladá z parametrom určeného počtu korálov (beadCount
) zadaného polomeru (beadRadius
).
public void chain(int beadCount, double beadRadius)
- Naučte korytnačky triedy
SmartTurtle
metódu ngon
, ktorá nakreslí pravidelný n-uholník so zadanou dĺžkou strany. Diskutujte na cvičení o tom, ako matematicky vypočítať uhol, o ktorý sa má korytnačka pri kreslení otáčať.
public void ngon(int n, double sideLength) {
}
- Naučte korytnačky triedy
SmartTurtle
metódu dashedLine
, ktorá nakreslí prerušovanú čiaru skladajúcu sa zo zadaného počtu úsekov zadanej dĺžky (celková dĺžka čiary je n*segmentLength
). Každý úsek začína čiarou dĺžky segmentLength/4
, nasleduje medzera dĺžky segmentLength/2
a úsek končí čiarou dĺžky segmentLength/4
public void dashedLine(int n, double segmentLength) {
}
- S využitím metódy
isosceles
na nakreslenie rovnoramenného trojuholníka (z 2. prednášky) so zadanou dĺžkou ramena a uhlom, ktorý zvierajú, naučte korytnačky triedy SmartTurtle
metódu mill
s 2 parametrami:
- počet ramien (lopatiek)
- dĺžka ramena (dĺžka ramena lopatky)
- Naučte korytnačky triedy
SmartTurtle
metódu rgbChain
, s rovnakými parametrami a výsledkom ako metóda chain
, avšak s tým rozdielom, že farby jednotlivých korálov sa postupne striedajú: červená, zelená a modrá. Pozor, počet korálov nemusí byť násobkom čísla 3.
public void rgbChain(int beadCount, double beadRadius)
Moderné umenie zbesilej korytnačky
Náhodná pochôdzka je proces, kedy sa korytnačka nejakým náhodným spôsobom "túla" po kresliacej ploche. Ak sa korytnačka pri potulkách dostane mimo definovanú oblasť tak sa ihneď vráti späť.
Schéma:
- Uložíme súradnice korytnačky a aktuálne natočenie
- Vykonáme požadovaný počet náhodných krokov:
for (int i = 0; i < stepCount; i++) {
this.turn(Math.random() * 360);
this.step(5);
if (jeMimoDefinovanejOblasti) {
this.step(-5);
}
}
- Vrátime korytnačku do stavu, v akom bola pred realizovaním náhodnej pochôdzky
Naučte korytnačky triedy SmartTurtle
nasledujúce metódy:
- Oblasť pohybu korytnačky je kruh so zadaným polomerom a stredom v začiatočnej pozícii korytnačky.
public void circleWalk(int stepCount, double radius)
- Oblasť pohybu korytnačky je kruh so zadaným polomerom a stredom v začiatočnej pozícii korytnačky. Naviac do vzdialenosti
radius/3
od stredu korytnačka nekreslí žiadne čiary, vo vzdialenosti medzi radius/3
a 2*radius/3
kreslí modré čiary a v poslednej tretine červené čiary.
public void tripleCircleWalk(int stepCount, double radius)
- Oblasť pohybu korytnačky je štvorec so zadanou dĺžkou strany a stredom v začiatočnej pozícii korytnačky.
public void squareWalk(int stepCount, double sideLength)
- Vytvorte metódu, ktorá realizuje náhodnú pochôdzku, kde povolená oblasť pohybu je kruh (s polomerom zadaným parametrom) so stredom v počiatočnej pozícii korytnačky. V tejto metóde nech korytnačka postupne a cyklicky mení farbu kresliaceho pera: prvých 100 krokov je červenou farbou, ďalších 82 krokov je modrou farbou, ďalších 122 krokov je čiernou farbou, a potom opäť 100 krokov červenej farby, 82 krokov modrou, 122 krokov čiernou... kým sa nevykoná zadaný počet krokov. (Návod: celočíselná premenná ako počítadlo)
public void circleWalk(int stepCount, double radius)
Moderné umenie náhodných bodiek
- Naučte korytnačky triedy
Artist
metódu popArt
, ktorá namaľuje zarámovaný obraz moderného umenia. V metóde popArt
korytnačka pracuje nasledujúcim spôsobom:
- korytnačka si uloží súradnice a natočenie
- korytnačka namaľuje rám obrazu - rám obrazu je obdlžník so zadanými rozmermi, ktorého strany sú rovnobežné so stranami kresliacej plochy a ktorého ľavý horný roh je v aktuálnej pozícii korytnačky (každý z rozmerov je aspoň 30)
- korytnačka nakreslí
dotCount
náhodných bodiek, pre ktoré platí:
- bodka má náhodný polomer medzi
<2, 7)
- žiadna časť bodky sa nesmie nachádzať (presahovať) mimo nakreslený rám
- plochu rámu chceme maximálne využiť - bodka sa môže vygenerovať ľubovoľne blízko hranice rámu - môže sa rámu dokonca až dotýkať
- farba bodky je červená alebo modrá, pričom farba pre konkrétnu bodku je určená náhodne
- korytnačka sa presunie na miesto a nastaví si smer, v akom bola na začiatku volania metódy
Upozornenie: toto nie je úloha na náhodnú pochôdzku, ale počas generovania bodiek im treba nejako rozumne (a náhodne) generovať súradnice tak, aby ostali v ráme.
Čo nebolo na prednáške (povinné)
- Predpokladajme, že máme premenné
a
a b
. Navrhnite postupnosť príkazov, ktoré navzájom vymenia obsah premenných a
a b
v prípade, že hodnota v premennej b
je väčšia ako hodnota v premennej a
.
int a = ...;
int b = ...;
- Na prednáške bolo ukázané, ako vyrobiť náhodné reálne číslo z intervalu
<0, 1)
- Navrhnite ako vyrobiť náhodné reálne číslo z intervalu
<a, b)
.
- Navrhnite ako vyrobiť celé číslo medzi medzi
0
a n-1
. Využite a naučte sa príkaz na pretypovanie reálneho čísla na celé číslo (orezanie desatinnej časti). Príklad pretypovania:
double realne = 3.14;
int cele = (int)realne;
int cele2 = (int)(realne * 8.3);
int cele3 = 3 + (int)(realne / 8.3);
- Využite pretypovanie pri náhodnej pochôdzke tak, aby korytnačka mala natočenia iba
0, 90, 180, 270
.
- Doposiaľ sme v našich programoch používali predpripravené a pomenované farby. Java však umožňuje namiešať si ľubovoľnú farbu na základe RGB zložiek (http://cs.wikipedia.org/wiki/RGB). Každá z RGB zložiek farby je celé číslo v rozsahu od 0 po 255. Ak chceme nastaviť farbu kresliaceho pera na farbu so zložkami
(R: 100, G: 8, B: 232)
, použijeme nasledujúci príkaz:
this.setPenColor(new Color(100, 8, 232));
Využite generovanie náhodných celých čísel na vytváranie náhodných farieb. Experimentujte s náhodnými farbami.
Ďalšie úlohy
- Naučte korytnačky triedy
SmartTurtle
metódu rectangleWithDiagonals
s 2 parametrami: šírka a výška obdlžníka. Aktuálna pozícia korytnačky je v jednom z rohov nakresleného obdlžníka a výška obdlžníka má rovnaký smer, ako je aktuálne natočená korytnačka. Využite, že si viete zapamätať súradnice bodov, ktorými korytnačka prechádza a neskôr tieto súradnice využiť na kreslenie.
- S využitím metódy
mill
na nakreslenie mlyna so zadaným počtom lopatiek (ramien) vytvorte jednoduchú animáciu mlyna. Nasledujúci kód vložte do "spúšťača":
franklin.center();
for (int i=0; i<1000; i++) {
sandbox.clear();
franklin.turn(1);
franklin.mill(6, 100);
JPAZUtilities.delay(50);
}
- Experimentujte s rôznymi uhlami natočenia a rôznymi spôsobmi predĺžovania/skracovania kroku pri kreslení špirál v nasledujúcej metóde:
public void spiral(int lineCount, double initialLength, double angle) {
double stepLength = initialLength;
for (int i = 0; i < lineCount; i++) {
this.step(stepLength);
JPAZUtilities.delay(50);
this.turn(angle);
stepLength = stepLength - 2;
}
}
- Naprogramujte metódu
wagon
, ktorá nakreslí vagón, ako je na obrázku nižšie. Farba vagónu je zadaná parametrom color
.
public void wagon(double width, Color color) {
}
Parameter width
udáva šírku vagóna, jeho výška je rovná polovici šírky. Kolesá majú polomer 1/8
šírky a nachádzajú sa 1/4
šírky od okrajov vagóna. Ľavý dolný roh okna začína presne nad stredom prvého kolesa a je vo výške 1/4
šírky od dolného okraja (šírka okna je rovná polovici šírky vagóna a výška okna 1/6
tejto šírky).
- S využitím metódy
wagon
vytvorte metódu train
. Táto metóda nakreslí vlak skladajúci sa zo zadaného počtu červených vagónov (parameter wagonCount
). Jednotlivé vagóny sú spojené tiahlom, ktorého dĺžka je určená parametrom gap
.
public void train(int wagonCount, double width, double gap) {
}
Pre fajnšmekrov
- Naučte korytnačky triedy
SmartTurtle
metódu zigZag
, ktorá nakreslí cik-cakovú čiaru zo zadaným počtom cik-cakov a zadanou dĺžkou cik-caku. Uhol v cípoch nech je 90 stupňov. Ešte pokročilejší si môžu vyskúšať variant s 3 parametrami (počet cik-cakov, dĺžka cik-caku, uhol v cípoch cik-caku).
public void ellipsoidalWalk(int stepCount, double xA, double yA, double xB, double yB, double b)
Poznámka: na výpočet odmocniny je možné použiť funkciu Math.sqrt(cislo)