Olen taas sluibaillut omien lasteni opettamisesta erikseen, koska olen pyörittänyt CSC:n ohjelmointikerhoa. Mutta aina joskus opetan myös erikseen omia lapsiani. Tänään kysyin keskimmäiseltä, onko jotain, mitä hän erityisesti haluaisi opetella, ja hän näytti käsillään "semmoinen, jossa kuva pyörii tälleen". Tämä oli mielenkiintoinen haaste, ja koska sellaisen toteuttaminen ei oikeasti vaadi kovin pitkää ohjelmaa, katsoimme.
Mutta ensin oli ongelma siitä, miten tuotetaan se kuvio, jota pyöritellään. 3d-kuvion laskemista varten tarvitaan koordinaattilistoja, ja niiden kirjoittaminen käsin on epätoivoinen homma. Niinpä tein ensimmäiseksi perusliikkumiskäskyistä versiot, jotka ottavat talteen, mitä reittiä piirturi kulkee.
copydef "ur.et "et copydef "ur.ta "ta copydef "ur.uusi "uusi Olkoon "redefp joo tuhoa [et ta uusi] Olkoon "redefp ei to et :pit ur.et :pit push "jutut paikka end to ta :pit ur.ta :pit push "jutut paikka end to uusi olkoon "jutut [] ur.uusi push "jutut paikka end
Tällä tavoin muuttujaan :jutut tulee lista koordinaatteja, jotka uudelleentuottavat aiemmin piirretyn kuvion. Tässä on aliohjelma, jolla sen voi piirtää:
miten uuspiirrä :kuv hypspaik eka :kuv foreach loput :kuv [paikkaan ?] valmis
Sitten tarvitaan enää aliohjelmia, joilla koordinaatteja voi kääntää, siirtää sopiviin paikkoihin 3d-koordinaatistossa ja projisoida 2d-näytölle. Tässä on kyseiset muunnosrutiinit yhdelle koordinaatille:
miten käännäxy :asteet :koord nimeä "x eka :koord nimeä "y vika :koord anna (list ((:x * cos :asteet) - :y * (sin :asteet)) ((:x * sin :asteet) + :y * (cos :asteet))) valmis miten muunna2d :koord nimeä "x eka :koord nimeä "y eka loput :koord nimeä "z vika :koord anna (list (:x * 500 / (:z + 500)) (:y * 500 / (:z + 500))) valmis miten muunna3d :koord anna (list eka :koord -200 vika :koord) valmis
Kun ohjelmaa kokeiltiin, lapsi halusi tehdä tähden:
uusi et 150 oi 144 et 150 oi 144 et 150 oi 144 et 150 oi 144 et 150 sano :jutut olkoon "tahti :jutut sano :tahti
Sitten kokeiltiin, miten tähden voi piirtää suoraan
uusi uuspiirrä :tahti
ja käännettynä
uuspiirrä map [käännäxy 45 ?] :tahti
ja 3d-tasoksi käännettynä :)
uuspiirrä map [muunna2d muunna3d käännäxy 45 ?] :tahti
Ja lopuksi siitä tehtiin animaatio:
toista 500 [uuspiirrä map [muunna2d muunna3d käännäxy kerta ?] :tahti] toista 500 [pyyhi uuspiirrä map [muunna2d muunna3d käännäxy kerta ?] :tahti odota 3]
Ja sama toisella kuvalla:
uusi et 1 uusi et 150 va 75 et 50 olkoon "ykkönen :jutut toista 500 [pyyhi uuspiirrä map [muunna2d muunna3d käännäxy kerta ?] :ykkönen odota 3]