Autorské riešenie
Pozrime sa na obrázok, ktorý treba podľa zadania vykresliť. Pozostáva zo 7 vzorov a ich 7 zrkadlových obrazov zostrojených podľa 7 polosí. Jedným z riešení je vykresliť zadaný počet polosí, vzorov a zrkadlových obrazov.
Samotný vzor (uzavretú lomenú čiaru) vykreslíme pomocou funkcie kresli_lomenu_ciaru(), v ktorej postupne prechádzame zoznamom a vykonávame jednotlivé posunutia a otočenia grafického pera: def kresli_lomenu_ciaru(obrazok, farba): pero.fillcolor(farba) pero.begin_fill() for [dlzka, otocenie] in obrazok: pero.forward(dlzka) pero.left(otocenie) pero.end_fill() Teraz sa pozrime ako vykresliť zrkadlový obraz zadaného vzoru. Vzor na obrázku (so zelenou výplňou) vykreslíme tak, že sa od zrkadlovaj osi natočíme doprava o 90 stupňov a vykonáme postupnosť príkazov dopredu 30, vľavo 60, dopredu 30, vľavo 120, dopredu 30, vľavo 60, dopredu 30, vľavo 120. Zrkadlový obraz zadaného vzoru (so žltou výplňou) vykreslíme tak, že sa od zrkadlovaj osi natočíme doľava o 90 stupňov a vykonáme postupnosť príkazov dopredu 30, vľavo -60, dopredu 30, vľavo -120, dopredu 30, vľavo -60, dopredu 30, vľavo -120. Vidíme, že kreslenie vzoru a jeho zrkadlového obrazu sa líšia len znamienkom pri uhloch otočení.
Pre vytvorenie zoznamu s postupom kreslenia zrkadlového obrazu podľa zadaného zoznamu s postupom kreslenia vzoru napíšeme funkciu vytvor_zrkadlovy_obrazok(), ktorá môže vyzerať nasledovne: def vytvor_zrkadlovy_obrazok(obrazok): obrazok2 = [[dlzka, -otocenie] for [dlzka, otocenie] in obrazok] return obrazok2 Výsledný program s hlavnou funkciou kresli_obrazok() s tromi parametrami (počtom polosí, dĺžkou posuvu počiatku vykresľovania vzorov a zrkadlových obrazov, zoznamom s postupom kreslenia vzoru) môže vyzerať nasledovne: import turtle def kresli_lomenu_ciaru(obrazok, farba): pero.fillcolor(farba) pero.begin_fill() for [dlzka, otocenie] in obrazok: pero.forward(dlzka) pero.left(otocenie) pero.end_fill() def kresli_osi(pocet, dlzka, farba): pero.pencolor(farba) otocenie = 360 / pocet for i in range(pocet): pero.forward(dlzka) pero.forward(-dlzka) pero.right(otocenie) def kresli_polovicu_obrazka(pocet, dlzka, obrazok, farba, koeficient): otocenie = 360 / pocet for i in range(pocet): pero.penup() pero.forward(dlzka) pero.pendown() pero.right(90 * koeficient) kresli_lomenu_ciaru(obrazok, farba) pero.right(-90 * koeficient) pero.penup() pero.forward(-dlzka) pero.pendown() pero.right(otocenie) def vytvor_zrkadlovy_obrazok(obrazok): obrazok2 = [[dlzka, -otocenie] for [dlzka, otocenie] in obrazok] return obrazok2 def kresli_obrazok(pocet, dlzka, obrazok1): kresli_osi(pocet, 250, 'gray') kresli_polovicu_obrazka(pocet, dlzka, obrazok1, 'green', 1) obrazok2 = vytvor_zrkadlovy_obrazok(obrazok1) kresli_polovicu_obrazka(pocet, dlzka, obrazok2, 'gold', -1) tabula = turtle.Screen() pero = turtle.Turtle() kresli_obrazok(7, 150, [[30, 60], [30, 120], [30, 60], [30, 120]]) tabula.mainloop() Funkcia kresli_polovicu_obrazka() s parametrom koeficient = 1 vykresľuje vzory a s parametrom koeficient = -1 vykresľuje zrkadlové obrazy. Táto úloha je zameraná na:
Vaše zaujímavé riešenia a najčastejšie chyby Do riešenia úlohy sa zapojili 4 tímy z kategórie EXPERT. Plný počet bodov za svoje riešenie dosiahol len tím zemaky, ktorým srdečne gratulujeme. V riešeniach sme zaregistrovali nasledovné nedostatky, vychádzajúce najčastejšie z nedôslednej analýzy problému:
|
||||||||||
© Univerzita Pavla Jozefa Šafárika v Košiciach, Prírodovedecká fakulta, Ústav informatiky palmaj (zavinac) upjs.sk |