{"id":192,"date":"2019-01-09T13:27:46","date_gmt":"2019-01-09T13:27:46","guid":{"rendered":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/?post_type=chapter&#038;p=192"},"modified":"2019-04-08T16:46:10","modified_gmt":"2019-04-08T16:46:10","slug":"graafika-ja-funktsioon","status":"publish","type":"chapter","link":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/chapter\/graafika-ja-funktsioon\/","title":{"raw":"Graafika ja funktsioon","rendered":"Graafika ja funktsioon"},"content":{"raw":"<h2>Kilpkonn \u00f5pib funktsioone<\/h2>\r\n<p class=\"vspace\">Varasemates osades oleme t\u00e4htsamate programmeerimise konstruktsioonidega (nt valikulause ja ts\u00fckliga) tutvumisel abiks v\u00f5tnud kilpkonna, et saada parem visuaalne ettekujutus. Kilpkonnagraafikas on meil l\u00e4bivaks teemaks olnud ruudu joonistamine, teeme seda ka funktsioone kasutades.<\/p>\r\n<p class=\"vspace\">Viimati kasutasime ruudu joonistamisel ts\u00fcklit:<\/p>\r\n\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">from turtle import *\r\n \r\ni = 0\r\nwhile i &lt; 4:               # Kilpkonn joonistab ts\u00fckli abil ruudu. Ts\u00fckli keha l\u00e4bitakse neli korda.\r\n    forward(100)\r\n    left(90)\r\n    i = i + 1              # Muutujat i suurendatakse \u00fche v\u00f5rra\r\n \r\nexitonclick()<\/pre>\r\nRuudu joonistamiseks v\u00f5ime defineerida funktsiooni, n\u00e4iteks nimega <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">ruut<\/code>. Loome selle esialgu ilma argumentideta:\r\n\r\n<strong>N\u00e4iteprogramm. Ruut III<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from turtle import *\r\n \r\ndef ruut():                # Defineerime funktsiooni nimega ruut\r\n    i = 0\r\n    while (i &lt; 4):\r\n        forward(100)\r\n        left(90)\r\n        i = i + 1\r\n \r\nruut()                     # Kutsume funktsiooni ruut v\u00e4lja. Kilpkonn joonistab ruudu k\u00fcljega 100 pikslit\r\nright(45)                  # P\u00f6\u00f6rame paremale 45\u00b0\r\nruut()                     # Kutsume uuesti funktsiooni ruut v\u00e4lja\r\n \r\nexitonclick()<\/pre>\r\n<p class=\"vspace\">Selle n\u00e4iteprogrammi puhul joonistab kilpkonn alati ruudu, mille k\u00fclje pikkus on 100 pikslit. Selleks, et me saaksime muuta ruudu k\u00fclje pikkust vastavalt soovile, lisame funktsioonile <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">ruut<\/code> argumendi:<\/p>\r\n<strong>N\u00e4iteprogramm. Ruut IV<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from turtle import *\r\n \r\ndef ruut(k\u00fclg):            # Defineerime funktsiooni nimega ruut, mille argumendiks on ruudu k\u00fclje pikkus\r\n    i = 0\r\n    while (i &lt; 4):\r\n        forward(k\u00fclg)      # Siin kasutatakse argumenti\r\n        left(90)\r\n        i = i + 1\r\n \r\nruut(50)                   # Kilpkonn joonistab ruudu k\u00fcljega 50 pikslit\r\nruut(75)                   # Kilpkonn joonistab ruudu k\u00fcljega 75 pikslit\r\n \r\nexitonclick()<\/pre>\r\n&nbsp;\r\n<p class=\"vspace\">N\u00fc\u00fcd saab seda funktsiooni rakendades joonistada erineva suurusega ruute. N\u00e4iteks <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">ruut(50)<\/code><\/code> korral on argumendi v\u00e4\u00e4rtuseks 50 ja ruudu k\u00fclje pikkuseks tuleb 50. Kui argumendiks on 75 (<code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">ruut(75)<\/code><\/code>), siis tuleb k\u00fclje pikkuseks 75.<\/p>\r\n\r\n<h3>V\u00e4rvimine<\/h3>\r\n<p class=\"vspace\">Eelmine kord, kui kilpkonna k\u00e4sitlesime, olid vaatluse all ka v\u00e4rvimise v\u00f5imalused. Neid on tegelikult veelgi. N\u00e4iteks muudetakse pildi taustav\u00e4rvi k\u00e4suga <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">bgcolor(\"v\u00e4rvi_nimetus\")<\/code>.<\/p>\r\n<p class=\"vspace\">Olgu meil \u00fclesandeks kirjutada programm, mis joonistab rohelise servaga punase ringi, punase servaga rohelise ruudu ning v\u00e4rvib \u00fclej\u00e4\u00e4nud tausta helesiniseks. Selleks, et ruutu ei joonistataks ringi peale, kasutame k\u00e4ske:<\/p>\r\n\r\n<ul>\r\n \t<li><code>up()<\/code> - t\u00f5sta pliiats \u00fcles;<\/li>\r\n \t<li><code>down()<\/code> - langeta pliiats vastu \"paberit\".<\/li>\r\n<\/ul>\r\nKilpkonn muudab pliiatsi v\u00e4rvi ja t\u00e4itev\u00e4rvi vastavalt k\u00e4skudega:\r\n<ul>\r\n \t<li><code>pencolor(\"v\u00e4rvi_nimetus\")<\/code> - muuda pliiatsi v\u00e4rvi;<\/li>\r\n \t<li><code>fillcolor(\"v\u00e4rvi_nimetus\")<\/code> - muuda t\u00e4itev\u00e4rvi.<\/li>\r\n<\/ul>\r\n<strong>N\u00e4iteprogramm. Ring ja ruut<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from turtle import *\r\n \r\ndef ruut(n):               # Defineerime funktsiooni ruudu joonistamiseks\r\n    i = 0\r\n    while (i &lt; 4):\r\n        fd(n)\r\n        lt(90)\r\n        i = i + 1\r\n \r\npencolor(\"#32CD32\")        # Kilpkonn muudab pliiatsi v\u00e4rvi laimiroheliseks\r\nfillcolor(\"red\")           # Kilpkonn muudab t\u00e4itev\u00e4rvi punaseks\r\nbegin_fill()               # Kilpkonn alustab ringi v\u00e4rvimist\r\ncircle(100)                # Kilpkonn joonistab ringi raadiusega 100 pikslit\r\nend_fill()                 # Kilpkonn l\u00f5petab ringi v\u00e4rvimise\r\n \r\nup()                       # Pliiats \u00fcles\r\nfd(300)                    # Kilpkonn liigub edasi 300 pikslit\r\nlt(90)                     # Kilpkonn p\u00f6\u00f6rab 90\u00b0 vasakule\r\nfd(50)\r\ndown()                     # Pliiats alla\r\n \r\npencolor(\"red\")            # Kilpkonn muudab pliiatsi v\u00e4rvi punaseks\r\nfillcolor(\"#32CD32\")       # Kilpkonn muudab t\u00e4itev\u00e4rvi laimiroheliseks\r\nbegin_fill()\r\nruut(100)                  # Kilpkonn joonistab ruudu k\u00fcljega 100 pikslit\r\nend_fill()\r\n \r\nbgcolor(\"pale turquoise\")  # Muudame taustav\u00e4rvi helesiniseks\r\n \r\nexitonclick()<\/pre>\r\n<h3>Hulknurkade joonistamine<\/h3>\r\n<p class=\"vspace\">Eelnevalt oleme vaadanud programme, mis joonistavad kilpkonnaga ruute v\u00f5i ringe. Kui me tahame, et kilpkonn oskaks luua ka teisi kujundeid, n\u00e4iteks korrap\u00e4raseid hulknurki, siis defineerime selleks vastava funktsiooni.<\/p>\r\n<p class=\"vspace\">Kirjutame alamprogrammi <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">hulknurk(n)<\/code>, mis joonistaks soovitud nurkade arvuga hulknurga. Selles funktsioonis on argumendiks <em>n<\/em> hulknurga nurkade arv. N\u00e4iteks viisnurga joonistamiseks anname argumendi <em>n<\/em> v\u00e4\u00e4rtuseks 5 (<code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">hulknurk(5)<\/code><\/code>). Selleks, et leida, mitme kraadi v\u00f5rra kilpkonn p\u00f6\u00f6rama peab, kasutame korrap\u00e4rase hulknurga sisenurga suuruse leidmiseks valemit <em>(n - 2) * 180 \/ n<\/em>, kus <em>n<\/em> on nurkade arv. Seej\u00e4rel lahutame saadud v\u00e4\u00e4rtuse sirgnurgast (180\u00b0). Kui valemit lihtsustada, siis saame <em>360 \/ n<\/em>.<\/p>\r\n\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">from turtle import *\r\ndef hulknurk(n):    \r\n    i = 0\r\n    nurk = 360 \/ n         # Arvutatakse kilpkonna p\u00f6\u00f6ramise nurga suurus\r\n    while (i &lt; n):\r\n        forward(100)\r\n        left(nurk)\r\n        i = i + 1\r\n \r\nhulknurk(5)\r\nexitonclick()<\/pre>\r\nT\u00e4iendame programmi, andes argumendiks ka k\u00fclje pikkuse. Siis on hulknurga funktsiooni argumentideks nurkade arv ja k\u00fclje pikkus: <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">hulknurk(n, k\u00fclg)<\/code><\/code>. N\u00e4iteks kuusnurga joonistamiseks, mille k\u00fclg on 150 pikslit, kirjutame <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">hulknurk(6, 150)<\/code><\/code>.\r\n\r\n<strong>N\u00e4iteprogramm. Hulknurk<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from turtle import *\r\n \r\n# Defineerime funktsiooni nimega hulknurk. Argumendid on nurkade arv ja k\u00fclje pikkus\r\ndef hulknurk(n, k\u00fclg):    \r\n    i = 0\r\n    nurk = 360 \/ n         # Arvutatakse kilpkonna p\u00f6\u00f6ramise nurga suurus\r\n    while (i &lt; n):\r\n        forward(k\u00fclg)\r\n        left(nurk)\r\n        i = i + 1\r\n \r\nfillcolor(\"green\")\r\nbegin_fill()\r\nhulknurk(6, 150)           # Kilpkonn joonistab rohelise korrap\u00e4rase kuusnurga k\u00fcljega 150 pikslit\r\nend_fill()\r\n \r\nfillcolor(\"red\")\r\nbegin_fill()\r\nhulknurk(7, 50)            # Kilpkonn joonistab punase korrap\u00e4rase seitsenurga k\u00fcljega 50 pikslit\r\nend_fill()\r\n \r\nexitonclick()<\/pre>\r\n<h3>Naerun\u00e4o joonistamine<\/h3>\r\nKirjutame programmi, mis joonistab naerun\u00e4o. Kui me ei soovi joonistada tervet ringjoont, vaid osa sellest, siis saame kasutada k\u00e4su <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">circle<\/code> kahe argumendiga v\u00e4ljakutset <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">circle(r, d)<\/code><\/code>. Selles k\u00e4sus t\u00e4histab <em>r<\/em> ringi raadiust ja <em>d<\/em> kesknurka kraadides. N\u00e4iteks kui soovime joonistada veerand ringjoonest raadiusega 100 pikslit, siis saame kasutada k\u00e4sku <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">circle(100, 90)<\/code><\/code>.\r\n\r\n<strong>N\u00e4iteprogramm. Naerun\u00e4gu<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from turtle import *\r\n \r\ndef silm():                # Defineerime funktsiooni silmade joonistamiseks     \r\n    pencolor(\"#000000\")\r\n    fillcolor(\"#FFFFFF\")\r\n    begin_fill()\r\n    circle(25)\r\n    end_fill()\r\n \r\npencolor(\"#000000\")        # Pea\r\nfillcolor(\"#FFFF00\")  \r\nbegin_fill()\r\ncircle(100)                 \r\nend_fill()\r\n \r\nup()                              \r\nbk(45)\r\nlt(90)\r\nfd(100)\r\nrt(90)\r\ndown()\r\n \r\nsilm()                     # Vasak silm\r\n \r\nup()                             \r\nfd(90)\r\ndown()\r\n \r\nsilm()                     # Parem silm\r\n \r\nup()                       # Suu\r\nbk(95)\r\nrt(90)\r\nfd(30)\r\ndown()\r\ncircle(50,180)             # Pool ringjoonest\r\nbgcolor(\"#AFEEEE\")\r\n \r\nexitonclick()<\/pre>\r\n<h2>T\u00e4he joonistamine<\/h2>\r\nKirjutame programmi, mis joonistab ette antud pikkuse ja v\u00e4rviga t\u00e4he. Defineerime kahe argumendiga funktsiooni <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">t\u00e4ht(pikkus, v\u00e4rv)<\/code><\/code>. N\u00e4iteks kollase t\u00e4he joonistamiseks pikkusega 100 pikslit kirjutame <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">t\u00e4ht(100, \"yellow\")<\/code>.\r\n\r\n<strong>N\u00e4iteprogramm. T\u00e4ht<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from turtle import *\r\n \r\n# Defineerime funktsiooni t\u00e4ht, mis joonistab valitud v\u00e4rvi ja pikkusega t\u00e4he\r\ndef t\u00e4ht(pikkus, v\u00e4rv):   \r\n    color(v\u00e4rv)\r\n    begin_fill()                 \r\n    i = 0\r\n    while (i &lt; 5):\r\n        fd(pikkus)\r\n        rt(144)\r\n        i = i + 1\r\n    end_fill()\r\n \r\nt\u00e4ht(100, \"yellow\")        # Kilpkonn joonistab kollase t\u00e4he pikkusega 100 pikslit\r\n \r\nexitonclick()<\/pre>\r\n<h3>Enesekontrolli \u00fclesanne (p\u00e4ikesevarjutus)<\/h3>\r\n<p class=\"vspace\">Kirjuta programm, mis joonistab kilpkonna abil t\u00e4ielikku p\u00e4ikesevarjutust imiteeriva pildi. Pildi taust v\u00f5iks olla musta v\u00f5i tumesinist v\u00e4rvi.<\/p>\r\n<p class=\"vspace\">Tulemus v\u00f5iks olla midagi sellist:<\/p>\r\n<img class=\"alignnone size-full wp-image-195\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/paikesevarjutus.png\" alt=\"\" width=\"296\" height=\"283\" \/>\r\n<h3>Veel kilpkonna v\u00f5imalustest<\/h3>\r\nKilpkonnaga tegutsemiseks on v\u00f5imalusi veelgi. L\u00e4hemalt saab uurida <em>Python<\/em>i <em>turtle<\/em> mooduli <a class=\"urllink\" href=\"https:\/\/docs.python.org\/3.6\/library\/turtle.html\" target=\"_blank\" rel=\"noopener\">dokumentatsioonist<\/a>, n\u00e4iteks kuidas muuta pliiatsi <a class=\"urllink\" href=\"https:\/\/docs.python.org\/3.6\/library\/turtle.html#turtle.pensize\" target=\"_blank\" rel=\"noopener\">paksust<\/a> v\u00f5i kilpkonna <a class=\"urllink\" href=\"https:\/\/docs.python.org\/3.6\/library\/turtle.html#turtle.shape\" target=\"_blank\" rel=\"noopener\">kuju<\/a>.\r\n<h2>Funktsioonid Tkinteriga<\/h2>\r\n<p class=\"vspace\">Varasemalt tegelesime graafikaga ka mooduli Tkinter abil. Siingi saame ise funktsioone defineerida. Teeme n\u00e4iteks programmi, millega saab kuusiku joonistada. Kuused koosnevad t\u00e4isnurksetest kolmnurkadest. Defineerime kolm funktsiooni.<\/p>\r\n\r\n<div class=\"vspace\"><\/div>\r\n<ul>\r\n \t<li>Funktsioon <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">joonista_tase<\/code> joonistab kuuse \u00fche taseme - t\u00e4isnurkse kolmnurga, mis on m\u00e4\u00e4ratud \u00fclatipu ja selle vastask\u00fclje pikkusega (taseme laius). Argumentideks on \u00fclatipu koordinaadid, laius ja v\u00e4rv.<\/li>\r\n \t<li>Funktsioon <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">joonista_kuusk<\/code> joonistab kuuse. Argumentideks on ladva koordinaadid, kuuse laius ja tasemete arv. Kui v\u00e4rvi ei m\u00e4rgita, siis vaikimisi joonistatakse roheline kuusk. Teistv\u00e4rvi kuuse tegemiseks tuleb v\u00e4rv ette anda, nt <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">joonista_kuusk(200, 50, 40, 4, \"red\")<\/code><\/code>.<\/li>\r\n \t<li>Funktsioon <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">joonista_mets<\/code><\/code> joonistab argumendina antud arvu kuuski. Iga kuuse asukoht, tasemete arv ja laius on teatud piirides juhuslikud.<\/li>\r\n<\/ul>\r\n<strong>N\u00e4iteprogramm. Kuusik<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from tkinter import *\r\nfrom random import *\r\n \r\ndef joonista_tase(\u00fclatipp_x, \u00fclatipp_y, laius, v\u00e4rv):\r\n    tahvel.create_polygon(\u00fclatipp_x, \u00fclatipp_y, \u00fclatipp_x + laius\/2, \u00fclatipp_y + laius\/2, \u00fclatipp_x - laius\/2,  \u00fclatipp_y + laius\/2, fill=v\u00e4rv, outline=v\u00e4rv)\r\n \r\ndef joonista_kuusk(ladva_x, ladva_y, laius, tasemeid, v\u00e4rv=\"green\"):\r\n    for tase in range(tasemeid):\r\n        joonista_tase(ladva_x, ladva_y + tase * laius\/3, laius, v\u00e4rv)\r\n \r\ndef joonista_mets(kuuskede_arv):\r\n    for tase in range(kuuskede_arv):\r\n        joonista_kuusk(randint(1, 600), randint(1, 200), randint(10, 30), randint(3, 5))\r\n \r\nraam = Tk()\r\n# nimeks Kuusik\r\nraam.title(\"Kuusik\")\r\n# loome tahvli laiusega 600px ja k\u00f5rgusega 300 px\r\ntahvel = Canvas(raam, width=600, height=300)\r\n \r\njoonista_mets(10)\r\njoonista_kuusk(200, 50, 40, 4, \"red\")\r\n \r\n# paigutame tahvli raami ja teeme n\u00e4htavaks\r\ntahvel.pack()\r\n# siseneme p\u00f5hits\u00fcklisse\r\nraam.mainloop()<\/pre>\r\n<h3>Video (miiniotsija)<\/h3>\r\nL\u00f5petuseks <a class=\"urllink\" href=\"http:\/\/www.uttv.ee\/naita?id=23552\" target=\"_blank\" rel=\"noopener\">video miiniotsija m\u00e4ngu tegemisest<\/a>.","rendered":"<h2>Kilpkonn \u00f5pib funktsioone<\/h2>\n<p class=\"vspace\">Varasemates osades oleme t\u00e4htsamate programmeerimise konstruktsioonidega (nt valikulause ja ts\u00fckliga) tutvumisel abiks v\u00f5tnud kilpkonna, et saada parem visuaalne ettekujutus. Kilpkonnagraafikas on meil l\u00e4bivaks teemaks olnud ruudu joonistamine, teeme seda ka funktsioone kasutades.<\/p>\n<p class=\"vspace\">Viimati kasutasime ruudu joonistamisel ts\u00fcklit:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">from turtle import *\r\n \r\ni = 0\r\nwhile i &lt; 4:               # Kilpkonn joonistab ts\u00fckli abil ruudu. Ts\u00fckli keha l\u00e4bitakse neli korda.\r\n    forward(100)\r\n    left(90)\r\n    i = i + 1              # Muutujat i suurendatakse \u00fche v\u00f5rra\r\n \r\nexitonclick()<\/pre>\n<p>Ruudu joonistamiseks v\u00f5ime defineerida funktsiooni, n\u00e4iteks nimega <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">ruut<\/code>. Loome selle esialgu ilma argumentideta:<\/p>\n<p><strong>N\u00e4iteprogramm. Ruut III<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from turtle import *\r\n \r\ndef ruut():                # Defineerime funktsiooni nimega ruut\r\n    i = 0\r\n    while (i &lt; 4):\r\n        forward(100)\r\n        left(90)\r\n        i = i + 1\r\n \r\nruut()                     # Kutsume funktsiooni ruut v\u00e4lja. Kilpkonn joonistab ruudu k\u00fcljega 100 pikslit\r\nright(45)                  # P\u00f6\u00f6rame paremale 45\u00b0\r\nruut()                     # Kutsume uuesti funktsiooni ruut v\u00e4lja\r\n \r\nexitonclick()<\/pre>\n<p class=\"vspace\">Selle n\u00e4iteprogrammi puhul joonistab kilpkonn alati ruudu, mille k\u00fclje pikkus on 100 pikslit. Selleks, et me saaksime muuta ruudu k\u00fclje pikkust vastavalt soovile, lisame funktsioonile <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">ruut<\/code> argumendi:<\/p>\n<p><strong>N\u00e4iteprogramm. Ruut IV<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from turtle import *\r\n \r\ndef ruut(k\u00fclg):            # Defineerime funktsiooni nimega ruut, mille argumendiks on ruudu k\u00fclje pikkus\r\n    i = 0\r\n    while (i &lt; 4):\r\n        forward(k\u00fclg)      # Siin kasutatakse argumenti\r\n        left(90)\r\n        i = i + 1\r\n \r\nruut(50)                   # Kilpkonn joonistab ruudu k\u00fcljega 50 pikslit\r\nruut(75)                   # Kilpkonn joonistab ruudu k\u00fcljega 75 pikslit\r\n \r\nexitonclick()<\/pre>\n<p>&nbsp;<\/p>\n<p class=\"vspace\">N\u00fc\u00fcd saab seda funktsiooni rakendades joonistada erineva suurusega ruute. N\u00e4iteks <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">ruut(50)<\/code><\/code> korral on argumendi v\u00e4\u00e4rtuseks 50 ja ruudu k\u00fclje pikkuseks tuleb 50. Kui argumendiks on 75 (<code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">ruut(75)<\/code><\/code>), siis tuleb k\u00fclje pikkuseks 75.<\/p>\n<h3>V\u00e4rvimine<\/h3>\n<p class=\"vspace\">Eelmine kord, kui kilpkonna k\u00e4sitlesime, olid vaatluse all ka v\u00e4rvimise v\u00f5imalused. Neid on tegelikult veelgi. N\u00e4iteks muudetakse pildi taustav\u00e4rvi k\u00e4suga <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">bgcolor(\"v\u00e4rvi_nimetus\")<\/code>.<\/p>\n<p class=\"vspace\">Olgu meil \u00fclesandeks kirjutada programm, mis joonistab rohelise servaga punase ringi, punase servaga rohelise ruudu ning v\u00e4rvib \u00fclej\u00e4\u00e4nud tausta helesiniseks. Selleks, et ruutu ei joonistataks ringi peale, kasutame k\u00e4ske:<\/p>\n<ul>\n<li><code>up()<\/code> &#8211; t\u00f5sta pliiats \u00fcles;<\/li>\n<li><code>down()<\/code> &#8211; langeta pliiats vastu &#8220;paberit&#8221;.<\/li>\n<\/ul>\n<p>Kilpkonn muudab pliiatsi v\u00e4rvi ja t\u00e4itev\u00e4rvi vastavalt k\u00e4skudega:<\/p>\n<ul>\n<li><code>pencolor(\"v\u00e4rvi_nimetus\")<\/code> &#8211; muuda pliiatsi v\u00e4rvi;<\/li>\n<li><code>fillcolor(\"v\u00e4rvi_nimetus\")<\/code> &#8211; muuda t\u00e4itev\u00e4rvi.<\/li>\n<\/ul>\n<p><strong>N\u00e4iteprogramm. Ring ja ruut<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from turtle import *\r\n \r\ndef ruut(n):               # Defineerime funktsiooni ruudu joonistamiseks\r\n    i = 0\r\n    while (i &lt; 4):\r\n        fd(n)\r\n        lt(90)\r\n        i = i + 1\r\n \r\npencolor(\"#32CD32\")        # Kilpkonn muudab pliiatsi v\u00e4rvi laimiroheliseks\r\nfillcolor(\"red\")           # Kilpkonn muudab t\u00e4itev\u00e4rvi punaseks\r\nbegin_fill()               # Kilpkonn alustab ringi v\u00e4rvimist\r\ncircle(100)                # Kilpkonn joonistab ringi raadiusega 100 pikslit\r\nend_fill()                 # Kilpkonn l\u00f5petab ringi v\u00e4rvimise\r\n \r\nup()                       # Pliiats \u00fcles\r\nfd(300)                    # Kilpkonn liigub edasi 300 pikslit\r\nlt(90)                     # Kilpkonn p\u00f6\u00f6rab 90\u00b0 vasakule\r\nfd(50)\r\ndown()                     # Pliiats alla\r\n \r\npencolor(\"red\")            # Kilpkonn muudab pliiatsi v\u00e4rvi punaseks\r\nfillcolor(\"#32CD32\")       # Kilpkonn muudab t\u00e4itev\u00e4rvi laimiroheliseks\r\nbegin_fill()\r\nruut(100)                  # Kilpkonn joonistab ruudu k\u00fcljega 100 pikslit\r\nend_fill()\r\n \r\nbgcolor(\"pale turquoise\")  # Muudame taustav\u00e4rvi helesiniseks\r\n \r\nexitonclick()<\/pre>\n<h3>Hulknurkade joonistamine<\/h3>\n<p class=\"vspace\">Eelnevalt oleme vaadanud programme, mis joonistavad kilpkonnaga ruute v\u00f5i ringe. Kui me tahame, et kilpkonn oskaks luua ka teisi kujundeid, n\u00e4iteks korrap\u00e4raseid hulknurki, siis defineerime selleks vastava funktsiooni.<\/p>\n<p class=\"vspace\">Kirjutame alamprogrammi <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">hulknurk(n)<\/code>, mis joonistaks soovitud nurkade arvuga hulknurga. Selles funktsioonis on argumendiks <em>n<\/em> hulknurga nurkade arv. N\u00e4iteks viisnurga joonistamiseks anname argumendi <em>n<\/em> v\u00e4\u00e4rtuseks 5 (<code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">hulknurk(5)<\/code><\/code>). Selleks, et leida, mitme kraadi v\u00f5rra kilpkonn p\u00f6\u00f6rama peab, kasutame korrap\u00e4rase hulknurga sisenurga suuruse leidmiseks valemit <em>(n &#8211; 2) * 180 \/ n<\/em>, kus <em>n<\/em> on nurkade arv. Seej\u00e4rel lahutame saadud v\u00e4\u00e4rtuse sirgnurgast (180\u00b0). Kui valemit lihtsustada, siis saame <em>360 \/ n<\/em>.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\">from turtle import *\r\ndef hulknurk(n):    \r\n    i = 0\r\n    nurk = 360 \/ n         # Arvutatakse kilpkonna p\u00f6\u00f6ramise nurga suurus\r\n    while (i &lt; n):\r\n        forward(100)\r\n        left(nurk)\r\n        i = i + 1\r\n \r\nhulknurk(5)\r\nexitonclick()<\/pre>\n<p>T\u00e4iendame programmi, andes argumendiks ka k\u00fclje pikkuse. Siis on hulknurga funktsiooni argumentideks nurkade arv ja k\u00fclje pikkus: <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">hulknurk(n, k\u00fclg)<\/code><\/code>. N\u00e4iteks kuusnurga joonistamiseks, mille k\u00fclg on 150 pikslit, kirjutame <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">hulknurk(6, 150)<\/code><\/code>.<\/p>\n<p><strong>N\u00e4iteprogramm. Hulknurk<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from turtle import *\r\n \r\n# Defineerime funktsiooni nimega hulknurk. Argumendid on nurkade arv ja k\u00fclje pikkus\r\ndef hulknurk(n, k\u00fclg):    \r\n    i = 0\r\n    nurk = 360 \/ n         # Arvutatakse kilpkonna p\u00f6\u00f6ramise nurga suurus\r\n    while (i &lt; n):\r\n        forward(k\u00fclg)\r\n        left(nurk)\r\n        i = i + 1\r\n \r\nfillcolor(\"green\")\r\nbegin_fill()\r\nhulknurk(6, 150)           # Kilpkonn joonistab rohelise korrap\u00e4rase kuusnurga k\u00fcljega 150 pikslit\r\nend_fill()\r\n \r\nfillcolor(\"red\")\r\nbegin_fill()\r\nhulknurk(7, 50)            # Kilpkonn joonistab punase korrap\u00e4rase seitsenurga k\u00fcljega 50 pikslit\r\nend_fill()\r\n \r\nexitonclick()<\/pre>\n<h3>Naerun\u00e4o joonistamine<\/h3>\n<p>Kirjutame programmi, mis joonistab naerun\u00e4o. Kui me ei soovi joonistada tervet ringjoont, vaid osa sellest, siis saame kasutada k\u00e4su <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">circle<\/code> kahe argumendiga v\u00e4ljakutset <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">circle(r, d)<\/code><\/code>. Selles k\u00e4sus t\u00e4histab <em>r<\/em> ringi raadiust ja <em>d<\/em> kesknurka kraadides. N\u00e4iteks kui soovime joonistada veerand ringjoonest raadiusega 100 pikslit, siis saame kasutada k\u00e4sku <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">circle(100, 90)<\/code><\/code>.<\/p>\n<p><strong>N\u00e4iteprogramm. Naerun\u00e4gu<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from turtle import *\r\n \r\ndef silm():                # Defineerime funktsiooni silmade joonistamiseks     \r\n    pencolor(\"#000000\")\r\n    fillcolor(\"#FFFFFF\")\r\n    begin_fill()\r\n    circle(25)\r\n    end_fill()\r\n \r\npencolor(\"#000000\")        # Pea\r\nfillcolor(\"#FFFF00\")  \r\nbegin_fill()\r\ncircle(100)                 \r\nend_fill()\r\n \r\nup()                              \r\nbk(45)\r\nlt(90)\r\nfd(100)\r\nrt(90)\r\ndown()\r\n \r\nsilm()                     # Vasak silm\r\n \r\nup()                             \r\nfd(90)\r\ndown()\r\n \r\nsilm()                     # Parem silm\r\n \r\nup()                       # Suu\r\nbk(95)\r\nrt(90)\r\nfd(30)\r\ndown()\r\ncircle(50,180)             # Pool ringjoonest\r\nbgcolor(\"#AFEEEE\")\r\n \r\nexitonclick()<\/pre>\n<h2>T\u00e4he joonistamine<\/h2>\n<p>Kirjutame programmi, mis joonistab ette antud pikkuse ja v\u00e4rviga t\u00e4he. Defineerime kahe argumendiga funktsiooni <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">t\u00e4ht(pikkus, v\u00e4rv)<\/code><\/code>. N\u00e4iteks kollase t\u00e4he joonistamiseks pikkusega 100 pikslit kirjutame <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">t\u00e4ht(100, \"yellow\")<\/code>.<\/p>\n<p><strong>N\u00e4iteprogramm. T\u00e4ht<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from turtle import *\r\n \r\n# Defineerime funktsiooni t\u00e4ht, mis joonistab valitud v\u00e4rvi ja pikkusega t\u00e4he\r\ndef t\u00e4ht(pikkus, v\u00e4rv):   \r\n    color(v\u00e4rv)\r\n    begin_fill()                 \r\n    i = 0\r\n    while (i &lt; 5):\r\n        fd(pikkus)\r\n        rt(144)\r\n        i = i + 1\r\n    end_fill()\r\n \r\nt\u00e4ht(100, \"yellow\")        # Kilpkonn joonistab kollase t\u00e4he pikkusega 100 pikslit\r\n \r\nexitonclick()<\/pre>\n<h3>Enesekontrolli \u00fclesanne (p\u00e4ikesevarjutus)<\/h3>\n<p class=\"vspace\">Kirjuta programm, mis joonistab kilpkonna abil t\u00e4ielikku p\u00e4ikesevarjutust imiteeriva pildi. Pildi taust v\u00f5iks olla musta v\u00f5i tumesinist v\u00e4rvi.<\/p>\n<p class=\"vspace\">Tulemus v\u00f5iks olla midagi sellist:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-195\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/paikesevarjutus.png\" alt=\"\" width=\"296\" height=\"283\" srcset=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/paikesevarjutus.png 296w, https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/paikesevarjutus-65x62.png 65w, https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/paikesevarjutus-225x215.png 225w\" sizes=\"auto, (max-width: 296px) 100vw, 296px\" \/><\/p>\n<h3>Veel kilpkonna v\u00f5imalustest<\/h3>\n<p>Kilpkonnaga tegutsemiseks on v\u00f5imalusi veelgi. L\u00e4hemalt saab uurida <em>Python<\/em>i <em>turtle<\/em> mooduli <a class=\"urllink\" href=\"https:\/\/docs.python.org\/3.6\/library\/turtle.html\" target=\"_blank\" rel=\"noopener\">dokumentatsioonist<\/a>, n\u00e4iteks kuidas muuta pliiatsi <a class=\"urllink\" href=\"https:\/\/docs.python.org\/3.6\/library\/turtle.html#turtle.pensize\" target=\"_blank\" rel=\"noopener\">paksust<\/a> v\u00f5i kilpkonna <a class=\"urllink\" href=\"https:\/\/docs.python.org\/3.6\/library\/turtle.html#turtle.shape\" target=\"_blank\" rel=\"noopener\">kuju<\/a>.<\/p>\n<h2>Funktsioonid Tkinteriga<\/h2>\n<p class=\"vspace\">Varasemalt tegelesime graafikaga ka mooduli Tkinter abil. Siingi saame ise funktsioone defineerida. Teeme n\u00e4iteks programmi, millega saab kuusiku joonistada. Kuused koosnevad t\u00e4isnurksetest kolmnurkadest. Defineerime kolm funktsiooni.<\/p>\n<div class=\"vspace\"><\/div>\n<ul>\n<li>Funktsioon <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">joonista_tase<\/code> joonistab kuuse \u00fche taseme &#8211; t\u00e4isnurkse kolmnurga, mis on m\u00e4\u00e4ratud \u00fclatipu ja selle vastask\u00fclje pikkusega (taseme laius). Argumentideks on \u00fclatipu koordinaadid, laius ja v\u00e4rv.<\/li>\n<li>Funktsioon <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">joonista_kuusk<\/code> joonistab kuuse. Argumentideks on ladva koordinaadid, kuuse laius ja tasemete arv. Kui v\u00e4rvi ei m\u00e4rgita, siis vaikimisi joonistatakse roheline kuusk. Teistv\u00e4rvi kuuse tegemiseks tuleb v\u00e4rv ette anda, nt <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">joonista_kuusk(200, 50, 40, 4, \"red\")<\/code><\/code>.<\/li>\n<li>Funktsioon <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">joonista_mets<\/code><\/code> joonistab argumendina antud arvu kuuski. Iga kuuse asukoht, tasemete arv ja laius on teatud piirides juhuslikud.<\/li>\n<\/ul>\n<p><strong>N\u00e4iteprogramm. Kuusik<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from tkinter import *\r\nfrom random import *\r\n \r\ndef joonista_tase(\u00fclatipp_x, \u00fclatipp_y, laius, v\u00e4rv):\r\n    tahvel.create_polygon(\u00fclatipp_x, \u00fclatipp_y, \u00fclatipp_x + laius\/2, \u00fclatipp_y + laius\/2, \u00fclatipp_x - laius\/2,  \u00fclatipp_y + laius\/2, fill=v\u00e4rv, outline=v\u00e4rv)\r\n \r\ndef joonista_kuusk(ladva_x, ladva_y, laius, tasemeid, v\u00e4rv=\"green\"):\r\n    for tase in range(tasemeid):\r\n        joonista_tase(ladva_x, ladva_y + tase * laius\/3, laius, v\u00e4rv)\r\n \r\ndef joonista_mets(kuuskede_arv):\r\n    for tase in range(kuuskede_arv):\r\n        joonista_kuusk(randint(1, 600), randint(1, 200), randint(10, 30), randint(3, 5))\r\n \r\nraam = Tk()\r\n# nimeks Kuusik\r\nraam.title(\"Kuusik\")\r\n# loome tahvli laiusega 600px ja k\u00f5rgusega 300 px\r\ntahvel = Canvas(raam, width=600, height=300)\r\n \r\njoonista_mets(10)\r\njoonista_kuusk(200, 50, 40, 4, \"red\")\r\n \r\n# paigutame tahvli raami ja teeme n\u00e4htavaks\r\ntahvel.pack()\r\n# siseneme p\u00f5hits\u00fcklisse\r\nraam.mainloop()<\/pre>\n<h3>Video (miiniotsija)<\/h3>\n<p>L\u00f5petuseks <a class=\"urllink\" href=\"http:\/\/www.uttv.ee\/naita?id=23552\" target=\"_blank\" rel=\"noopener\">video miiniotsija m\u00e4ngu tegemisest<\/a>.<\/p>\n","protected":false},"author":12,"menu_order":4,"template":"","meta":{"pb_show_title":"on","pb_short_title":"","pb_subtitle":"","pb_authors":[],"pb_section_license":""},"chapter-type":[],"contributor":[],"license":[],"class_list":["post-192","chapter","type-chapter","status-publish","hentry"],"part":166,"_links":{"self":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/192","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters"}],"about":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/types\/chapter"}],"author":[{"embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/users\/12"}],"version-history":[{"count":5,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/192\/revisions"}],"predecessor-version":[{"id":432,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/192\/revisions\/432"}],"part":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/parts\/166"}],"metadata":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/192\/metadata\/"}],"wp:attachment":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/media?parent=192"}],"wp:term":[{"taxonomy":"chapter-type","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapter-type?post=192"},{"taxonomy":"contributor","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/contributor?post=192"},{"taxonomy":"license","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/license?post=192"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}