04. Vektory v poli
Úloha 1
Vytvorte skeč, ktorý bude simulovať padajúcu kvapku vodu.
Malá modrá elipsa má polohu uloženú vo vektore kvapka
. Na začiatku je táto poloha niekde náhodne na hornom okraji obrazovky.
Vektor gravitacia
určuje smer pohybu, nastavte ho na súradnice (0, 3)
, aby kvapka padala nadol.
Animujte kvapku tak, aby sa pohybovala v tomto smere. Keď spadne pod spodný okraj obrazovky, vygeneruje sa kvapka
znovu náhodne na hornom okraji obrazovky.

Ako z kvapky urobiť dážď
Jedna kvapka ešte dážď nerobí. Ale ak už vieme rozanimovať padajúcu kvapku pomocou vektora jej polohy, tak vieme urobiť celé pole takýchto vektorov.
Namiesto jedného vektora kvapka:
PVector kvapka;
si zadefinujeme pole vektorov:
PVector[] kvapky;
Pri vytváraní poľa musíme vedieť, aké bude veľké. Vyrobme si premennú pocet
, ktorá bude určovať, koľko kvapiek máme v programe:
PVector[] kvapky;
PVector gravitacia;
int n = 25;
Ďalej, keď generujeme polohu kvapky v podprograme setup()
, tak si vytvoríme najprv celé pole a potom ho vo for
cykle naplníme, položku po položke, náhodnými polohami:
void setup()
{
size(400,400);
kvapky = new PVector[pocet];
for (int i = 0; i < pocet; i++)
{
kvapky[i] = new PVector(random(width),0);
}
gravitacia = new PVector(0,3);
}
A tiež aj pohyb a vykresľovanie v podprograme draw()
zaobalíme do for
cyklu a namiesto premennej kvapka
budeme pracovať s i-tou položkou poľa kvapky[i]
:
void draw()
{
background(0);
for (int i = 0; i < pocet; i++)
{
// Pohyb
kvapky[i] = PVector.add(kvapky[i], gravitacia);
if (kvapky[i].y > height)
{
kvapky[i] = new PVector(random(width), 0);
}
// Vykreslenie
fill(#00FFFF);
ellipse(kvapky[i].x, kvapky[i].y, 10, 20);
}
}

Úloha 2
Upravte skeč tak, aby na začiatku neboli všetky kvapky na hornom okraji obrazovky, ale aby poloha bola náhodná v rámci celej obrazovky.

Všetky operácie, ktoré sme predtým robili na jednom vektore kvapka
teraz robíme pomocou for
cyklu na jednotlivých vektoroch v poli cez kvapky[i]
.
Úloha 3
Pridajte do programu k vektoru gravitacia
aj vektor vietor
, ktorého x-ová súradnica bude náhodná z intervalu -1, 1
a ktorého y-ová súradnica bude 0
. Bude predstavovať vietor fúkajúci horizontálne.
Do výpočtu pohybu kvapky pridajte ku gravitácii aj vietor. Takto:
// Pohyb
kvapky[i] = PVector.add(kvapky[i], gravitacia).add(vietor);
Tento zápis sa dá čítať aj tak, že poloha = poloha + gravitácia + vietor.

Baktérie
Úloha 4
Vytvorte skeč, ktorý má pole vektorov bakterie
a na začiatku vygeneruje do poľa 20 náhodných pozícii pre baktérie. Tie sú potom v draw()
vykreslené ako bodky:

Úloha 5
Padajúce kvapky mali všetky rovnaký smer. Baktérie nebudú mať rovnaký smer, každá sa bude hýbať inak náhodne. Pred vykreslením každej baktérie vygenerujte smer ako vektor s náhodnými súradnicami v rozsahu -2,2 a pohnite baktériu o tento smer.

Úloha 6
Zmeňte výpočet smeru tak, aby sa každá baktéria približovala ku kurzoru myši.

Úloha 7 *
Upravte skeč tak, aby bol pohyb baktérie súčtom pohybu smerom k myši (Úloha 6) a náhodného pohybu (Úloha 5):

Od položky k položke
Doteraz sme každú jednu položku spracovávali samostatne. Vygenerovali sme ju samostatne. Vykreslili sme ju samostatne. Síce v cykle for
, spolu so všetkými ostatnými, ale jedna baktéria nevedela nič o iných baktériách, ani kvapka dažďa nevedela nič o ostatných kvapkách. V nasledujúcich úlohách si ukážeme, ako spájať jednotlivé položky v poli.
Úloha 8
Vygenerujte do poľa vektorov s názvom vrcholy
10 náhodných pozícii a na obrazovke vypíšte na i
-tu pozíciu číslo i
:

Úloha 9
V ďalšom kroku budeme spájať čiarou každú vrchol v poli s nasledujúcim vrcholom v poli.
Pozícia i-teho vrcholu je nám vo for
cykle známa, je to vrcholy[i]
. Čo je ale nasledujúci vrchol? No je to vrcholy[i+1]
. Čiaru teda medzi nimi nakreslíme takto:
void draw()
{
background(0);
for (int i=0; i < pocet; i++)
{
// Vykreslenie
text(i, vrcholy[i].x, vrcholy[i].y);
line(vrcholy[i].x, vrcholy[i].y, vrcholy[i+1].x, vrcholy[i+1].y);
}
}
Lenže takto napísaný program nám zhavaruje na známej chybe:
ArrayIndexOutOfBoundsException: Index 10 out of bounds for length 10
To preto, že pri poslednom vrchole, s indexom 9, chceme nakresliť čiaru do vrcholu s indexom 10, ale pole už žiadny vrchol s indexom 10 nemá. A to je chyba.
Úloha 10
Upravte program tak, aby čiaru vykresľoval len ak index i
nie je ešte na konci poľa. Takto upravený program už bude fungovať:

Last updated