Autorské riešenie
Podľa zadania máme nakresliť jednoduchú grafickú podobu panáčika cvičiaceho niektorý zo zadaných cvikov s rukami (pripažiť, vzpažiť, rozpažiť, predpažiť). Pre jednoduchosť budeme panáčika vykresľovať z jedného bodu, z ktorého vyrastá 5 dielov tela (hlava, ruky, nohy) ako je to znázornené na obrázku.
Pre vykreslenie jednotlivých dielov tela použijeme procedúru diel_tela, ktorú uvádzame v pseudokóde bez parametrov (dĺžky a farby):
procedúra diel_tela:
dopredu kruh peroHore vzad peroDolu Pár končatín (ruky, resp. nohy) z pozície, keď je pero natočené smerom na sever vykreslíme takým spôsobom, ktorý je znázornený na dolnom obrázku. Najprv sa natočíme vpravo o zadaný uhol a vykreslíme diel tela. Potom sa natočíme vpravo o hodnotu 360 - 2 . uhol a vykreslíme ďalší diel tela. Napokon sa natočíme vpravo o zadaný úhol, čím budeme opäť natočení na sever.
Procedúra par_koncatin vykresľujúca nohy, resp. ruky môže byť zapísaná, napr. nasledovným pseudokódom, v ktorom neuvádzame parametre (dĺžky a farby):
procedúra par_koncatin:
vpravo uhol diel_tela vpravo 360 - 2 * uhol
diel_tela
vpravo uhol Napokon panáčika s daným cvikom rúk vykreslíme pomocou procedúry panacik s napr. nasledovným pseudokódom:
procedúra panacik:
nohy ruky
hlava
Jednotlivé cviky sa odlišujú len inou polohou rúk. Nohy vykreslíme ako pár končatín pod uhlom 175 stupňov od severu. Ruky vykreslíme pod rôznymi uhlami v závislosti od zadaného cviku (pripažiť: 170 stupňov, vzpažiť: 10 stupňov, rozpažiť: 90 stupňov, predpažiť: 90 stupňov). V prípade cviku predpažiť je skrátená dĺžka rúk.
Výsledné riešenie tejto úlohy zapísané v jazyku Imagine Logo môže vyzerať napríklad takto: ;Imagine Logo viem štart A riešenie úlohy zapísané v jazyku Python môže vyzerať nasledovne: import turtle, random def diel_tela(dlzka, priemer, farba): ''' vykreslí úsečku s kruhom na konci :param dlzka: dĺžka dielu tela z množiny {hlava, ruka, noha} :type dlzka: float :param priemer: priemer kruhu na konci úsečky :type priemer: float :param farba: farba kruhu na konci úsečky :type farba: float ''' kor.forward(dlzka) kor.dot(priemer,farba) kor.penup() kor.forward(-dlzka) kor.pendown() def par_koncatin(dlzka, priemer, farba, uhol): ''' vykreslí 2 úsečky s kruhmi na konci odklonené od severu na obe strany :param dlzka: dĺžka dielu tela z množiny {hlava, ruka, noha} :type dlzka: float :param priemer: priemer kruhu na konci úsečky :type priemer: float :param farba: farba kruhu na konci úsečky :type farba: str :param uhol: uhol, o ktorý sú otočené obe úsečky od severu na obe strany :type uhol: float ''' kor.right(uhol) diel_tela(dlzka, priemer, farba) kor.right(360 - 2 * uhol) diel_tela(dlzka, priemer, farba) kor.right(uhol) def panacik(velkost, poloha): ''' vykreslí panáčika so zadanou veľkosťou v zadanom cviku s rukami :param velkost: od tejto hodnoty sú odvodené dĺžky ostatných častí tela :type velkost: float :param poloha: hodnota z {predpažiť, vzpažiť, rozpažiť, pripažiť} :type poloha: str ''' #nohy par_koncatin(3 * velkost, velkost / 8, "blue", 175) #ruky if poloha == "pripažiť": par_koncatin(2 * velkost, velkost / 8, "red", 170) elif poloha == "vzpažiť": par_koncatin(2 * velkost, velkost / 8, "red", 10) elif poloha == "rozpažiť": par_koncatin(2 * velkost, velkost / 8, "red", 90) elif poloha == "predpažiť": par_koncatin(velkost / 16, velkost / 8, "red", 90) #hlava diel_tela(velkost, velkost / 2, "orange") kor = turtle.Turtle() obrazovka = turtle.Screen() kor.speed(0) kor.left(90) kor.hideturtle() cvik = random.choice(["pripažiť", "vzpažiť", "rozpažiť", "predpažiť"]) panacik(100, cvik) kor.penup() kor.setposition(0, 200) kor.write(cvik, align = "center", font = ("Arial", 10, "bold")) obrazovka.mainloop() Táto súťažná úloha je zameraná na dôslednu analýzu matematického problému, na výpočty využívajúce uhly, na použitie stratégie dekompozície riešenia problému do riešenia podproblémov, na precvičenie použitia procedúr, resp. funkcií s parametrami, príkazov vetvenia a korytnačej grafiky. Vaše zaujímavé riešenia a najčastejšie chyby Do riešenia tejto úlohy sa zapojilo 9 tímov z kategórie PROFÍK a 10 tímov z kategórie EXPERT. Plný počet bodov získalo až 11 tímov. Súťažiaci dosiahli priemerný počet 5,3 bodu z možných 6 bodov. Všetkých 19 tímov riešilo úlohu v jazyku Imagine Logo. Z toho 5 tímov riešilo úlohu iným spôsobom ako je uvedené autorské riešenie. Jednotlivé cviky si vopred pripravili a pomocou jednej alebo štyroch korytnačiek ich odtláčali do plochy. Niekoľko tímov vykreslilo cvik predpažiť zboku nie spredu ako ostatné cviky, čo považujeme tiež za akceptovateľné riešenie. Obzvlášť oceňujeme súťažiaceho Bubák v. 5 za súčasné zobrazenie všetkých cvikov z predného aj bočného pohľadu. V riešeniach sme zaregistrovali nasledovné nedostatky:
|
|||||||||