Autorské riešenie
Kým sa pustíme do programovania, pozrime sa lepšie na to, ako sa veľký vzor vykreslí na malú kachličku:
Vidíme, že samotný vzor je väčší ako kachlička. Ak vzor prekryjeme kachličkou, ukážu sa nám miesta, kde sa vzor už na kachličku nezmestí. Tieto časti by teda mali pokračovať na ďalšej kachličke. Zároveň ale platí aj to, že kachličky sú rovnaké. Inak povedané, to čo by malo pokračovať na ďalšej kachličke, musí byť súčasne aj na prvej kachličke (lebo aj tá môže byť pokračovateľkou nejakej inej kachličky). Ak teda zistíme, že kreslenie by malo pokračovať mimo kachličky, pokračujme na rovnakej kachličke, ale od opačného okraja. Napr. ak by sme pri kreslení vzoru z kachličky "odišli" na jej pravom okraji, pokračujme v kreslení od ľavého okraja. Podobne to platí aj pre tri zvyšné okraje kachličky. Pozrime sa teraz na to, ako zistíme, že kreslenie vzoru pokračuje mimo kachličky. Ak vieme, aké má kachlička rozmery, vieme povedať aj to kde má okraje a teda aj to, či sme tieto okraje prekročili alebo nie. Uvedomme si ešte jednu vec. Kreslenie nemusí začínať vždy na súradnici [0, 0]. Takže okraje kachličky musíme počítať vzhľadom na súradnice, kde sme ju začali kresliť. V našom prípade sú súradnice začiatku kreslenia v ľavom spodnom rohu (ale v princípe to môže byť hocikde, kde si povieme). Posledná vec, ktorú musíme vyriešiť je, ako a kedy testovať, či by kreslenie vzoru pokračovalo mimo kachličky. Dĺžky čiar v návode môžu byť veľké a tak nesmieme čiaru nakresliť naraz. Môžeme postupovať po krokoch dĺžky 1 a po každom takomto kroku testovať, či už nie sme mimo kachličky. Výsledný program môže vyzerať nasledovne: def kresli_kachlicku(navod, dx, dy): pero.setheading(0) pero.color('red')
for i in range(2):
pero.forward(dx)
pero.left(90)
pero.forward(dy)
pero.left(90)
pero.color('black')
x, y = pero.pos()
for idx in range(len(navod)):
if idx % 2 == 0:
pero.left(navod[idx])
else:
for i in range(navod[idx]):
pero.forward(1)
pero.penup()
if pero.xcor() > x + dx:
pero.setx(x)
elif pero.xcor() < x:
pero.setx(x + dx)
if pero.ycor() > y + dy:
pero.sety(y)
elif pero.ycor() < y:
pero.sety(y + dy)
pero.pendown()
Všimnime si niekoľko detailov. Na začiatku nasmerujeme korytnačku na východ. Ak by bola otočená iným smerom, kreslenie by sa nevydarilo, pretože predpokladáme, že hrany kachličky sú rovnobežné s osami. Nakreslíme obrys kachličky. Tento krok by sme mohli aj vynechať (podľa zadanie nie je potrebný), ale takto si lepšie zvýrazníme samotné okraje kachličky. Zapamätáme si súradnice odkiaľ začíname kresliť (pre nás je to ľavý spodný roh). Ak poznáme tieto súradnice a rozmery kachličky, vždy vieme, či je aktuálna pozícia kreslenia na kachličke alebo mimo nej. Podľa toho sa rozhodneme, či pokračujeme v kreslení alebo či pero presunieme na opačný koniec kachličky. Vaše zaujímavé riešenia a najčastejšie chyby Táto úloha bola zrejme dosť náročná. Nikto nedosiahol plný počet bodov. Medzi najčastejšie chyby patril chybný predpoklad, že kreslenie začína na pozícii [0, 0]. Ako vieme z úvahy vyššie, nie je to tak. Druhou častou chybou bolo, že ste nesprávne vyriešili kreslenie mimo kachličky, teda buď ste nekontrolovali alebo kontrolovali nesprávne či kresliace pero je na plocha kachličky alebo je už mimo nej. |
||||||||||
© Univerzita Pavla Jozefa Šafárika v Košiciach, Prírodovedecká fakulta, Ústav informatiky palmaj (zavinac) upjs.sk |