Kaleidoskop (1. část)

Ostatní jazyky Petr Lite 2D grafika Kaleidoskop (1. část)

Kaleidoskop, neboli česky krasohled, je dětská hračka vytvářející za pomoci 3 zrcadel a několika barevných kamínků působivé náhodné obrazce. Jeho programové řešení je zajímavou programátorskou hříčkou. Zajímavou tím, že si již nevystačíme s pravoúhlým souřadným systémem.

Základem kaleidoskopu jsou 3 zrcadla tvořící rovnostranný trojúhelník. V tomto trojúhelníku se "vytváří scéna". Vše ostatní co vidíme jsou jen odrazy v zrcadlech. Na obrázku výše je výchozí trojúhelník označen písmenem D (tedy "dolní"). Vlevo od něj se nachází trojúhelník L ("levý"), ve kterém se odráží obraz trojúhelníku D zrcadlený podle společné osy, která má úhel 60 stupňů. Na opačné straně se nachází trojúhelník R ("pravý"), se zrcadlící osou -60 stupňů. Více vlevo a vpravo jsou další násobné odrazy, trojúhelníky LL ("levý levý"), RR atd.

Obraz kaleidoskopu budeme generovat kreslením základních grafických prvků jako je čára, trojúhelník, kruh atd. Jak je zřejmé z nákresu, všechny odrazy jsou symetrické podle vodorovné osy. Horní půlku kaleidoskopu proto nemusíme řešit, po vytvoření dolní půlky ji jednoduše zkopírujeme do horní půlky zrcadlově obráceně. Podobně vícenásobné odrazy LL a RR nemusíme kreslit, získáme je překlopením odrazů R a L. Trojúhelníky L a R bychom mohli získat otočením trojúhelníku D o 60 stupňů, ale tato operace je jednak pomalá (pokud zapneme vyšší kvalitu konverze) a jednak dochází k pozorovatelnému zkreslení hran. Proto budeme generovat trojúhelníky D, L i R.

Při kreslení obrazců bychom mohli postupovat tak, že grafické prvky budeme kreslit pouze uvnitř trojúhelníků, aby nedošlo k přesahu do sousedních trojúhelníků. Tím bychom ale dosáhli velmi chabého výsledku, protože zajímavé grafické efekty vznikají teprve až vzájemným překryvem obrazů prvků. Proto použijeme nový grafický příkaz - maskování. Díky této operaci můžeme nejdříve vykreslit grafické prvky volně do plochy, pak je sejmout a až dodatečně zamaskovat průhlednou barvou tak, že výsledkem bude ořezaný trojúhelník, který již snadno vykreslíme.

Jako obvykle začneme vytvořením programu. Pojmenujte ho Kaleidoskop. Vymažte prázdné políčko a rozměry hlavní plochy změňte na 14 (šířka) x 10 (výška).

K maskování sejmutých obrazců budeme potřebovat masku, což je obrázek, jehož průhledná barva zajistí zprůhlednění bodu obrazu, ostatní barvy ponechají bod obrazu beze změny. Připravíme si obrázek masky. Bude to rovnostranný trojúhelník. Jeho výška bude polovina výšky plochy, tedy 5 kroků. Potřebujeme vypočítat šířku jedné strany trojúhelníku. Jak si můžeme snadno odvodit z pythagorovy věty, šířka jedné strany rovnostranného trojúhelníku = výška * 2 / sqrt(3) (sqrt je druhá odmocnina). Výška trojúhelníku, vyjádřená v grafických bodech, je 160 bodů. Tomu odpovídá šířka 184.7521 bodů. Pro usnadnění kreslení zaokrouhlíme šířku na sudé číslo (potřebujeme kreslit grafiku s přírustkem 1/2 šířky), takže délka jedné strany trojúhelníku je 184 bodů, což je 5.75 kroku.

Připravíme si proto obrázek s rozměry 5.75 (šířka) x 5 (výška) kroků, tj. 184 x 160 bodů. Nazvěte ho maska. Z levého dolního rohu veďte bílou čáru (nástrojem čára) k hornímu okraji uprostřed. Kreslení musíte provést přesně, proto si obrázek zvětšete na maximum a k navigaci používejte souřadnice X a Y zobrazované dole vlevo na stavové liště programu Petr. Souřadnice X středu horní hrany bude 2.88 kroků nebo 92 bodů v závislosti na tom, jak jste nastavili přepínač kroky/body v okně nastavení rozměrů obrázku. Po nakreslení levé a pravé hrany trojúhelníku vnitřek trojúhelníku vylijte bílou barvou nástrojem výplň.

Masku uložte do skupiny obrázky (ve Společných proměnných). Spolu s ní si připravte několik prázdných obrázků, které budete potřebovat později - maska vlevo a vpravo, obrázek dole, obrázek vlevo a obrázek vpravo. Obrázky budou generovány programově, proto zůstanou teď prázdné. Abychom minimalizovali výslednou velikost programu, nastavte jejich velikost na rozměr 1 x 1.

Dále budeme potřebovat nějaké pracovní číselné proměnné. Šířka plochy/2 je uschovaná polovina šířky plochy programu, výška plochy/2 je polovina výšky plochy, délka strany trojúhelníku je uschovaná délka strany trojúhelníku masky, délka strany trojúhelníku/2 je polovina délky strany.

