Cieľom cvičení druhého týždňa (praktického aj teoretického) je vyskúšať si prácu s premennými a podmienkami. Z korytnačej grafiky si vyskúšame náhodné pochôdzky. 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
ChytraKorytnacka
metódu retiazka
, ktorá nakreslí retiazku z modrých korálov. Retiazka sa skladá z parametrom určeného počtu korálov (pocetKoralov
) zadaného polomeru (polomerKoralu
).
public void retiazka(int pocetKoralov, double polomerKoralu)
- Naučte korytnačky triedy
ChytraKorytnacka
metódu nUholnik
, 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 nUholnik(int n, double dlzkaStrany) {
}
- Naučte korytnačky triedy
ChytraKorytnacka
metódu prerusovana
, ktorá nakreslí prerušovanú čiaru skladajúcu sa zo zadaného počtu úsekov zadanej dĺžky (celková dĺžka čiary je n*dlzkaUseku
). Každý úsek začína čiarou dĺžky dlzkaUseku/4
, nasleduje medzera dĺžky dlzkaUseku/2
a úsek končí čiarou dĺžky dlzkaUseku/4
public void prerusovana(int n, double dlzkaUseku) {
}
- S využitím metódy
rovnoramenny
na nakreslenie rovnoramenného trojuholníka (z 2. prednášky) so zadanou dĺžkou ramena a uhlom, ktorý zvierajú, naučte korytnačky triedy ChytraKorytnacka
metódu mlyn
s 2 parametrami:
- počet ramien (lopatiek)
- dĺžka ramena (dĺžka ramena lopatky)
- Naučte korytnačky triedy
ChytraKorytnacka
metódu retiazkaRGB
, s rovnakými parametrami a výsledkom ako metóda retiazka
, 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 retiazkaRGB(int pocetKoralov, double polomerKoralu)
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 < pocetKrokov; 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 ChytraKorytnacka
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 pochodzkaKruh(int pocetKrokov, double polomer)
- Oblasť pohybu korytnačky je kruh so zadaným polomerom a stredom v začiatočnej pozícii korytnačky. Naviac do vzdialenosti
polomer/3
od stedu korytnačka nekreslí žiadne čiary, vo vzdialenosti medzi polomer/3
a 2*polomer/3
kreslí modré čiary a v poslednej tretine červené čiary.
public void pochodzkaTrojkruh(int pocetKrokov, double polomer)
- Oblasť pohybu korytnačky je štvorec so zadanou dĺžkou strany a stredom v začiatočnej pozícii korytnačky.
public void pochodzkaStvorec(int pocetKrokov, double strana)
- 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 pochodzkaKruh(int pocetKrokov, double polomer)
Moderné umenie náhodných bodiek
- Naučte korytnačky triedy
Maliar
metódu moderneUmenie
, ktorá namaľuje zarámovaný obraz moderného umenia. V metóde moderneUmenie
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í
pocetBodiek
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);
- 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
ChytraKorytnacka
metódu obdlznikSPrieckami
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
mlyn
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":
korytnacka.center();
for (int i=0; i<1000; i++) {
plocha.clear();
korytnacka.turn(1);
korytnacka.mlyn(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 spirala(int pocetStran, double pociatocnyKrok, double uhol) {
double krok = pociatocnyKrok;
for (int i = 0; i < pocetStran; i++) {
this.step(krok);
JPAZUtilities.delay(50);
this.turn(uhol);
krok = krok - 2;
}
}
Pre fajnšmekrov
- Naučte korytnačky triedy
ChytraKorytnacka
metódu cikcak
, 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 pochodzkaElipsa(int pocetKrokov, 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)