Autorské riešenie
[stiahni]

Táto úloha môže mať viac zaujímavých riešení. Je potrebné dodržať iba to, že súťažná fotografia novoročného ohňostroja má byť zložená z aspoň troch rôznych svetelných efektov. Pričom každý svetelný efekt je vyskladaný z určitého útvaru, ktorý sa v rámci efektu niekoľkokrát zopakuje (napríklad aj v rôznej veľkosti, či farbe).

Prvý svetelný efekt môže vzniknúť napríklad tak, že necháme opakovane vykresliť hviezdičky. Kreslenie hviezdičky s ľubovoľným počtom cípov je trochu náročnejšie ako kreslenie mnohouholníka s ľubovoľným počtom strán, preto v našom riešení budeme uvažovať len 5-cípu hviezdičku s rôznou dĺžkou ramena. Pri programovaní tejto 5-cípej hviezdičky je dobré nakresliť si takýto obrázok:

hviezda

Korytnačka sa pri kreslení 5-cípej hviezdy otočí celkovo dvakrát 360 stupňov. Môžete si to predstaviť tak, že sa postavíte na zemi smerom k oknu a skúsite si chôdzou nakresliť 5-cípu hviezdu. Zistíte, že takisto sa otočíte dvakrát smerom k oknu, to znamená dvakrát po 360 stupňov. Keďže sme pri kreslení strán hviezdy celkovo menili smer 5-krát, tak každé otočenie bude mať uhol 2*360/5 stupňov, ako to môžete vidieť aj na predchádzajúcom obrázku. Procedúra pre nakreslenie 5-cípej vyplnenej hviezdy by teda mohla vyzerať nasledovne. Všimnite si, že príkaz polygón postupne vyfarbí len tie časti hviezdy, ktoré sa pri vykresľovaní uzatvoria (stred teda ostane nevyfarbený, čo však vytvorí krajší efekt). Ak by sme chceli vyfarbiť aj stred hviezdy, môžeme ešte použiť príkaz výplň.

viem hviezda :dlzkaStrany
   urobTu "uhol 2*360/5
   polygon [
     opakuj 5 [
       do :dlzkaStrany
       vp :uhol
     ]
       ]
koniec

Aby sme dostali prvý svetelný efekt, môžeme vykresľovanie tejto hviezdy zopakovať náhodný počet krát, pričom pri každom opakovaní sa nakreslí hviezda s rôznou dĺžkou strany a takisto nová hviezda bude posunutá od tej predchádzajúcej o uhol náhodnej veľkosti, čo vieme naprogramovať nasledujúcimi príkazmi:

   urobTu "pocet1 6 + (nahodne 9)
   opakuj :pocet1 [
     ph
     do 100
     pd
     hviezda 20 + (nahodne 30)
     ph
     vz 100
     vp 30 + (nahodne 30)
     ]

Dostaneme napríklad takýto efekt s hviezdami a náhodným otočením o uhol:

hviezdy

V druhom svetelnom efekte použijeme útvar, ktorý bude mať podobu lúča rôznej dĺžky, ktorý sa na konci rozdeľuje na dve časti. Procedúra na nakreslenie jedného takéhoto lúča môže mať takýto tvar:

viem luc :dlzka
   do :dlzka
   vl 45
   do :dlzka/5
   vz :dlzka/5
   vp 90
   do :dlzka/5
   vz :dlzka/5
   vl 45
   vz :dlzka
koniec

Náhodný počet lúčov a ich rovnomerné rozmiestnenie po kružnici (otočenie o uhol 360/:pocet2) vieme naprogramovať podobne ako v prípade hviezd:

   urobTu "pocet2 6 + (nahodne 9)
   opakuj :pocet2 [
     ph
     do 30
     pd
     luc 70 + (nahodne 30)
     ph
     vz 30
     vp 360/:pocet2
     ]

Dostaneme napríklad takýto efekt s lúčmi náhodnej dĺžky:

luce

Pri treťom svetelnom efekte môžeme napríklad využiť to, že korytnačka pozná príkaz bod a jeho opakovaným vykresľovaním dosiahnuť zaujímavý efekt.

   opakuj :pocet3 [
     ph
     do 50
     opakuj 5 [nechFP ? pd bod 6 ph do 20]
     vz 150
     vp 360/:pocet3
     ]

Dostaneme napríklad takýto efekt s bodkami a náhodnou farbou:

bodky

