Autorské riešenie
V úlohe ste mali naprogramovať procedúru zosvetli_fotku, ktorá zosvetlí fotografiu stratenej korytnačky. Tu je potrebné si uvedomiť, že nie každá farba fotografie sa dá zosvetliť. Napr. najsvetlejšiu farbu už niet ako zosvetliť. Vo vzorovom riešení procedúra zosvetli_fotku na začiatku zavolá procedúru da_sa_zosvetlit, ktorá otestuje, či sa dá fotka zosvetliť. Fotka sa dá zosvetliť, ak sa dá zosvetliť každá z jej farieb. V počítačovej grafike farby vznikajú zmiešaním červenej, zelenej a modrej farby, preto sa dá každá farba zakódovať trojprvkovým RGB (red-green-blue) zoznamom čísel. Napríklad biela farba má kód [255 255 255], a čierna [0 0 0]. Niektoré farby v Imagine logu majú svoje pomenovanie, napr. sivá. My však potrebujeme túto farbu upraviť na základe jej číselného vyjadrenia. Z pomenovania farby získame jej číselné vyjadrenie príkazom prevedNaRGB. Na testovanie, či fotka neobsahuje príliš svetlý bod, ktorý by po zosvetlení o 10% mal kód farby väčší ako 255 vytvoríme procedúru da_sa_zosvetlit, ktorá postupne prejde celou fotkou rozmeru 100 x 100 bodov, a otestuje každý bod fotografie. Čierno-biele farby, teda odtiene sivej, majú všetky tri číselné kódy trojprvkového zoznamu rovnaké. Preto stačí otestovať len prvé číslo v zozname číselného kódu bodu. Postupne testujeme všetky body obrázka. Ak počas testovania nájdeme bod, ktorý sa nedá zosvetliť, fotografia sa nedá zosvetliť. Výsledok procedúry je "nie a testovanie ukončíme. Ak sme počas testu nenašli žiaden bod, ktorý by sa nedal zosvetliť, výsledok procedúry je "ano. viem da_sa_zosvetlit Pred testom korytnačku umiestnime na východzí bod, ktorý je nastavený ako domovský stav, v našom prípade v ľavom dolnom rohu aktuálnej fotky. Ak sa testovaním zistí, že každý bod fotky sa dá zosvetliť, procedúra zosvetli_fotku zabezpečí zosvetľovanie. Postupne prechádzame ešte raz po celelj fotke, 100-krát opakujeme po stľpcoch a po riadkoch zosvetlenie každého bodu o 10%. Novú farbu získame vynásobením aktuálnej farby (trojprvkového zoznamu) bodu číslom 1,1: urob "novaFarba 1.1 * PrevedNaRGB FarbaBodu. Nastavíme farbu pera na novú farbu, nakreslíme zosvetlený bod s priemerom 1 a postupujeme na nasledujúci bod. Ak výsledkom procedúry da_sa_zosvetlit je "nie", môžeme vypísať oznámenie, že fotka sa nedá zosvetliť.
;Imagine
logo
viem zosvetli_fotku ak2 da_sa_zosvetlit [ domov opakuj 100 [ opakuj 100 [ urob "novaFarba 1.1 * PrevedNaRGB FarbaBodu nechFp :novaFarba bod 1 do 1 ] vz 100 vp 90 do 1 vl 90 ] ][ pis "|Neda sa zosvetlit| ] koniec Ešte je zaujímavý krajný prípad, keď na fotke je čierny bod s kódom [0 0 0]. Tento bod uvedeným spôsobom nedokážeme zosvetliť. Farba [0 0 0] pri násobení 1.1 bude stále [0 0 0], teda čierna. Vaše zaujímavé riešenia a najčastejšie chyby Mnohí ste uvažovali tak, že pri zosvetľovaní fotografie ste testovali len ten bod, ktorý zosvetľujete. Ak sa dal zosvetliť, tak ste ho zosvetlili, a ak sa nedal, nechali ste mu pôvodnú farbu. Vtedy na zosvetlenie fotografie stačil len jeden prechod. Problémom je, že rôzne farby obrázka sa pri tomto postupe nahradia rovnakou farbou, takže strácame informáciu v obrázku. Túto úlohu na maximálny počet bodov vyriešili tímy Elektronik a BonifacGroup, ale aj ďalšie riešenia boli šikovné, správne ste pochopili zadanie všetci. Niektorí ste netestovali farbu bodu, či nie je už pôvodne biela, preto ste v ďalšom vybielili celú fotku. Veľmi pekne ste zvládli prácu so zoznamami. |
|||||||||
© Univerzita Pavla Jozefa Šafárika v Košiciach, Prírodovedecká fakulta, Ústav informatiky palmaj (zavinac) upjs.sk |