Autorské riešenie
Pri riešení tejto grafickej úlohy si pomôžeme náčrtom obrázka. Vykreslenie celého obrázka si môžeme rozdeliť na dva podproblémy:
Pri riešení úlohy využijeme už vytvorenú funkciu kresli_pixel na vykreslenie jedného pixelu obrázka:
def kresli_pixel(cislo_farby):
''' Vykreslí štvorec so zadanou farbou výplne ''' farby = ['yellow', 'green', 'red'] pero.pencolor(farby[2]) pero.fillcolor(farby[cislo_farby]) pero.begin_fill() for idx in range(4): pero.forward(25) pero.right(90) pero.end_fill() Na vykreslenie pixelov jedného riadku použijeme funkciu kresli_riadok pre zadané číslo riadka (parameter riadok) a zadaný počet pixelov v riadku (parameter sirka). Čísla farieb jednotlivých pixelov riadku určíme pomocou výrazu obrazok[2 + stlpec + sirka * riadok]. Na konci vykreslenia riadku sa vrátime na počiatočnú pozíciu kreslenia riadku. def kresli_riadok(obrazok, riadok, sirka):
''' Vykreslí riadok obrázka zadaný zoznamom hodnôt so zadaným počtom pixelov v riadku ''' for stlpec in range(sirka): cislo_farby = obrazok[2 + stlpec + sirka * riadok] kresli_pixel(cislo_farby) pero.forward(25) pero.forward(-25 * sirka) Na vykreslenie celého obrázku použijeme funkciu kresli_obrazok. Z parametra obrazok určíme šírku a výšku obrázka a následne v cykle budeme vykresľovať jednotlivé riadky obrázka a presúvať sa na počiatočmú pozíciu nasledovného riadku. Celé kreslenie ukončíme v rovnakom bode, z ktorého sme začali kresliť. def kresli_obrazok(obrazok):
''' Vykreslí obrázok zadaný zoznamom hodnôt ''' sirka_obrazka = obrazok[0] vyska_obrazka = obrazok[1] for riadok in range(vyska_obrazka): kresli_riadok(obrazok, riadok, sirka_obrazka) pero.right(90) pero.forward(25) pero.left(90) Výsledné riešenie úlohy zapísané v programovacom jazyku Python môže vyzerať nasledovne: import turtle
def kresli_obrazok(obrazok): ''' Vykreslí obrázok zadaný zoznamom hodnôt ''' sirka_obrazka = obrazok[0] vyska_obrazka = obrazok[1] for riadok in range(vyska_obrazka): kresli_riadok(obrazok, riadok, sirka_obrazka) pero.right(90) pero.forward(25) pero.left(90) def kresli_riadok(obrazok, riadok, sirka): ''' Vykreslí riadok obrázka zadaný zoznamom hodnôt so zadaným počtom pixelov v riadku ''' for stlpec in range(sirka): cislo_farby = obrazok[2 + stlpec + sirka * riadok] kresli_pixel(cislo_farby) pero.forward(25) pero.forward(-25 * sirka) def kresli_pixel(cislo_farby): ''' Vykreslí štvorec so zadanou farbou výplne ''' farby = ['yellow', 'green', 'red'] pero.pencolor(farby[2]) pero.fillcolor(farby[cislo_farby]) pero.begin_fill() for idx in range(4): pero.forward(25) pero.right(90) pero.end_fill() obrazok = [3, 6, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1] tabula = turtle.Screen() pero = turtle.Turtle() kresli_obrazok(obrazok) tabula.mainloop() Táto úloha je zameraná na:
Vaše zaujímavé riešenia a najčastejšie chyby Do riešenia tejto úlohy sa zapojilo 14 tímov z kategórie EXPERT. Plný počet bodov dosiahlo 6 tímov (_NegaPyro_, byg, File-Open, HFD, Master, Oliver Seman), ktorým gratulujeme. Všetci súťažiaci pri vykresľovaní obrázka použili dva vnorené for cykly. V dvoch riešeniach súťažiaci ošetrovali korektnosť vstupov, ktoré sme pri tejto úlohe nutne nevyžadovali. Len 7 tímov použilo vo svojich riešeniach komentáre (byg, File-Open, HFD, GLSTN BOYZ, GLŠTN masters, Master a Oliver Seman), za čo ich chválime. V riešeniach sme zaregistrovali nasledovné nedostatky, vychádzajúce najčastejšie z nedôslednej analýzy problému, tvorby menej efektívneho riešenia či z pretrvávajúcich programátorských zlozvykov:
|
|||||||||
© Univerzita Pavla Jozefa Šafárika v Košiciach, Prírodovedecká fakulta, Ústav informatiky palmaj (zavinac) upjs.sk |