5. sada domácich zadaní

Najneskorší termín odovzdania: 1.11.2016 (utorok) o 22:00
Odovzdávané súbory: KorytnaciSvet.java

Doplňujúce požiadavky:

  • riešenia, ktoré nebude možné skompilovať (t.j. riešenia so syntaktickými chybami) nebudú hodnotené,
  • zdrojový kód správne naformátujte (CTRL+SHIFT+F),
  • očakáva sa vhodne okomentovaný zdrojový kód

Korytnačí svet

Uvažujme triedu KorytnaciSvet, ktorá rozširuje triedu WinPane:

import java.awt.event.MouseEvent;

import sk.upjs.jpaz2.*;

public class KorytnaciSvet extends WinPane {
        /**
         * Referencia na pole korytnaciek
         */

        private Turtle[] korytnacky = null;

        /**
         * Inicializacna metoda
         */

        public KorytnaciSvet() {
                this.korytnacky = new Turtle[0];
        }

        /**
         * Metoda na pridanie korytnacky na zadanych suradniciach
         */

        public void pridajKorytnacku(int x, int y) {
                Turtle novaKorytnacka = new Turtle();
                this.add(novaKorytnacka);
                novaKorytnacka.setPosition(x, y);

                Turtle[] noveKorytnacky = new Turtle[this.korytnacky.length + 1];
                System.arraycopy(this.korytnacky, 0, noveKorytnacky, 0, this.korytnacky.length);
                noveKorytnacky[noveKorytnacky.length-1] = novaKorytnacka;

                this.korytnacky = noveKorytnacky;
        }

        @Override
        protected void onMouseClicked(int x, int y, MouseEvent detail) {
                if (!(detail.isAltDown() || detail.isControlDown() || detail.isShiftDown())) {
                        this.pridajKorytnacku(x, y);
                }
        }
}

Výstrel na ťažisko (2 body)

Do triedy KorytnaciSvet pridajte metódu vystrelNaTazisko, ktorej výsledkom bude to, že každá korytnačka nakreslí čiaru zo svojej pozície do ťažiska všetkých korytnačiek. Súradnice ťažiska korytnačiek možno vypočítať ako priemer pozícii jednotlivých korytnačiek (napr. x-ová súradnica ťažiska je priemerom x-ových súradníc korytnačiek): http://en.wikipedia.org/wiki/Centroid#Of_a_finite_set_of_points

Do radu (4 body)

Do triedy KorytnaciSvet pridajte metódu doRadu, ktorá rovnomerne umiestni korytnačky v ploche na úsečke, ktorá je určená pozíciou najľavejšej a najpravejšej korytnačky v ploche. Rovnomerne umiestniť korytnačky na úsečke znamená, že v krajných bodoch úsečky je po jednej korytnačke. Zvyšné korytnačky sú s rovnakým rozostupom umiestnené na tejto úsečke medzi jej krajnými bodmi. Ak sú v ploche len 2 korytnačky alebo menej, korytnačky nepresúvajte.

Pozor, po premiestnení korytnačiek ich natočenie musí byť zachované.

public void doRadu()

Prestrelka (5 bodov)

A je to tu. Zločin zavítal aj do korytnačieho sveta. Máme tu prvú prestrelku. Vo svete korytnačiek však aj prestrelky majú svoje pravidlá:

  • ako prvá začína strieľať zvolená korytnačka (určená indexom - indexy korytnačiek rastú od 0 v poradí pridania korytnačiek do korytnačieho sveta),
  • strieľajúca korytnačka strieľa vždy na najbližšiu doposiaľ nezasiahnutú korytnačku (výstrel znázorňujeme tak, že strieľajúca korytnačka sa natočím smerom k cieľu a dráha strely je vyznačená čiarou od strelca k cieľu),
  • každá korytnačka strieľa na cieľ ihneď po svojom zasiahnutí.

Do triedy KorytnaciSvet pridajte metódu prestrelka, ktorá zadanou farbou znázorní strely vypálené pri prestrelke, ktorú začne korytnačka s indexom určeným parametrom metódy.

public void prestrelka(int idxPrvehoStrelca, Color farbaStriel);

Rada: Na uloženie toho, ktorá korytnačka už bola zasiahnutá, môžete využiť lokálne referencované pole.

Vzdialenostný histogram (3 body)

Nech d je nenulové kladné číslo (d>0) a C je bod na súradniciach [x,y]. Na základe vzdialenosti od bodu C môžeme korytnačky rozdeliť do „zón“. Povieme, že korytnačka sa nachádza v i-tej zóne okolo bodu C, keď jej vzdialenosť od bodu C je v intervale ⟨i⋅d, i⋅d+d). Do triedy KorytnaciSvet pridajte metódu histogram, ktorá vráti referenciu na pole, v ktorom na indexe i bude uložený počet korytnačiek nachádzajúcich sa v i-tej zóne okolo zadaného bodu C. Dĺžka vráteného poľa nech je najmenšia možná s tou vlastnosťou, že súčet prvkov poľa bude rovný počtu korytnačiek v ploche. Metóda histogram má 3 parametre: x, y - súradnice bodu C a šírku zón d.

public int[] histogram(double x, double y, double d)

Rada: Odporúčame si najprv vypočítať maximálnu vzdialenosť medzi bodom C a ľubovoľnou korytnačkou v ploche. Na základe tohto vypočítate, aké veľké pole potrebujete vrátiť.


Poznámky

Vzdialenostný histogram

Keďže ObjectInspector nezobrazuje metódy s parametrom alebo návratovou hodnotou typu referencia na pole, pri riešení úlohy si odporúčame vytvoriť pomocnú metódu:

public void testHistogram(double x, double y, double d) {
    int[] p = this.histogram(x, y, d);
    System.out.print("histogram(" + x + ", " + y + ", " + d + "): ");
    System.out.println(Arrays.toString(p));
}