Autorské riešenie
[stiahni farebny_terc.py]

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

  • Úspešnosť riešenia: 4 / 6 = 66.67 %

Podľa zadania úlohy máme vykresliť špeciálne trojfarebné terče. Z textu zadania a z nižšie uvedeného obrázka sa dá vidieť, že tieto terče sa vzájomne líšia v niekoľkých parametroch:

  • počtom strán pravidelného mnohouholníka, ktorý tvorí prostrednú vrstvu terča,

  • počtom vrstiev terča,

  • dlžkou strany pravidelného mnohouholníka (a teda aj dĺžkou všetkých priamych úsekov na všetkých vrstvách terča),

  • vzdialenosťou (rozstupom) medzi susedných vrstvami terča.

Príklady 3 rôznych farebných terčov  Pri riešení tohto komplexnejšieho problému nám pomôže vyriešenie jednoduchšieho podproblému, a to vykreslenie obrysu jednej vrstvy terča. Veľmi užitočnou pomockou pre nás je grafický náčrt obrysu jednej vrstvy terča (pozri obrázok nižšie).

náčrt priemetu torty s päťuholníkovým najvyšším poschodím          

Z náčrtu môžeme odpozorovať, že pri skrátení dĺžky strany mnohouholníka na 0, by sme ako obrys vrstvy dostali kružnicu tvorenú z jednotlivých rovnako veľkých kružnicových oblúkov. Veľkosť uhla jedného kružnicového oblúka je vyjadrená podielom 360 / pocet_stran. Dĺžka polomera kružnicových oblúkov so stredom v okrajových bodoch mnohouholníka je rovná´hodnote parametra polomer_obluka. Funkcia vrstva_obrys na vykreslenie obrysu jednej vrstvy tvorenej mnohouholníkom so zadaným počtom strán, dĺžkou strany a dĺžkou polomeru kružnicového oblúka môže vyzerať nasledovne:  

 
def vrstva_obrys(pocet_stran, dlzka_strany, polomer_obluka):
    for _ in range(pocet_stran):
        pero.forward(dlzka_strany)
        pero.circle(polomer_obluka, 360 / pocet_stran)

Ak by sme namiesto obrysu vrstvy chceli vykresliť vrstvu vyfarbenú zadanou farbou, stačí len mierne upraviť funkciu vrstva_obrys na funkciu kresli_vrstvu s nižšie uvedeným programovým kódom:

def kresli_vrstvu(pocet_stran, dlzka_strany, polomer_obluka, farba):
    pero.fillcolor(farba)
    pero.begin_fill()
    for _ in range(pocet_stran):
        pero.forward(dlzka_strany)
        pero.circle(polomer_obluka, 360 / pocet_stran)
    pero.end_fill()

Ak vieme vykresliť jednu vrstvu terča, tak na vykreslenie terča s viacerými vrstvami použijeme cyklus. Tu však musíme brať do úvahy, že vrstvy musíme kresliť od najväčšej vrsvy po prostrednú vrstvu (s mnohouholníkom) a musíme pravidelne striedať tri farby tak, aby sme skončili hnedou farbou pri vykreslení mnohuholníka na prostrednej vrstve. Výsledný program (farebny_terc.py) môže vyzerať napr. nasledovne:

import turtle


def kresli_vrstvu(pocet_stran, dlzka_strany, polomer_obluka, farba):
    pero.fillcolor(farba)
    pero.begin_fill()
    for _ in range(pocet_stran):
        pero.forward(dlzka_strany)
        pero.circle(polomer_obluka, 360 / pocet_stran)
    pero.end_fill()


def posun_dnu(rozstup):
    pero.penup()
    pero.left(90)
    pero.forward(rozstup)
    pero.right(90)
    pero.pendown()


def kresli_terc(pocet_vrstiev, pocet_stran, dlzka_strany, rozstup):
    farby = ['brown', 'orange', 'yellow']
    for idx in range(pocet_vrstiev - 1, -1, -1):
        farba = farby[idx % len(farby)]
        kresli_vrstvu(pocet_stran, dlzka_strany, idx * rozstup, farba)
        posun_dnu(rozstup)


platno = turtle.Screen()
pero = turtle.Turtle()
kresli_terc(8, 3, 80, 20)
platno.mainloop()

Táto úloha je zameraná na:

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

  • precvičenie príkazov volania funkcie s parametrami, kreslenia v korytnačej grafike a použitie jednoduchých aritmetických operácií.

Vaše zaujímavé riešenia a najčastejšie chyby

Do riešenia úlohy sa zapojilo 3 tímy z kategórie EXPERT. Plný počet bodov získali tímy raketak a takacpisko, ktorým gratulujeme.

V riešeniach sme zaregistrovali nasledovné nedostatky, vychádzajúce najčastejšie z nedôslednej analýzy problému:

  • zanedbanie parametra šírka vrstvy,

  • nedodržanie zadania úlohy, kde je uvedené, že susedné vrstvy terča sú od seba rovnako vzdialené,

  • používanie jednopísmenových málo hovoriacich názvov premenných napr. f, x, namiesto nich sa mali uviesť zmysluplné názvy napr. farba, vzdialenost,

  • hlavný program je uvedený pred aj po definícii funkcie, vhodnejšie by ho bolo uviesť celý za definíciou funkcie.