Peilaus pisteen ja suoran suhteen Pythonin Turtle moduulilla ALKUHARJOITUS Kynän ja paperin avulla peilaaminen koordinaatistossa 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). OHJELMOINTI PYTHONILLA Tässä harjoituksessa opiskellaan Pythonin turtle moduulin käyttöä palauttamalla mieleen kappaleiden peilausta suoran suhteen koordinaatistossa. Tehtävän tekoon suositellaan käytettävksi trinket.io verkkosivuston python alustaa. Jotta saisimme turtle moduulin käyttöön, täytyy se tuoda ohjelmalle kirjoittamalla alkuun komento: import turtle Luodaan seuraavaksi konna jota liikuttamalla kuvioita voidaan piirtää: konna = turtle.turtle() konna.shape("turtle") Tässä piirtämisen tekevälle muuttujalle on annettu nimeksi konna ja tätä nimeä käytetään aina, kun halutaan piirtää kyseisellä objektilla. Shape antaa konnalle näkyvän kilpikonnamaisen muodon. Turtlella piirtäminen Pythonissa kukin komento tulee kirjoittaa omalle rivilleen ja ohjelma käy komentoja läpi rivi riviltä. Näissä harjoituksissa konnalle riittää käytettäväksi seuraavat komennot: konna.forward(pituus) konna.left(kulma) konna.right(kulma) liikuttaa konnaa eteenpäin annetun pituuden verran kääntää konnaa vasemmalle annetun kulman verran 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 konna.pendown() aloittaa piirtämisen lopettaa piirtämisen konna.stamp() leimaa konnan kuvan koordinaatistoon senhetkiseen sijaintiin Ylläolevissa komennoissa luku, kulma, x ja y voidaan korvata luvuilla, laskutoimituksilla tai pitää muuttujina, johin 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ä 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? Toisto Yksi tapa toistaa komentoja Pythonissa on seuraavanlainen: 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 Aloita puhtaalta alustalta ja piirrä kuvioit 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? 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.pendown() 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ödynnä 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ä (aloiuspisteen 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) H4. Peilauspisteelle funktio Jatka H3:n pohjalta. Kopioi alta peilauspisteen funktio joka piirtää sen pienenä + merkkinä. Liitä se koodiin monikulmion funktion määrittelyn edelle. def peilauspiste( px, py ): konna.goto( px -5, py ) konna.pendown() konna.goto( px +5, py ) konna.goto( px, py -5) konna.pendown() konna.goto( px, py +5) konna.goto(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 Jatka H4:stä ja luo apumuuttujat joita tarvitaan myöhemmin peilauksessa ja piirretään peilauspiste origoon funktiolla. Tee ensin peilaus 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. Lisähaasteena: - 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ää? H6. Peilaus suoran suhteen Aloita uusi trinketti/projekti ja kopioi siihen allaoleva koodi. Täydennä koodin alkuun alkuun H3:ssa tekemäsi monikulmioiden piirtämisen funktio. Tämän jälkeen ohjaa konna piirtämään kuvion peilikuva suoran suhteen ohjelmakoodin loppuun. # alkuiset osat ovat kommenttia, jota ohjelma ei aja koodina. - 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 muilla peilaussuoran kulmilla kuin 90? Kokeile vaikka 45 ja 0. Koodi: # tuodaan ohjelman käytettäväksi tarvittavat moduulit import turtle import math # Täydennä tähän H3:ssa tekemäsi monikulmioiden piirtofunktio
def monikulmio( x, y, kulmia, sivu ): # 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.pendown() 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. Voit itse muuttaa muuttujien arvoja halutessasi. konna = turtle.turtle() konna.shape("turtle") # Muuttujat: 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ä sivu = 40 # monikulmion sivun pituus # Piirretään peilaussuora ja peilattava monikulmio funktioilla ja # palataan aloituspisteeseen. peilaussuora( kulma ) monikulmio( x, y, kulmia, sivu ) konna.goto(0, 0) # palataan keskelle piirtoaluetta konna.setheading(0) # käännytään aloitussuuntaan # 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.