Zadanie 5

Najneskorší termín odovzdania: 27.10.2024 (nedeľa) o 18:00
Odovzdávané súbory: KorytnaciSvet.java

V moodle je rozdelené odovzdávanie úloh na dve časti. Úlohy z prvej časti budú hodnotené klasicky. Za riešenia úloh z druhej časti budú udelené body, ale bez komentáru.

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

Tento kód je spoločný pre obidve časti. Ideálne je, ak v odovzdanom kóde sa nebudú nachádzať riešenia z tej druhej časti. Teda odovzdávajte iba tento vzorový kód + riešenia daných úloh.

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import java.awt.event.MouseEvent;

import sk.upjs.jpaz2.*;

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

        private Turtle[] korytnacky = null;

        /**
         * Inicializacna metoda (konstruktor)
         */

        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);
                }
        }
}

Dôležité: Existujúce metódy a konštruktor nemodifikujte. Rovnako nepridávajte vlastné inštančné premenné.

1. ČASŤ

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


1
public void vystrelNaTazisko()

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.


1
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ámka: 

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:


1
2
3
4
5
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));
}

Do štvorca (3 body)

Do triedy KorytnaciSvet pridajte metódu doStvorca, ktorá pravidelne umiestni korytnačky v kresliacej ploche na strany štvorca so stredom v strede kresliacej plochy a so zadanou dĺžkou strany. Môžete predpokladať, že počet korytnačiek v ploche je deliteľný číslom 4. Do rohov štvorca korytnačky neumiestňujeme.


1
public void doStvorca(double dlzkaStrany)

2. ČASŤ

Bombastické korytnačky (2 body)

Keďže korytnačky v JPAZe sú nezničiteľné, ministerstvo obrany za rozhodlo využiť korytnačky v kresliacej ploche na testovanie účinkov explózií. Do kresliacej plochy umiestnili nálož so zadanou silou (parameter sila) na pozíciu [x, y]. Pri explózii nálože vznikne tlaková vlna, ktorá odhodí korytnačky v smere od miesta explózie. Ak uvážime zjednodušený fyzikálny model, korytnačka vzdialená d od miesta explózie so silou S je odhodená o vzdialenosť S2/d4. Budeme predpokladať, že žiadna korytnačka sa nenachádza v mieste explózie. Do triedy KorytnaciSvet pridajte metódu explozia, ktorá odsimuluje účinky explózie nálože so zadanou silou a umiestnenej na zadanej pozícii. T.j. všetky korytnačky v ploche sa presunú (bez kreslenia trajektórie pohybu) na miesto, kam ich odhodí tlaková vlna, a budú nasmerované v smere od miesta explózie. Metóda vráti najväčšiu vzdialenosť, o akú bola odhodená nejaká z korytnačiek v ploche.


1
public double explozia(double x, double y, double sila)

Najrýchlejšia korytnačka (2 body)

Korytnačka sa dokáže otáčať rýchlosťou 1° za sekundu. Rýchlosť pohybu korytnačky je jednotková vzdialenosť („1 pixel“) za sekundu. Korytnačka sa nedokáže v jednom okamihu súčasne posúvať aj otáčať. Zároveň, aby stále videla na cestu, korytnačka sa pohybuje len smerom vpred (t.j. necúva). Nech C je bod na súradniciach [x,y]. Za aký najkratší čas v sekundách sa do bodu C môže dostať prvá korytnačka? Nezabudnite, že korytnačka sa môže otáčať v smere aj proti smeru hodinových ručičiek.

Do triedy KorytnaciSvet pridajte metódu casDoPrichodu. Metóda casDoPrichodu má 2 parametre x, y – súradnice bodu C, a vráti najmenší čas v sekundách, za aký sa niektorá z korytnačiek vie dostať do bodu C.


1
public double casDoPrichodu(double x, double y)

Rada (matematika ZŠ): Vonkajší uhol k uhlu α má veľkosť 360°-α.

Rada: Ak chcete používať metódu s ktorou ste doposiaľ nepracovali prečítajte si k nej dokumentáciu.

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.


1
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.