Cvičenia: 2. týždeň

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:

  1. Uložíme súradnice korytnačky a aktuálne natočenie
  2. 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);
        }
}
  1. 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).
  • Naprogramujte náhodnú pochôdzku tak, aby oblasť pohybu korytnačky bola elipsa s danými súradnicami ohnísk a dĺžkou vedľajšej poloosi (http://sk.wikipedia.org/wiki/Elipsa)
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)