Autorské riešenie
[stiahni py]

  • Počet riešiteľov: 4 / 4 =  100.00 %

  • Úspešnosť riešenia: 4 / 7 = 57.14 %

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.

vykresleny zrkadlovy obrazok

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í.

vzor a zrkadlovy obraz

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:

  • použitie stratégie riešenia problémov - dekompozícia problému na podproblémy a hľadanie vzorov,

  • precvičenie príkazov volania funkcií s parametrami s výstupom, cyklu for, prácu so zoznamom, aritmetických operácí, príkazov korytnačej grafiky.

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:

  • vykreslenie len konkrétneho ilustratívneho obrázku uvedeného v zadaní,

  • vykreslenie síce ľubovoľnej lomenej čiary, ale len so 4 úsečkami,

  • stotožnenie posunu od stredu s dĺžkou polosí.