(toiminnot)

hwechtla-tl: Kolmiulotteinen pyöritys logolla

Kierre.png

Mikä on WikiWiki?
nettipäiväkirja
koko wiki (etsi)
viime muutokset


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]


kommentoi (viimeksi muutettu 17.11.2014 10:34)