Autorské riešenie
[stiahni py]                                       

  • Počet riešiteľov: 29 / 34 =  85 %

  • Úspešnosť riešenia:  4,2 / 5 =  84 %

V Korytnačkove sa terč skladá z troch, do seba vnorených, kružníc s polomermi r, r/2 a r/4. Menšia kružnica je vo väčšej umiestnená náhodne. Vieme, že polomer menšej kružnice je o polovicu menší ako polomer väčšej kružnice. Preto ak chceme, aby menšia kružnica bola vnorená a mala náhodný stred, môžeme tento náhodný stred hľadať od stredu väčšej kružnice len do vzdialenosti polomeru menšej kružnice. Obrázok ukazuje rozsah vzdialenosti stredu väčšej kružnice k náhodnému stredu menšej kružnice. V obrázku predstavuje r polomer väčšej kružnice a r/2 polomer menšej kružnice.

Rozsah hľadania náhodnej pozície stredu menšej kružnice

Terče v Korytnačkove sú kreslené pomocou umeleckých kružníc, kde body po obvode kružnice majú priemer 4. Nechceme, aby sa okraje kružníc prekrývali, preto potrebujeme z rozsahu možných pozícií stredov menšej kružnice odpočítať číslo 4 ako polovica priemeru bodu väčšej kružnice plus polovica priemeru bodu na menšej kružnici.

Na začiatku si vytvoríme pomocnú funkciu prejdi_na _nahodny_stred, ktorá posunie korytnačku zo stredu väčšej kružnice do stredu menšej kružnice. Funkcia prejdi_na _nahodny_stred bude mať ako parameter polomer menšej kružnice. Na hľadanie náhodnej pozície stredu použijeme funkciu uniform z knižnice random. Náhodnú pozíciu stredu menšej kružnice vypočítame pomocou náhodného uhla a náhodného počtu krokov v rozsahu od 0 po polomer menšej kružnice mínus 4.

# Python
def prejdi_na_nahodny_stred(polomer):
    nahodny_uhol = random.uniform(0, 360)
    nahodny_pocet_krokov = random.uniform(0, polomer - 4)
    pero.left(nahodny_uhol)
    pero.forward(nahodny_pocet_krokov)

Majka naprogramovala umeleckú kružnicu tak, že sa začína kresliť po obvode kružnice. Potrebujeme sa, preto z náhodného stredu dostať na obvod kružnice. Vytvoríme funkciu kresli_kruznicu_zo_stredu, ktorá posunie korytnačku zo stredu kružnice na jej obvod, vykreslí kružnicu a následne posunie korytnačku opäť do stredu kružnice.

# Python
    def kresli_kruznicu_zo_stredu(polomer):
    pero.penup()
    pero.forward(polomer)
    pero.left(90)
    pero.pendown()
    kresli_kruznicu(polomer)
    pero.penup()
    pero.right(90)
    pero.forward(-polomer)
    pero.seth(0)

Na záveru vytvoríme funkciu kresli_terc, ktorá vykreslí najväčšiu kružnicu, prejde na náhodný stred s polomerom r/2, vykreslí strednú kružnicu, prejde do stredu najmenšej kružnice s polomerom r/4 a túto kružnicu vykreslí.

Výsledný program vyzerá nasledovne:

# Python
import turtle
import random


def kresli_kruznicu(polomer):
    sirka = 4
    pocet_casti = int(2 * 3.141592653589793 * polomer / sirka)
    farba = pero.color()
    mod = tabula.colormode()
    red, green, blue = random.uniform(0, mod), \
                       random.uniform(0, mod), \
                       random.uniform(0, mod)
    zmena = random.randrange(0, 3)

    for i in range(pocet_casti):
        pero.penup()
        pero.circle(polomer, extent=360 / pocet_casti)
        pero.pendown()
        if zmena == 0:
            pero.color(random.uniform(0, mod), green, blue)
        elif zmena == 1:
            pero.color(red, random.uniform(0, mod), blue)
        else:
            pero.color(red, green, random.uniform(0, mod))
        pero.dot(sirka)

    pero.color(*farba)


def prejdi_na_nahodny_stred(polomer):
    nahodny_uhol = random.uniform(0, 360)
    nahodny_pocet_krokov = random.uniform(0, polomer)
    pero.left(nahodny_uhol)
    pero.forward(nahodny_pocet_krokov)


def kresli_kruznicu_zo_stredu(polomer):
    pero.penup()
    pero.forward(polomer)
    pero.left(90)
    pero.pendown()
    kresli_kruznicu(polomer)
    pero.penup()
    pero.right(90)
    pero.forward(-polomer)
    pero.seth(0)


def kresli_terc(polomer):
    kresli_kruznicu_zo_stredu(polomer)
    prejdi_na_nahodny_stred(polomer / 2)
    kresli_kruznicu_zo_stredu(polomer / 2)
    prejdi_na_nahodny_stred(polomer / 4)
    kresli_kruznicu_zo_stredu(polomer / 4)


tabula = turtle.Screen()
pero = turtle.Turtle()
pero.hideturtle()
pero.speed(0)
tabula.delay(0)

polomer = 100
kresli_terc(polomer)

tabula.mainloop()

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

Medzi najčastejšie chyby patrilo:

  • nevykreslenie terča, ak sme dostali polomery menších kružníc z reálnych čísel,
  • hľadanie náhodnej vzdialenosti od stredu kružnice len pre konkrétne čísla,
  • vytvorenie terča, kde menšie kružnice neboli vnorené z dôvodu nesprávneho nastavenia rozsahu hľadania stredu menšej kružnice.
Zaujímavé riešenie bolo hľadanie náhodnej pozície stredu pomocou goniometrických funkcií.