Cvičenie 5 – Polia

Cieľom cvičení je vyskúšať a zautomatizovať prácu s poľom (s poľom primitívnych i referečných hodnôt).

Grafický editor

Vytvorte triedu GrafickyEditor rozširujúcu triedu WinPane. Grafický editor funguje takto:

  • v kresliacej ploche sa nachádza korytnačka (kresliace pero)
  • kliknutím do plochy sa korytnačka presunie na miesto, kam sa kliklo
  • pri pohybe myšou so zatlačeným klávesom Alt sa korytnačka natočí smerom k aktuálnej pozícii myši a nakreslí čiaru z jej aktuálnej pozície do pozície myši (korytnačka po nakreslení čiary ostáva tam, kde bola predtým)
  • pri pohybe myšou so zatlačeným ľavým tlačidlom myši (onMouseDragged), korytnačka sa presunie na miesto, kde je aktuálne myš, pričom počas tohto pohybu kreslí čiaru
    • poznámka pre špekulantov: iba ľavým tlačidlom myši, nie pri ťahaní inými tlačidlami

Korytnačkovo

  • Vytvorte triedu Korytnackovo rozširujúcu triedu WinPane. Po vytvorení objektu triedy Korytnackovo (v „inicializačnej“ metóde) nech sa v kresliacej ploche automaticky vygeneruje 10 korytnačiek na náhodnej pozícii.
    • Počas riešenia úlohy prediskutujte, čo je to pole, ako sa deklarujú premenné referencujúce polia určitého typu, ako sa vytvára pole („poľový objekt“), aké hodnoty sú v jednotlivých políčkach poľa po jeho vytvorení.
  • Doplňte do triedy Korytnackovo metódy:
    • void posunITu(int idx, double dlzka)idx-ta korytnačka spraví krok zadanej dĺžky
    • void nahodneFarby() – každá korytnačka si nastaví náhodnú farbu kresliaceho pera
    • Color sFarbouVon(int index) – vráti farbu i-tej korytnačky
  • Upravte triedu Korytnackovo tak, aby pri kliknutí do plochy sa náhodne zvolená korytnačka presunula na miesto kliknutia.
  • Do triedy Korytnackovo pridajte metódu krok, ktorá spraví následovné:
    • i-ta korytnačka sa natočí smerom k (i+1)-vej korytnačke (posledná smerom ku korytnačke s číslom 0) a spraví krok rovný 1/10 vzdialenosti k (i+1)-vej korytnačke.

1
public void krok()
  • Do triedy Korytnackovo pridajte metódu kroky, ktorá zadaný počet krát zavolá metódu krok, pričom medzi jednotlivými krokmi bude nejaké vhodné spomalenie (napr. použitím JPAZUtilities.delay(1000), ktorý pozastaví vykonávanie programu na 1000ms, čiže 1 sekundu).

1
public void kroky(int pocetKrokov)
  • Do triedy Korytnackovo pridajte metódu doKruhu, ktorá všetky korytnačky v ploche rovnomerne rozmiestni do kruhu so zadaným polomerom, ktorého stredom je stred kresliacej plochy. Návod: na rozmiestnenie korytnačiek si vytvorte pomocnú korytnačku, ktorá bude korytnačky rozmiestňovať na správne miesta.

1
public void doKruhu(double polomer)
  • Doplňte do triedy Korytnackovo metódu pocetTopKorytnaciek, ktorá vráti počet korytnačiek, ktoré majú y-ovú súradnicu menšiu ako je hodnota v parametri zhora

1
public int pocetTopKorytnaciek(double zhora)
  • Do triedy Korytnackovo pridajte metódu bezpecnyKruh, ktorá pre zadanú korytnačku (určenú jej indexom medzi korytnačkami) nakreslí najväčší možný kruh taký, že:
    • jeho stred je na pozícii zadanej korytnačky
    • žiadna iná korytnačka sa nenachádza v tomto kruhu

Poznámky:

  • Zo zadania vyplýva, že tento kruh sa musí dotýkať aspoň jednej inej – najbližšej – korytnačky.
  • Pri riešení úlohy sa vám môžu zísť konštanty: Double.MAX_VALUE (najväčšie číslo, ktoré možno uložiť v premennej typu double) a Double.POSITIVE_INFINITY (+nekonečno).

1
public void bezpecnyKruh(int indexKorytnacky)
  • Doplňte do triedy Korytnackovo metódy:
    • int laviciarka() – vráti index korytnačky, ktorá sa nachádza najviac vľavo
    • double najblizsie() – vráti ako sú vzdialené 2 korytnačky, ktoré sú k sebe najbližšie

Kvetinová farma – príbeh pokračuje

Do projektu Farma z prednášky pridajte metódy:

  • int pocetKvetin(int odZahonuIdx, int poZahonIdx) – vráti celkový počet kvetiniek od záhonu na indexe odZahonuIdx po záhon na indexe poZahonIdx
  • double priemernyPocetVZahone() – vráti priemerný počet kvetiniek v záhone
  • boolean neklesajuciPocet() – vráti, či počet kvetiniek v jednotlivých záhonoch tvorí neklesajúcu postupnosť
  • int pridatNaVyvazenie() – vráti, aký minimálny počet kvetiniek musíme vysadiť, aby počet kvetín v záhonoch na párnej pozícii bol rovnaký ako počet záhonov na nepárnej pozícii
  • int prazdneZaSebou() – vráti, aký maximálny počet prázdnych záhonov umiestnených v záhradke hneď za sebou sa nachádza v záhradke

Ďalšie úlohy

  • Do triedy Korytnackovo doprogramujte drag&drop presúvanie korytnačiek.
  • Upravte projekt Divný biliard z jedného z predošlých cvičení tak, aby sa nevygenerovala len jedna diera, ale 8 dier.

Pre fajnšmekrov

  • Do triedy Korytnackovo pridajte metódu vsetkyVKruhu, ktorá nakreslí najmenší možný kruh taký, že všetky korytnačky sa nachádzajú v tomto kruhu
    • Úloha vyžaduje okrem základných poznatkov z programovania aj základoškolskú geometriu. Preto je vhodné si najprv vyriešiť geometrickú časť na papier.
  • Do triedy Korytnackovo pridajte metódu vObmedzenomKruhu, ktorá nakreslí taký kruh s polomerom obmedzenie, v ktorom sa nachádza čo najviac korytnačiek. Pozn.: Využite poznatky z geometrie z metódy vsetkyVKruhu.

1
public void vObmedzenomKruhu(double obmedzenie)