Autorské riešenie
Rovnako ako pri iných grafických úlohách aj pri tejto je veľmi dôležité začať riešenie náčrtom obrázku s vyznačením jeho vybraných rozmerov. Podľa zadania každé poschodie tvorí rovnoramenný lichobežník, ktorého dolná základňa je o dĺžku bočného ramena dlhšia ako horná základňa. Dĺžky dotýkajúcich sa základní susedných lichobežníkov sa líšia o polovicu dĺžky bočného ramena lichobežníka. Problém vykreslenia celého stromčeka si rozdelíme na viaceré podproblémy:
Stromček môžeme vykresľovať zhora nadol aj zdola nahor. Vyberieme si vykresľovanie zhora nadol. Na vykreslenie každého poschodia použijeme funkciu kresli_obdlznik, vykresľujúcu (v smere otáčania hodinových ručičiek) rovnoramenný lichobežník so zadanou dĺžkou hornej a dolnej základne a bočných ramien. Vrchný trojuholník vykreslíme tiež pomocou tejto funkcie, ak nastavíme nulovú dĺžku hornej základne lichobežníka. Na presunutie pera na pozíciu lichobežníka na nižšom podlaží (označenú na obrázku odtlačeným červeným tvarom pera) použijeme funkciu posun_dole. Na presunutie pera na počiatočnú pozíciu kreslenia stromčeka (označenú na obrázku odtlačeným čiernym tvarom pera) použijeme funkciu posun_nahor. Celý stromček vykreslíme pomocou funkcie kresli_stromcek, v ktorej pred cyklom nastavíme nulovú dĺžku hornej základne a v cykle pre každé poschodie vykreslíme rovnoramenný lichobežník so zväčšujúcimi sa dĺžkami oboch jeho základní a posunieme pero na nižšie poschodie. Na konci presunieme pero na počiatočnú pozíciu kreslenia. Výsledné riešenie úlohy zapísané v programovacom jazyku Python môže vyzerať nasledovne: import turtle def kresli_lichobeznik(horna_zakladna, dolna_zakladna, rameno): ''' Vykreslí rovnoramenný lichobežník so zadanými dĺžkami hornej a dolnej základne a ramena ''' pero.forward(horna_zakladna) pero.right(60) pero.forward(rameno) pero.right(120) pero.forward(dolna_zakladna) pero.right(120) pero.forward(rameno) pero.right(60) def posun_dole(rameno): ''' Presunie pero na pozíciu kreslenia nižšieho lichobežníka ''' pero.left(60) pero.forward(-rameno) pero.right(60) pero.forward(rameno / 4) def posun_nahor(pocet_poschodi, rameno): ''' Presunie pero na počiatočnú pozíciu kreslenia ''' for poschodie in range(pocet_poschodi): pero.forward(-rameno / 4) pero.left(60) pero.forward(rameno) pero.right(60) def kresli_stromcek(pocet_poschodi, rameno): ''' Vykreslí stromček so zadaným počtom poschodí a dĺžkou ramena ''' horna_zakladna = 0 for podlazie in range(pocet_poschodi): kresli_lichobeznik(horna_zakladna, horna_zakladna + rameno, rameno) horna_zakladna = horna_zakladna + rameno / 2 posun_dole(rameno) posun_nahor(pocet_poschodi, rameno) tabula = turtle.Screen() pero = turtle.Turtle() kresli_stromcek(5, 70) tabula.mainloop() Ďalšie riešenia úlohy vykresľujúce stromček zdola nahor môžu využívať:
Táto úloha je zameraná na:
Vaše zaujímavé riešenia a najčastejšie chyby Do riešenia tejto úlohy sa zapojilo 16 tímov z kategórie EXPERT. Plný počet bodov dosiahlo 6 tímov (bobuxáci, Doma, File-Open, HFD, Master a ShadowProgramers), ktorým gratulujeme. 9 tímov vykresľovalo stromček zhora a 7 tímov zdola. Korytnačiu grafiku (modeul turtle) použilo 13 tímov a len 3 tímy použilo karteziánsku grafiku (modul tkinter). Len 3 tímy použili vo svojich riešeniach komentáre (File-Open, HFD a Predators), 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 |