Ak máme pripravené všetky tri efekty, mali by sme ešte nakoniec zabezpečiť to, aby sa nám svetelné efekty nedostali mimo obrazovku a aby sa navzájom prekrývali. Vieme, že korytnačia plocha (čierny obdĺžnik) má veľkosť 800x500 korytnačích krokov. Každý náš svetelný efekt zaberá plochu najviac 300x300 korytnačích krokov. Preto stred každého efektu sa musí nachádzať niekde v červenom obdĺžniku (a teda po každej strane máme ešte 150 korytnačích krokov od stredu na vykreslenie efektu).

rozmery

Začiatočnú pozíciu efektov budeme na základe tohto obrázka voliť náhodne pomocou týchto príkazov.

urobTu "poziciax -250 + (nahodne 500)
urobTu "poziciay -100 + (nahodne 200)
nechXYsur :poziciax :poziciay

Už nám ostáva overiť len prekrývanie. Zelené štvorce z nasledujúceho obrázka predstavujú jednotlivé efekty veľkosti 300x300. Vidíme, že ak budeme zelenými štvorcami pohybovať ľubovoľne po ploche, prekrývanie bude stále zabezpečené. Ak by sme mali efekty menšej veľkosti, stačí zobrať červený obdĺžnik s menšími rozmermi.

rozmery2

Hlavná procedúra pre nakreslenie celého ohňostroja potom môže vyzerať nasledovne:

viem kresliOhnostroj

   znova
   ; vyplnenie cierneho pozadia
   nechFP "cierna
   vypln
   ; nahodne urcenie poctu opakujucich sa casti v jednotlivych efektoch
   urobTu "pocet1 6 + (nahodne 9)
   urobTu "pocet2 6 + (nahodne 9)
   urobTu "pocet3 6 + (nahodne 9)

   ; prvy efekt s hviezdami a nahodne otocenie o uhol
   urobTu "poziciax -250 + (nahodne 500)
   urobTu "poziciay -100 + (nahodne 200)
   nechXYsur :poziciax :poziciay
   nechHP 1
   nechFP "zlta
   opakuj :pocet1 [
      ph do 100 pd
      hviezda 20 + (nahodne 30)
      ph vz 100 vp 30 + (nahodne 30)
   ]

   ; druhy efekt s lucmi nahodnej dlzky
   urobTu "poziciax -250 + (nahodne 500)
   urobTu "poziciay -100 + (nahodne 200)
   nechXYsur :poziciax :poziciay
   nechHP 3
   nechFP "zelena
   opakuj :pocet2 [
      ph do 30 pd
      luc 70 + (nahodne 30)
      ph vz 30 vp 360/:pocet2
   ]

   ; treti efekt s bodkami a nahodnou farbou
   urobTu "poziciax -250 + (nahodne 500)
   urobTu "poziciay -100 + (nahodne 200)
   nechXYsur :poziciax :poziciay
   nechHP 1
   opakuj :pocet3 [
      ph do 50
      opakuj 5 [nechFP ? pd bod 6 ph do 20]
      vz 150 vp 360/:pocet3
   ]

   skry

koniec

Ako výsledok dostaneme napríklad takéto vykreslenie:

den

Vaše zaujímavé riešenia:

Úlohu ste väčšinou riešili úspešne, každé riešenie bolo svojim spôsobom originálne a jedinečné. Vzniklo veľa zaujímavých efektov, využili ste polkružnice, hviezdičky, slnká, sústredné kružnice, vlny. Takisto ste niektorí pracovali s viacerými korytnačkami, využili ste tlačidlá, generovanie náhodných pozadí.

Vzniklo viacero veľmi pekných efektov, ktoré nájdete v galérii prác, napríklad:

opakuj 8 [nechfp "fialová bod 20 vl 90 opakuj 5 [ph do 10 pd do 30 vp 45]]

alebo:

viem vybuch
   vp 45
   opakuj 24 [
     opakuj 90 [do 1 vp 1]
     ph
     opakuj 90 [vz 1 vl 1]
     vl 15 pd
    ]
koniec

alebo s využitím zoznamov:

viem svetlica
   nechHP 5
   opakuj ?prvok [50 60 70 80] [do 3 vp 1]
   nechHP 1
   opakuj 40 [do 30 vz 30 vp 9 ]
koniec

Najčastejšie chyby:

  • svetelné efekty síce boli vykreslené, ale neprekrývali sa.