Peilaus pisteen ja suoran suhteen Pythonin Turtle moduulilla (Opettajan ohje) TAVOITTEET Tämän kokonaisuuden tavoitteena on tutustuttaa oppilaat Pythonilla ohjelmointiin ja erityisesti Turtle moduulin käyttöön koodauksessa. Näissä harjoituksissa Pythonilla ohjelmointia lähestytään aikaisemmilla matematiikan oppitunneilla käsitellyn pisteen ja suoran suhteen peilaamisen avulla. Tehtävät voi tehdä joko opettajajohtoisesti niin, että oppilaat tekevät opettajan perässä tehtävät tai jakaa oppilaille liitteenä olevan ohjeistuksen itsenäistä työskentelyä varten. Tehtävät on myös suunniteltu muokattaviksi. Opettaja voi halutessaan valita mitä tehtäviä tehdään ja millä tavalla tehtäviä lähestytään. Tehtävänantoja muokkaamalla opettaja voi myös hyvin käyttää materiaalia eriyttämiseen; kokeneemmille ohjelmoijille opettaja voi tarjota avoimempia tehtävänantoja, siinä missä aloittelijan kanssa voidaan käsitellä tehtäviä perusteellisemman ohjeistuksen/tehtävänannon kautta. Ennen kuin ryhdytään opiskelemaan Pythonilla koodaamista, oppilaiden olisi hyvä tarvittaessa palauttaa mieleen pisteen ja suoran suhteen peilaaminen koordinaatistossa kynän ja paperin avulla. Pythonin Turtle moduulilla piirtämisessä on käytössä koordinaatisto, jota hyödynnetään ohjelmoinnissa. Ohjelmoinnin toteuttaminen alussa kynän ja paperin avulla voi auttaa oppilaita ymmärtämään mihin tuleva ohjelmointi perustuu syvällisemmällä tasolla. Tässä dokumentissa annettujen kynä-paperiharjoitusten lisäksi opettaja voi halutessaan pyytää oppilaita tekemään lisäharjoituksena parityön, jonka aikana oppilaat ohjeistavat toisiaan piirtämään monikulmioita ja niiden peilikuvia vaihe vaiheelta koordinaatistoon. Tällaisen ei-tietokoneavusteisen ouhelmointi harjoituksen tavoitteena olisi auttaa ja valmistaa oppilaita tuleviin koodausharjoituksiin, ohjelmointiin ja algoritmiseen ajatteluun. Alkuharjoituksen jälkeen aloitetaan ohjelmoinnin opiskelu Python-ohjelmointikielellä. Tämän harjoituksen aikana Pythonista tulee tutuksi muuttujien käyttö, toistorakenne sekä funktiot ja niiden käyttö sekä turtle moodulilla piirtäminen. Näihin toimintoihin tutustutaan piirtämällä monikulmioita, merkitsemällä peilauspisteitä ja luomalla pisteen ja suoran suhteen peilaavia koodeja. Tehtävät voi tehdä esimerkiksi trinket.io verkkosivuston Python-alustalla. ALKUHARJOITUS Kynän ja paperin avulla peilaaminen koordinaatistossa Nämä tehtävät voi teettää oppilailla, mikäli heillä on tarvetta kertaukselle peilauksesta. a) Peilaa pisteen (0,0) suhteen koordinaatistossa sijaitseva
- neliö, jonka kärkipisteet ovat (1,1), (1,5), (5,5) ja (5,1) - suorakulmainen kolmio, jonka kärkipisteet ovat (-1,1), (-5,1) ja (-5,5). b) Peilaa y-akselin ja x-akselin suhteen koordinaatistossa sijaitseva - neliö, jonka kärkipisteet ovat (1,1), (1,5), (5,5) ja (5,1). - suorakulmainen kolmio, jonka kärkipisteet ovat (-1,1), (-5,1) ja (-5,5). c) Parityö: annetaan oppilaille eri monikulmioita koordinaatistossa. Oppilaiden tulee ohjeistaa toisiaan piirtämään monikulmiot koordinaatistoon. He voivat myös kokeilla ohjeistaa paria peilaamaan kuvion, jonkin pisteen tai suoran suhteen. Tässä tehtävässä oppilaiden tulee välttää laajoja ilmaisuja, kuten: piirrä monikulmio, jonka kärkipisteet ovat, vaan oppilaiden tulee tarkemmin ohjeistaa toisiaan, kuten: mene pisteeseen..., käänny oikealle astetta jne. OHJELMOINTI PYTHONILLA Aloitetaan Python-ohjelman käyttö Turtle-moduulin lisäämisellä. Jotta saadaan Turtle moduuli käyttöön, täytyy se tuoda ohjelmalle kirjoittamalla alkuun komento: import turtle Seuraavaksi luodaan konna niminen turtle muuttuja, jota liikuttamalla kuvioita voidaan piirtää: konna = turtle.turtle() konna.shape("turtle") Tässä konnaa käytetään aina, kun halutaan piirtää kyseisellä objektilla. Shape komento antaa konnalle näkyvän kilpikonnamaisen muodon. Turtlella piirtäminen Tässä osassa harjoitellaan säännöllisten monikulmioiden piirtämistä Pythonilla. Säännöllisen monikulmion piirtämisessä Pythonilla keskeistä on aloituspiste (x,y), sivun pituus sekä kulman suuruus. Pythonissa kukin komento tulee kirjoittaa omalle rivilleen ja ohjelma käy komentoja läpi rivi riviltä. Harjoituksissa konnalle riittää käytettäväksi seuraavat komennot: konna.forward(pituus) liikuttaa konnaa eteenpäin annetun pituuden verran konna.left(kulma) kääntää konnaa vasemmalle annetun kulman verran konna.right(kulma) kääntää konnaa oikealle asteina annetun kulman verran konna.setheading(kulma) asettaa konnan osoittamaan kulman suuntaan 0 suunnan osoittaessa oikealle konna.goto(x, y) liikuttaa konnan annettuihin x ja y koordinaatteihin aloittaa piirtämisen
konna.stamp() lopettaa piirtämisen leimaa konnan kuvan koordinaatistoon senhetkiseen sijaintiin Ylläolevissa komennoissa pituus, kulma, x ja y voidaan korvata luvuilla, laskutoimituksilla tai pitää muuttujina, joihin on sijoitettu lukuarvo kuten alla: kulma = 45 x = -100 y = 50 Trinketissä Turtle-moduulin koordinaatiston yksi pikseli ruudulla vastaa yhtä kokonaislukua, joten kannattaa käyttää suurehkoja (20-100) lukuja liikuttaessa, jotta piirrosjälki on havaittavissa. Trinketissä koko piirtoalue on 400 pikseliä (-200 200) leveä ja korkea origon (piste (0, 0)) ollessa keskellä. H1. Monikulmioiden piirtämistä Aloitetaan piirtämällä erilaisia säännölisiä monikulmioita. Ohessa tehtävät sekä kysymyksiä, joita oppilaille voi esittää samalla. a) Tee komentosarja, joka ohjaa konnan piirtämään neliön piirtoalueelle. - Mihin suuntaan konna aloittaa liikkumisen, jossei sitä alussa käännetä? b) Liikuta konna johonkin muuhun kohtaan piirtoaluetta ja ohjaa se piirtämään kolmio. c) Piirrä myös tasasivuinen viisikulmio eri kohtaan piirtoaluetta. - Kuinka tiedät miten paljon konnaa pitää kääntää, jotta saat oikean kuvion piirrettyä? - Mitä hyötyä stamp komennosta voisi olla koodia kirjoittaessa? - Kiinnitä huomiota koodin rakenteeseen ja toistuvuuteen. Mitä huomaat? Ohessa esimerkkiratkaisut tehtäviin. Koodin voi suoraan kopioida. Merkillä # alkavat rivit ovat kommentteja joita Pythonin kääntäjä ei lue osaksi itse koodia. import turtle konna = turtle.turtle() konna.shape("turtle") # a) Piirretään neliö, jonka alkupisteenä on origo (0,0) konna.left(90) konna.left(90)
konna.left(90) # b) Piirretään tasasivuinen kolmio aloittaen kohdasta (100,100). # Käytetään penup() komentoa ennen siirtoa ja # pendown() siirron jälkeen, jottei siirto piirrä viivaa konna.goto(100, 100) konna.right(360/3) konna.right(360/3) # c) Piirretään säännöllinen viisikulmio eri kohtaan konna.goto(100, -100) konna.left(360/5) konna.left(360/5) konna.left(360/5) konna.left(360/5) Huomioitavaa: Tyypillinen virhe saattaa syntyä käännöksen kulman suuruuden määrittämisen kanssa. Huomioitavaa on, ettei kulman käännössuuruus asteissa ole sama kuin säännöllisen monikulmion yhden kulman asteen suuruus. Tätä voi tarvittaessa lähestyä kynä-paperiesimerkin avulla piirtämällä: monikulmion sisäkulma verrattuna käännöskulmaan.) Lisäesimerkkinä tarvittaessa säännöllisen seitsemänkulmion piirtäminen:
Huomataan, että säännöllisten monikulmioiden piirtämisessä forward(pituus)- ja left(kulma)- tai right(kulma)-komennot toistuvat useamman kerran. Komennot toistuvat yhtä monta kertaa kuin kulmia on, mikäli konnan halutaan osoittavan aloitussuuntaan piirron lopussa, kuten ylläolevassa seitsemänkulmiossa. Pythonin avulla tämä toisto voidaan kirjoittaa lyhyemmin toistolla, johon tutustutaan seuraavaksi. Toisto Yksi tapa toistaa komentoja Pythonissa on seuraavanlainen: # Luodaan muuttuja toistojen määrälle, joka vastaa kulmien # määrää harjoituksissa. toistomaara = 4 for i in range(0, toistomaara ): toistettava koodi sisennettynä Tämä toistaa kaksoispisteen jälkeisen sisennetyt koodirivit toistomaara muuttujalle annetun arvon kertoja. Huomaa, että Python koodissa ei kannata käyttää ääkkösiä. H2. Monikulmion piirtäminen toistorakenteella Tehdään puhtaalle alustalle aiempia kuvioita toistorakennetta hyödyntäen: a) Kirjoita toistorakenne, joka piirtää neliön, jonka sivun pituus on 50 mutta sijoita tällä kertaa sivun pituus omaan muuttujaansa. b) Kirjoita toistorakenne, joka piirtää eri kohtaan säännöllisen seitsemänkulmion, jolla on sama sivun pituus kuin aiemmalla neliöllä. - Miten saatiinkaan laskettua käännöksen suuruus eri säännöllisillä monikulmioilla? Esimerkkiratkaisu: import turtle konna = turtle.turtle() konna.shape("turtle") # a) Neliö toistolla toistomaara = 4 # muuttuja kulmien määrälle pituus = 50 # muuttuja sivun pituudelle for i in range(0, toistomaara ): konna.forward( pituus )
konna.left(360/ toistomaara ) # b) Säännöllinen seitsemänkulmio toistolla. # Huomaa, että pituus muuttujaa ei tarvitse asettaa, # jos se on jo aiemmin kirjoitettu ja sillä on haluttu arvo toistomaara = 7 # vaihdetaan toistomäärä kulmien määräksi konna.goto(-100,-100) for i in range(0, toistomaara ): konna.forward( pituus ) konna.left(360/ toistomaara ) Tähän mennessä on opittu tuomaan Pythoniin Turtle-moduuli, piirtämään sillä eri kohtiin säännöllisiä monikulmioita toistorakenteella ja ilman. Seuraavaksi tutustutaan funktio-toimintoon, jonka avulla piirretään säännöllinen monikulmio, jota voidaan kutsua myöhemmin peilatessa. Toistorakenteen tavoin funktion käyttäminen yksinkertaistaa koodia. Funktio Funktiot ovat aliohjelmia, joita voidaan kutsua koodissa suorittamaan toimintonsa annetuilla argumenteilla tai ilman, jos funktio ei niitä hyödynnä. Pythonissa funktioita voidaan luoda seuraavasti : def funktio( argumentti1, argumentti2 ): funktion koodia sisennettynä Esimerkiksi funktio, joka piirtää konnalla halutun pituisen suoran viivan olisi seuraavanlainen: def viiva( pituus ): konna.forward( pituus ) Funktion kutsuminen (eli tässä viivan piirtäminen) ohjelmakoodissa tapahtuu seuraavasti: viiva(100) # Kirjoitetaan funktion nimi ja sulkeisiin haluttu lukuarvo # (tässä tapauksessa viivan pituus). H3. Piirto funktiolla Hyödynnetään aiemmin opittua monikulmioita piirtävän funktion luonnissa.
a) Luo funktio monikulmio( x, y, pituus, kulmia ), joka piirtää säännöllisen monikulmion niin, että sille määrätään argumenteilla monikulmion sijaintia varten aloituskoordinaatit, sivun pituus sekä kulmien määrä. - Mitä tehtiinkään H1:ssä (aloituspisteen siirto) ja H2:ssa (toisto)? - Millä komennolla saadaan siirrettyä konnan minne halutaan koordinaatistossa ennen monikulmion piirtoa? - Stamp komennolla voidaan helpottaa virheiden etsintää ratkaisussa. - Muistetaan nostaa kynä, kun ei haluta piirtää ja laskea ennen piirron aloitusta. b) Testaa funktion toimivuutta kutsumalla sitä komennoilla : monikulmio(-100, -100, 30, 3) monikulmio(-100, 100, 40, 4) monikulmio(100, 100, 50, 5) monikulmio(100, -100, 20, 6) Esimerkkiratkaisu: import turtle konna = turtle.turtle() konna.shape("turtle") def monikulmio( x, y, pituus, kulmia ): # Nostetaan kynä ennen siirtoa konna.goto( x, y ) # Siirrytään kohtaan (x,y) # Lasketaan kynä piirtämistä varten for i in range(0, kulmia ): # H2 toistorakenne konna.forward( pituus ) # Huomaa toinen sisennys konna.left(360/ kulmia ) # Huomaa, ettei funktiota käytettäessä tarvitse toistorakenteen # muuttujia määrittellä ennalta vaan ne annetaan funktiota # kutsuttaessa. Ajetaan testit: monikulmio(-100, -100, 30, 3) monikulmio(-100, 100, 40, 4) monikulmio(100, 100, 50, 5) monikulmio(100, -100, 20, 6) Nyt osataan piirtää erilaisia säännöllisiä monikulmioita eri kohtiin kutsumalla funktiota komennolla: monikulmio( x, y, pituus, kulma ), johon syötämme x:n ja y:n paikalle piirron aloituspisteen koordinaatit, pituuden paikalle halutun sivun pituuden sekä kulmien paikalle kulmien määrän. Siirrytään seuraavaksi peilauksen pariin.
H4. Peilauspisteelle funktio Jatketaan H3:n pohjalta. Luodaan peilauspisteelle oma funktio joka piirtää sen pienenä + merkkinä. Kirjoitetaan se koodiin monikulmion funktion määrittelyn edelle. def peilauspiste( px, py ): konna.goto( px -5, py ) konna.goto( px +5, py ) konna.goto( px, py -5) konna.goto( px, py +5) konna.goto(0,0) # Tämä komento piirtäisi peilauspisteen kohtaan (0,0) peilauspiste(0,0) - Kuinka peilauspisteen funktiota kutsutaan? - Mitä tekevät muuttujat px ja py? - Lue peilauspisteen koodi rivi kerrallaan parillesi mitä kussakin kohdassa on tehty? H5. Peilaus pisteen suhteen Nyt on olemassa funktiot monikulmion piirtämiselle sekä peilauspisteelle, joten voidaan siirtyä peilaukseen pisteen suhteen. Tämän tehtävän viimeinen osio on selvästi haastavampi kuin aiemmat tehtävät. Jatketaan H4:stä ja luodaan apumuuttujat joita tarvitaan myöhemmin peilauksessa ja piirretään peilauspiste origoon funktiolla. Harjoitellaan kuitenkin ensin peilausta ilman monikulmion funktiota: a) Luo seuraavat muuttujat ja anna niille annetut arvot: px = 0, py = 0, x = -100, y = 50, kulmia = 6 ja pituus = 40 b) Piirrä peilauspiste pisteeseen (px,py) sen funktiota käyttäen c) Piirrä neliö, joka kulkee pisteiden (10,10), (10,50), (50,50) ja (50,10) kautta. Piirrä neliölle peilikuva peilauspisteen suhteen. (Huom! Palauta mieleen, kuinka piirsit peilikuvia kynällä ja paperilla. Mistä pisteestä lähdet piirtämään peilikuvaa? Millä komennolla saat pirrettyä viivan kahden pisteen välille?) d) Piirrä suorakulmainen kolmio, jonka kärkipisteet ovat (-10,10), (-50,10) ja (-50,50). Piirrä tälle kolmiolle peilikuva peilauspisteen suhteen. e) Piirrä H3:n funktiota käyttäen säännöllinen monikulmio käyttäen a) kohdassa luotuja muuttujia x, y, kulmia ja pituus. f) Piirrä monikulmion peilikuva peilauspisteen suhteen.
Esimerkkiratkaisu: - Saatko koodisi toimimaan toistorakennetta käyttäen niin, että monikulmio peilautuu minkä tahansa peilauspisteen sijainnin suhteen? - Entä peilautuuko kuvio oikein, jos muutat monikulmion kulmien määrää? import turtle konna = turtle.turtle() konna.shape("turtle") # Täydennä H4:n funktio def peilauspiste( px, py ):.. # Täydennä H3:n funktio def monikulmio( x, y, pituus, kulmia ):.. # a) px = 0 py = 0 x = -100 y = 50 kulmia = 6 pituus = 40 # b) peilauspiste( px, py ) # c) konna.goto(10, 10) konna.goto(10, 50) konna.goto(50, 50) konna.goto(50, 10) konna.goto(10, 10) # c) peilikuva konna.goto(-10,-10) konna.goto(-10, -50) konna.goto(-50, -50) konna.goto(-50, -10) konna.goto(-10, -10) # d) konna.goto(-10,10) konna.goto(-50,10)
konna.goto(-50,50) konna.goto(-10,10) # d) peilikuva konna.goto(10,-10) konna.goto(50,-10) konna.goto(50,-50) konna.goto(10,-10) # e) monikulmio( x, y, pituus, kulmia ) # f) Tämä ratkaisu piirtyy oikein eri # monikulmioilla sekä peilauspisteillä konna.goto( px +( px - x ), py +( py - y )) # Mitä tässä tapahtuu? konna.left(180) # Miksi käännytään? for i in range(0, kulmia ): konna.forward( pituus ) konna.left(360/ kulmia ) H6. Peilaus suoran suhteen Tämä tehtävä on vielä astetta haastavampi kuin edellinen. Aloitetaan uusi trinketti/projekti ja kopioidaan siihen allaoleva koodi. Täydennetään koodin alkuun H3:ssa tehty monikulmioiden piirtämisen funktio. Tämän jälkeen ohjataan konna piirtämään kuvion peilikuva suoran suhteen ohjelmakoodin loppuun. - Kuinka saat peilattua yhden pisteen suoran suhteen? Olisiko jostakin annetusta funktiosta hyötyä? - Saatko piirrettyä kuvion tästä peilatusta pisteestä lähtien? Ota huomioon mihin suuntaan konna osoittaa milloinkin. - Saatko peilauksen toimimaan riippumatta monikulmion kulmien määrästä? - Saatko peilauksen toimimaan riippumatta peilaussuoran kulmasta? Kokeile vaikka 45 ja 0. # tuodaan ohjelman käytettäväksi tarvittavat moduulit import turtle import math # Täydennä tähän H3:ssa tehty monikulmioiden piirtofunktio
def monikulmio( x, y, pituus, kulmia ): # tämä funktio piirtää origon (0, 0) kautta kulkevan suoran, # joka on argumenttina annetussa kulmassa vaakatasoon nähden def peilaussuora( kulma ): konna.goto(0, 0) konna.left( kulma ) konna.forward(200) konna.left(180) konna.forward(400) konna.goto(0, 0) konna.setheading(0) # tällä funktiolla voidaan laskea annetuissa x ja y # koordinaateissa olevan pisteen etäisyys peilaussuorasta def pisteenetaisyyssuorasta( x, y, kulma ): k = math.tan( kulma /180*math.pi) return abs( y -k* x )/math.sqrt(1+ k * k ) # Pääohjelma alkaa tässä ja siinä piirretään tehtävänanto # halutuilla arvoilla. konna = turtle.turtle() konna.shape("turtle") kulma = 90 # peilaussuoran kulma (0-90 astetta) x = -100 # monikulmion kulman x koordinaatti y = 50 # monikulmion kulman y koordinaatti kulmia = 4 # monikulmion kulmien määrä pituus = 40 # monikulmion sivun pituus peilaussuora( kulma ) monikulmio( x, y, pituus, kulmia ) konna.goto(0, 0) # viedään konna alkupisteeseen ja konna.setheading(0) # käännetään alkusuuntaan # Kirjoita alle koodisi, jolla saat konnan piirtämään # monikulmion peilikuvan peilaussuoran suhteen. # Toimiiko ratkaisusi eri monikulmioilla sekä peilaussuorilla? # Stamp komennolla voit helpommin etsiä virheitä # omassa ratkaisussasi. Esimerkkiratkaisu (toimii kun peilaussuora on välillä 0 90 astetta): konna.goto( x, y ) konna.right(90- kulma ) konna.forward(2*pisteenetaisyyssuorasta( x, y, kulma )) konna.right(90- kulma ) konna.right(180) for i in range(0, kulmia ): konna.forward( pituus )
konna.right(360/ kulmia ) konna.hideturtle() Ratkaisussa mennään ensin monikulmion piirron aloituspisteeseen (x, y), käännytään kohti peilaussuoraa ja liikutaan kaksi kertaa pisteen etäisyyden verran suoraa päin, jolloin päädytään peilauspisteeseen (rivit 1-3). Sitten tehdään korjauskäännöksiä (4-5), jotta konna osoittaa oikeaan suuntaan toistolla tehtävää monikulmion piirtoa varten (6-9).