# 03 - Podmienka, cyklus

V tejto kapitole si zopakujeme premenné, vyskúšame eventy a cyklus.&#x20;

Začneme s jednoduchým kreslením. A na konci kapitoly si budeš vedieť vytvoriť vlastný kresliaci kaleidoskop s toľkými zkladlami, kolko sa do skutočného ani nezmestí. A výsledný obrazok si budeš môcť uložiť.&#x20;

Táto lekcia je členená do kapitol / receptov.

## 0. príprava

Vytvor prázny sketch -> [editor.p5js.org](https://editor.p5js.org)

Nastave velkosť plátna (canvas) na celú dostupnú šírku/výšku.&#x20;

{% hint style="info" %}
Pomôžu ti zabudované properties **`windowWidth`** a **`windowHeight`**
{% endhint %}

Nastav pozadie na čisto biele alebo čierne. Podľa preferencie.&#x20;

## 1. kreslenie

Vytvor jednoduché kreslenie pomocou zobrazenia kruhu (**`ellipse`**) na pozíci myši.![](https://3183137632-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FruzCl9CO3cPM3ZRrt5RV%2Fuploads%2FTfWJOLinbZIYCayg08G0%2FSni%CC%81mka%20obrazovky%202023-10-01%20o%2021.54.03.png?alt=media\&token=af6dc434-18fd-4b6c-aa0a-4b66451ee0be)

{% hint style="info" %}
Pozri zabudované properties **`mouseX`** a **`mouseY`**
{% endhint %}

### 1.1 spojitá čiara

Miesto **`ellipse`** použi **`line`**. Pre spojenie predchádzajúcej pozície myši a aktuálnej.

{% hint style="info" %}
Pozri zabudované properties **`pmouseX`** a **`pmouseY`**
{% endhint %}

{% hint style="danger" %}
Pozor na **`stroke`** color.&#x20;
{% endhint %}

![](https://3183137632-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FruzCl9CO3cPM3ZRrt5RV%2Fuploads%2FPn2NmmiuS9DPe1CZ6n2b%2FSni%CC%81mka%20obrazovky%202023-10-01%20o%2022.25.15.png?alt=media\&token=2526a588-4406-4cdd-b55e-0f4a4baf0a74)

### 1.2 začiatok a koniec

Kresli len keď je stlačená myš:

{% hint style="info" %}
**`mouseIsPressed`**
{% endhint %}

Bonus: Pri stlačení pravého tlačidla na myši zresetuj/zmaž plochu.\
Ak chceš zakázať kontextové menu, použi:

![](https://3183137632-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FruzCl9CO3cPM3ZRrt5RV%2Fuploads%2FW0UEzCCgXY5OTgC7JcrC%2FSni%CC%81mka%20obrazovky%202023-10-02%20o%209.37.45.png?alt=media\&token=4c05a061-fed2-4909-8349-5da812c9b838)

```html
<body oncontextmenu="return false;">
```

### 2. farba

### 2.1 náhodná farba

Použi **`random`** pre generovanie farby čiary.

<div align="left"><figure><img src="https://3183137632-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FruzCl9CO3cPM3ZRrt5RV%2Fuploads%2F6fjGBJBX5LCuBblhrTUN%2FSni%CC%81mka%20obrazovky%202023-10-02%20o%200.42.20.png?alt=media&#x26;token=cbb2ef69-15b8-4509-a453-13d0c401c75a" alt="" width="375"><figcaption></figcaption></figure></div>

{% hint style="info" %}
Nastav hrubšiu šírku hrany **`strokeWeight()`**
{% endhint %}

### 2.2 HSB

Ak nechceme úplne divoko náhodné farby. Pomôže nám model HSB.&#x20;

Zafixuj saturation a brightness na rovnakých hodntách a generuj len náhodné Hue.

{% hint style="info" %}
Budeš potrebovať metódu **`colorMode()`**\
Aký rozsah hodnôt môžeme zadať pre Hue? (Hint .... má tvar kruhu)\
Viac info na -> <https://archive.p5js.org/learn/color.html>
{% endhint %}

<figure><img src="https://3183137632-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FruzCl9CO3cPM3ZRrt5RV%2Fuploads%2FlEUFy6moHZbE754W6Rrz%2Fhsb.png?alt=media&#x26;token=a33f1094-53d7-446f-9e20-0d84aecb9423" alt=""><figcaption><p>HSB model. Zdroj: <a href="https://archive.p5js.org/learn/color.html">https://archive.p5js.org/learn/color.html</a></p></figcaption></figure>

{% hint style="warning" %}
Hue— 0 to 360 by default. \
Saturation—0 to 100 by default. \
Brightness—0 to 100 by default.
{% endhint %}

### 2.3 plynulá zmena farby

Pre postupnú zmenu farby máme niekoľko možností.&#x20;

* lineárny prírastok (hue = (hue + hueShift) % 360
* použiť funkciu [perlin noise](https://p5js.org/reference/p5/noise/) (a [viac info a príklad](https://genekogan.com/code/p5js-perlin-noise/))

{% hint style="info" %}
Ken Perlin developed the noise function while working on the original Tron movie in the early 1980s; he used it to create procedural textures for computer-generated effects. In 1997, Perlin won an Academy Award in technical achievement for this work.\
Source: <https://www.khanacademy.org/computing/computer-programming/programming-natural-simulations/programming-noise/a/perlin-noise>
{% endhint %}

O farbách v p5.js sa dočítaš aj na <https://celiawrite.medium.com/learn-apply-p5-js-b927e254cf11>

**Bonus:** pri kliknutí myšou začni s náhodnou (alebo s komplementárnou farbou k tej, ktorá bola naposledy použitá)

![](https://3183137632-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FruzCl9CO3cPM3ZRrt5RV%2Fuploads%2FZ3bAHQG5KfG4Rm7S1Qrg%2FSni%CC%81mka%20obrazovky%202023-10-02%20o%201.18.20.png?alt=media\&token=89d20355-baeb-4cd5-a296-9591fe081e5d)

### 3. Uloženie obrazku "S"

Načo by bol Paintbrush, keby sme nevedeli výsledný obrázok uložiť?

Pre stlačenie kávesy "s" ulož práve nakreslený obrázok.

{% hint style="info" %}
Budeš potrebovať metódu **`keyPressed()`** a **`save()`**
{% endhint %}

### 4. zrkadlenie

Máme celkom pekné kreslenie myšou... ale posuňme to kúsok ďalej. Kresli čiaru hneď 2x - pridaj zrkadlový odraz.

<figure><img src="https://3183137632-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FruzCl9CO3cPM3ZRrt5RV%2Fuploads%2FnHj6Mw34fzPTpUvvBQ51%2FScreenshot%202024-09-30%20at%2002.18.42.png?alt=media&#x26;token=218baffa-e16e-475a-a996-32f5665222b5" alt=""><figcaption></figcaption></figure>

```javascript
function setup() {
  createCanvas(400, 400);
  background(220);
}

function draw() {
  strokeWeight(2);
  stroke(0);
  
  // Draw the normal line
  line(pmouseX, pmouseY, mouseX, mouseY);
  // Mirror it across the vertical center
  line(width-pmouseX, pmouseY, width-mouseX, mouseY);
}
```

{% hint style="info" %}

#### **Čo sa práve stalo?**

Odčítaním `mouseX` od `width` otočíš pozíciu horizontálne – predstav si, že prevrátiš polohu myši oproti pravej strane plátna namiesto ľavej. Rovnaký trik funguje aj pre vertikálne zrkadlenie, ale použiješ `height - mouseY`.
{% endhint %}

### 5. kaleidoskop (for cyklus)

Teraz, keď si zvládol zrkadlenie, poďme na vyšší level s **kaleidoskopickým efektom**. Využijeme silu **rotácie**, aby sme opakovane kreslili tvoje čiary v rôznych uhloch – presne ako kaleidoskop. 🌈✨

{% hint style="info" %}
Metódy: **`translate()`** a **`rotate()`**
{% endhint %}

Nakreslíme čiaru, otočíme plátno o kúsok, a znova kreslíme... a znova... a znova…

<figure><img src="https://3183137632-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FruzCl9CO3cPM3ZRrt5RV%2Fuploads%2Fz7n5PZinJhfw7uJFFJBr%2FScreenshot%202024-09-30%20at%2002.05.05.png?alt=media&#x26;token=7206a863-e195-47be-bbf4-1aac3667aced" alt=""><figcaption></figcaption></figure>

```javascript
function setup() {
  createCanvas(400, 400);
  background(220);
  angleMode(DEGREES); // Používame stupne pre jednoduchšiu rotáciu
}

function draw() {
  translate(width / 2, height / 2); // Presunieme pôvod do stredu plátna
  
  strokeWeight(2);
  stroke(0);
  
  let rotations = 8; // 8 segmentov na zaciatok
  for (let i = 0; i < rotations; i++) {
    // Otočíme o 360 / rotations stupňov
    rotate(360 / rotations);
    
    // nakreslime povodnu ciaru (pozor - platno je uz centrovane, preto musime poziciu ciary posunut)
    line(pmouseX - width / 2, pmouseY - height / 2, mouseX - width / 2, mouseY - height / 2);
  }
}

```

{% hint style="info" %}
**Prečo používame `translate()`?**

Bez `translate()` by sa všetky rotácie diali od ľavého horného rohu plátna! Skončili by sme s niečím veľmi zvláštnym (alebo možno cool, ale určite nie kaleidoskop). Presunom pôvodu (origin) do stredu to vyzerá správne.

**Prečo `pmouseX - width / 2`?**

Keďže sme presunuli pôvod do stredu, musíme upraviť `mouseX` a `pmouseX`, aby to sedelo na nový referenčný bod. Odpočítanie `width / 2` posúva všetko do správnej pozície.
{% endhint %}

### **6.**&#x4B;ombinácia zrkadlenia a kaleidoskopu

Poďme **skombinovať** čary! Je čas kresliť zrkadlené čiary vo všetkých smeroch. 💫

```javascript
function setup() {
  createCanvas(400, 400);
  background(220);
  angleMode(DEGREES); // Používame stupne pre jednoduchšiu rotáciu
}

function draw() {
  translate(width / 2, height / 2); // Presunieme pôvod do stredu plátna
  
  strokeWeight(2);
  stroke(0);
  
  let rotations = 8; // 8 segmentov na zaciatok
  for (let i = 0; i < rotations; i++) {
    // Otočíme o 360 / rotations stupňov
    rotate(360 / rotations);
    
    // nakreslime povodnu ciaru (pozor - platno je uz centrovane, preto musime poziciu ciary posunut)
    line(pmouseX - width / 2, pmouseY - height / 2, mouseX - width / 2, mouseY - height / 2);
    // a zrkadlime ju:
    line(width / 2 - pmouseX, pmouseY - height / 2, width / 2- mouseX , mouseY - height / 2);
  }
}

```

{% hint style="info" %}
**Môžem zmeniť počet rotácií?**

Samozrejme! Stačí zmeniť premennú `rotations`. Chceš menej? Skús 4. Chceš viac? Poď divoko s 12 alebo dokonca 42!
{% endhint %}

**bonusy:**

* zmena veľkosti **strokeWeight** podľa pozície myši
* Experimentuj s farbami (Použi Perlinov šum na zmenu farby hladko počas kreslenia)
* **Dynamické rotácie**: Skús meniť počet rotácií podľa polohy myši alebo rýchlosti.
* **Animuj kaleidoskop**: Namiesto rotovania o pevnú hodnotu, nech sa uhol rotácie mení časom pre neustále sa meniaci vzor.
* použiť tvary

<figure><img src="https://3183137632-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FruzCl9CO3cPM3ZRrt5RV%2Fuploads%2FwKvH1vpxjosr1ZC28yeU%2FScreenshot%202024-09-30%20at%2002.05.37.png?alt=media&#x26;token=44e20b7c-6a82-4c20-a41e-4be40ebd47a0" alt=""><figcaption></figcaption></figure>

Ďaľšie tipy a info:
