02. Práca s poliami

Niekoľko praktických trikov a postupov pre polia

Jednoduché prechádzanie položiek v poli

Ak nepotrebujeme vedieť, na ktorej položke sme, ak nepotrebujeme žiadne i, tak môžeme for cyklus napísať aj takto:

size(400,400);
background(0);

String[] kapely = {"The Cure", "Depeche Mode", "Underworld", "Orbital"};

for (String k : kapely)
{
  text(k, random(width), random(height));
}

Tento program tiež na náhodné miesto na obrazovke vypíše každú položku z poľa kapely. To sme už robili.

Ale namiesto zápisu cez for i a potom kapely[i] sa na konkrétnu položku v poli dostaneme tak, že takto zapísaný for cyklus prechádza pole kapely a položku po položke nám každú uloží do premennej k a potom s tou položkou vykoná samotné telo cyklu. V tomto prípade výpis text(k, random(width), random(height)).

Prechádzanie poľom v draw()

Niekedy chceme prechádzať poľom nie celým naraz, ale postupne v animácii cez podprogram draw(). Napríklad chceme, aby sa v každom frame zobrazilo iné slovo zo zoznamu:

Vtedy namiesto for cyklu s indexom i využijeme skutočnosť, že draw() je vlastne tiež niečo ako cyklus. Tiež sa opakuje. A ako index použijeme počítadlo vykreslených snímkov, ktoré nám poskytuje Processing. Toto počítadlo sa volá frameCount:

String[] words = {"EAT", "PRAY", "LOVE", "CONSUME", "OBEY"};

void setup()
{
  size(400, 400);
  background(0);

  textSize(50);
  textAlign(CENTER, CENTER);
  
  frameRate(5);
}

void draw()
{
  background(0);
  text(words[frameCount], width/2, height/2);
}

Ale po pár snímkoch program zhavaruje, lebo frameCount vyrástol nad limit dĺžky poľa. Tomu pomôžeme fintou, že pomocou matematickej operácie % "zacyklíme" hodnoty v rozsahu 0 až dĺžka poľa:

void draw()
{
  background(0);
  text(words[frameCount % words.length], width/2, height/2);
}

Náhodný výber z poľa

Povedzme, že máme paletu farieb uloženú v poli a chceme pri kliknutí myšou nakresliť krúžok náhodnou farbou vybratou z tejto palety:

int[] paleta = {#FF00FF, #00FFFF, #FFFF00};

void setup()
{
  size(400,400);
  background(0);
}

void mousePressed()
{
  // Nastav farbu nahodnym vyberom z pola
  
  // Vykresli kruzok na poziciu mysi  
}

void draw()
{  
}

Aby sme vybrali farbu z poľa potrebujeme vedieť index položky. A tento index má byť náhodný.

Vieme vygenerovať náhodné celé číslo z rozsahu 0 (vrátane) až dĺžka poľa (bez)?

void mousePressed()
{
  // Nastav farbu nahodnym vyberom z pola
  int i = int(random(paleta.length));  
  fill(paleta[i]);                     
  
  // Vykresli kruzok na poziciu mysi
  circle(mouseX, mouseY, 50);
}

Prípadne v tomto prípade, keď už nepotrebujeme tento náhodný index na nič iné, iba na vybratie farby z poľa, tak môžeme napísať aj skrátene. Teda ak sa nebojíte zátvoriek:

void mousePressed()
{
  // Nastav farbu nahodnym vyberom z pola
  fill(paleta[int(random(paleta.length))]);                     
  
  // Vykresli kruzok na poziciu mysi
  circle(mouseX, mouseY, 50);
}

Zapisovanie do poľa

Pole nie je určené len na čítanie položiek, ale môžeme do neho aj zapisovať. To sa hodí vtedy, keď nevieme dopredu, čo bude v poli uložené. Kapely na festivale sme vedeli dopredu. Ale ak by sme chceli zobraziť náhodne vyžrebované čísla lotérie, tak tie dopredu nepoznáme. Ako na to?

Vytvoríme si prázdne pole s 5 položkami a uložíme do neho náhodne vygenerované čísla lotérie od 1 do 40. A potom ich už môžeme vypísať Takto:

size(400, 200);
background(0);
int d = 40; // Rozostupy medzi cislami na obrazovke
textSize(d/2);
textAlign(LEFT, CENTER);

// Vytvorime nove prazdne pole s velkostou 5
int[] loteria = new int[5]; 

// Tu generujeme nahodne cisla a ukladame ich do pola
for (int i = 0; i < loteria.length; i++)
{
  loteria[i] = int(random(1, 40));
}

// Tu vypisujeme cisla z pola
for (int i = 0; i < loteria.length; i++)
{
  text(loteria[i], i*d + d/2, height/2);
}

Last updated