Kromě toho budeme potřebovat seznam prvků, které budou během animace vykreslovány. Prvků použijeme 30. Seznam bude mít položky: souřadnice prvku X a Y jsou souřadnice středu prvku v kreslicím okně. Otočení prvku je rotace prvku kolem jeho středu. Rychlost posunu X a Y je rychlost posunu souřadnic středu prvku. Rychlost otáčení je rychlost změny rotace prvku kolem středu.

Přejdeme k inicializaci programu. Na začátku inicializace vypněte Petříka. Dále nastavíme pomocné proměnné. Šířka plochy/2 bude polovina šířky hlavní plochy (pokud se u prvku šířka plochy neuvede plocha, použije se implicitně hlavní plocha programu). Výška plochy/2 bude polovina výšky hlavní plochy. Délka strany trojúhelníku bude odpovídat šířce obrázku masky. Délka strany tojúhelníku/2 je polovina délky strany trojúhelníku. Masku vlevo a vpravo získáme vertikálním převrácením obrázku masky.

Připravíme výchozí parametry grafických prvků. Provedeme to pomocí cyklu, který projde všechny prvky. Souřadnice X a Y budou v rozsahu od 0 po maximální rozměry kreslicí plochy trojúhelníku, což je šířka trojúhelníku a výška trojúhelníku (odpovídá polovině výšky plochy). Otočení prvku bude zcela náhodný úhel v rozsahu 0 až 360°. Rychlost posunu X a Y a rychlost otáčení budou náhodné v rozmezi -0.01 až +0.01.

Přejdeme k hlavní smyčce programu. Základem bude, jako vždy, prvek podmíněné opakování příkazů. Do podmínky smyčky použijeme test znaku z klávesnice bez čekání. Program se přeruší, pokud uživatel stiskne nějakou znakovou klávesu (včetně některých řídicích kláves jako je např. Esc). Rozdíl mezi vstupem kláves, který jsme používali v předešlých kapitolách, a vstupem znaků je ten, že vstup kláves navrací číselné kódy kláves odpovídající jejich pořadovému číslu na klávesnici. Zatímco vstup znaků vrací jednoznakový text vygenerovaný ovladačem klávesnice podle aktuálně zvoleného rozložení znaků na klávesnici. To znamená, že jsou zohledněny národnostní kódy, například to mohou být znaky s diakritikou. Není-li stisknuta znaková klávesa, navrací se prázdný text. Znakové kódy generují i některé řídicí klávesy jako je Enter, Esc, Tab a Back Space.

Časování tentokrát použijeme s časem 0.025 sekundy, čímž zajistíme plynulejší animaci než při časování 0.05 sekundy. Dále si ve smyčce zatím předpřipravíme skupiny generování grafiky (kde budeme vykreslovat grafické prvky a snímat je do obrázků), vykreslení kaleidoskopu (vykreslíme sejmuté obrázky na obrazovku) a posun prvků (zajistíme animaci grafických prvků).

Začneme se zabývat vykreslováním jednotlivých grafických prvků. Připravte si ve Společných proměnných skupinu vykreslování prvků. Bude obsahovat následující pracovní proměnné. Požadovaný úhel pohledu určí úhel trojúhelníku, který budeme generovat (0°, +60° a -60°, samozřejmě v radiánech). Souřadnice prvku k vykreslení X a Y jsou souřadnice středu prvku přepočtené na souřadnice okna. Proměnné sin a cos otočení prvku jsou funkce sin a cos vypočtené z aktuálního úhlu otočení prvku.

Funkce vykreslení prvků pro jeden pohled bude postupně volat vykreslování všech grafických prvků v aktuálním pohledu. Vykreslovat se bude kruh, kružnice, trojúhelník a čára. Každá vykreslovací funkce na svém začátku nejdříve zavolá funkci příprava parametrů pro jeden prvek, která předpřipraví parametry pro kreslení.

Začneme funkcí pro vykreslení kruhu. Má vstupní parametry barva kruhu a poloměr kruhu. Na začátku zavolá funkci příprava parametrů pro jeden prvek, která vypočte potřebné parametry, tj. souřadnice středu kruhu X a Y.

Podobná je funkce vykreslení kružnice, jen má navíc jeden parametr, tloušťka kružnice.

Funkce vykreslení trojúhelníku používá o něco více vstupních parametrů. Jednak je to barva trojúhelníku a jednak poloměry bodů 1, 2 a 3, což jsou vzdálenosti vrcholů trojúhelníku od středu otáčení. Vrcholy 1 a 2 leží na opačných koncích od středu otáčení, proto se v jednom případě vypočte jejich souřadnice přičtením funkcí cos a sin, v druhém případě odečtením. Vrchol 3 leží na kolmici ke spojnici vrcholů 1 a 2, proto se jeho souřadnice vypočte přičtením sin a odečtením cos.

Funkce vykreslení čáry má za vstupní parametry barvu čáry, tloušťku čáry (v bodech) a vzdálenosti bodů 1 a 2, které udávají vzdálenost bodů od středu otáčení.

.... dokončení příště


 

Stáhnout

Staženo 230x (134.16 kB)
Aplikace je včetně zdrojových kódů v jazyce Petr Lite (jsou obsaženy v EXE souboru, který lze v programu přímo otevřít)

 

  Aktivity (1)

Článek pro vás napsal Panda38
Avatar
Programátor C++, WinAPI, ASM.

Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!


 


Miniatura
Předchozí článek
Zátiší u potoka
Miniatura
Všechny články v sekci
2D grafika
Miniatura
Následující článek
Kaleidoskop (2. část)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!