13. Kreslenie elíps a kruhov

Zoznámime sa s ďalším grafickým príkazom. Zatiaľ sme sa naučili vytvárať grafické útvary obdĺžniky a texty. Kreslenie elíps (v Pythobe im hovoríme aj ovály) a ich špeciálnych prípadov kružníc bude oproti tomu trochu náročnejšie. Môžu nám pritom veľmi dobre pomôcť skúsenosti s kreslením obdĺžnikov.

Kreslenie elipsy

Príkaz na kreslenie elipsy má tento základný tvar:

platno.create_oval(x1, y1, x2, y2)

Tento príkaz nakreslí elipsu, ktorá sa kompletne zmestí do obdĺžnika s rovnakými parametrami. Matematici tomuto hovoria vpísaná elipsa. Aby sme to lepšie videli, napíšeme program, ktorý nakreslí elipsu aj obdĺžnik s rovnakýni parametrami:

import tkinter

platno = tkinter.Canvas(bg='white')
platno.pack()

platno.create_rectangle(50, 30, 300, 200, outline='light gray')
platno.create_oval(50, 30, 300, 200)

Po spustení vidíme obdĺžnik aj elipsu, ktorá má rovnaké parametre ako tento obdĺžnik:

_images/13_01.png

Kým si nezvykneme na tieto parametre, môžeme si najprv očakávaný obrázok nakresliť pomocou obdĺžnikov a keď s tým budeme spokojní, prepíšeme ich na kreslenie elíps. Napr. pre tento program zatiaľ len s obdĺžnikmi:

import tkinter

platno = tkinter.Canvas(bg='white')
platno.pack()

platno.create_rectangle(100, 50, 250, 210)
platno.create_rectangle(130, 80, 160, 110)
platno.create_rectangle(190, 80, 220, 110)
platno.create_rectangle(160, 120, 190, 140)
platno.create_rectangle(130, 160, 220, 190)

dostávame:

_images/13_02.png

Teraz vymeníme všetky výskyty príkazu create_rectangle na create_oval:

import tkinter

platno = tkinter.Canvas(bg='white')
platno.pack()

platno.create_oval(100, 50, 250, 210)
platno.create_oval(130, 80, 160, 110)
platno.create_oval(190, 80, 220, 110)
platno.create_oval(160, 120, 190, 140)
platno.create_oval(130, 160, 220, 190)

Vidíme:

.. image:: image/13_03.png

Ak by sme pritom ponechali naznačené obdĺžniky, videli by sme naozaj súvis medzi týmito dvomi typmi útvarov v Pythone:

_images/13_04.png

Veľmi dôležité je aj to, že všetky parametre v príkaze create_rectangle, ktoré sme sa naučili pri kreslení obdĺžnikov, fungujú aj pre elipsy. Teda pomocou parametrov môžeme pri kreslení elipsy nastaviť:

  • pomocou fill farbu výplne

  • pomocou outline farbu obrysu

  • pomocou width hrúbku obrysovej čiary

Predchádzajúcemu obrázku zmeňme niektoré tieto atribúty:

import tkinter

platno = tkinter.Canvas(bg='white')
platno.pack()

platno.create_oval(100, 50, 250, 210, fill='deep sky blue')
platno.create_oval(130, 80, 160, 110, fill='blue', width=0)
platno.create_oval(190, 80, 220, 110, fill='blue', width=0)
platno.create_oval(160, 120, 190, 140, fill='salmon', width=3)
platno.create_oval(130, 160, 220, 190, fill='gold', outline='red', width=10)

a takto sa to zafarbilo:

_images/13_05.png

Elipsy poskytujú pekné námety aj pri použítí vo for-cykloch. Nakreslime 10 elíps, ktoré majú spoločný ľavý horný vrchol (mysleného) obdĺžnika a x-ová súradnica pravého dolného vrchola sa zvyšuje (inkrement) o nejakú konštantu:

import tkinter

platno = tkinter.Canvas(bg='white')
platno.pack()

x = 50
for i in range(10):
    platno.create_oval(20, 60, x, 160)
    x = x + 30

Dostali sme takýto obrázok:

_images/13_06.png

Úlohy

  1. Experimentujte s programom, ktorý v 7. časti kreslil robota a nahraďte všetky volania create_rectangle na create_oval.

    _images/13_07.png

  1. V 10. časti sme vytvorili podporgram karticka_nahodne, ktorá do modrého obdĺžnika zapísala nejaký text. Poexperimentujte s tvarom tejto kartičky a nahraďte create_rectangle na create_oval

    _images/13_08.png

  1. Pomocou elíps a obdĺžmikov nakreslite takéto písmeno D:

    _images/13_09.png

    Pri kreslení tohto obrázku sa najprv nakrelila oranžová elipsa, potom o trochu menšia biela, potom biely obdĺžnik zmaže polovicu veľkej elipsy a nakoniec sa nakreslí oranžový obdĺžnik.

  1. Pomocou úzkeho hnedého obdĺžnika (rozmerov 10x40) a zelenej elipsy (rozmerov 50x60) vieme nakresliť jeden strom. Napíšte cyklus, pomocou ktorého sa nakreslí celý rad stromov. Rozostupy medzi stromami nech sú 60:

    _images/13_10.png

    Použite for-cyklus, v ktorom range bude mať krok 60.

Zhrnutie

čo sme sa naučili:

  • elipsy a kružnice sa kreslia na rovnakom princípe ako sa kreslili obdĺžniky

  • aj elipsy môžeme vyfarbovať, resp. im nastaviť hrúbku a farbu obrysu