Page 1 of 1

Kierto pystysuunnassa

Posted: Mon Oct 15, 2012 2:01 pm
by RaatoX
Kuinkas myös y-kierto laitetaan kyseiseen ohjelmaan?

Code: Select all

SCREEN 640, 480

//alustetaan koordinaatit

Type point
    Field x#
    Field y#
    Field z#
EndType

For i = 0 To 499
    p.point = New(point)
    p\x = Rnd(-1,1)
    p\y = Rnd(-1,1)
    p\z = Rnd(-1,1)
Next i

Repeat
   
    //pyörityskulma sekä sen valmiiksi laskettavat sini ja kosini
    ang# = ang + 1
    cosa# = Cos(ang)
    sina# = Sin(ang)
   
    Lock
        For p.point = Each point
           
            //itse pyöritys, joka tapahtuu y-akselin ympäri (y-arvot eivät muutu)
            x# = p\x*cosa + p\z*sina
            z# =-p\x*sina + p\z*cosa
           
            //projisoidaan piste
            s# = 400.0/(z+3.0)
           
            rx = x*s+320
            ry = p\y*s+240
           
            //piirretään sen kohdalle ruksi
            Line rx-1, ry-1, rx+1, ry+1
            Line rx-1, ry+1, rx+1, ry-1
           
        Next p
    Unlock
    DrawScreen
Forever

Re: Kierto pystysuunnassa

Posted: Mon Oct 15, 2012 4:54 pm
by koodaaja
Kysymykseesi on sinänsä vastata, kun ohjelma kiertää pisteitä nimenomaan y-akselin ympäri. Tuohon voi lisätä joko kierron x:n tai z:n suhteen - kolmatta ei enää suoraan kulmaan pyörittämällä. Yleisesti ottaen koko akselin ympäri pyöritys on huono ajatus ja maailman avaruudesta kameran avaruuteen siirtyminen kannattaa ratkaista jollain fiksummalla tavalla. Poikkeuksena testit ja esimerkkiohjelmat, joissa on joskus mielekästä pyöritellä kappaletta akselinsa ympäri jotta sen liike tai eri puolet näkyvät helposti.

Esimerkiksi z-akselin ympäri pisteet kuitenkin pyörisivät seuraavasti:

Code: Select all

SCREEN 640, 480

//alustetaan koordinaatit

Type point
    Field x#
    Field y#
    Field z#
EndType

For i = 0 To 499
    p.point = New(point)
    p\x = Rnd(-1,1)
    p\y = Rnd(-1,1)
    p\z = Rnd(-1,1)
Next i

Repeat
   
    //pyörityskulmat sekä sen valmiiksi laskettavat sinit ja kosinit
    ang# = ang + 1
    cosa# = Cos(ang)
    sina# = Sin(ang)
    
    ang2# = ang2 + .8
    cosa2# = Cos(ang2)
    sina2# = Sin(ang2)
   
    Lock
        For p.point = Each point
           
            //itse pyöritys, joka tapahtuu y-akselin ympäri (y-arvot eivät muutu)
            tx# = p\x*cosa + p\z*sina
            z# =-p\x*sina + p\z*cosa
            
            //ja z-akselin ympäri (z-arvot eivät muutu)
            x# = tx*cosa2 + p\y*sina2
            y# =-tx*sina2 + p\y*cosa2
           
            //projisoidaan piste
            s# = 400.0/(z+3.0)
           
            rx = x*s+320
            ry = y*s+240
           
            //piirretään sen kohdalle ruksi
            Line rx-1, ry-1, rx+1, ry+1
            Line rx-1, ry+1, rx+1, ry-1
           
        Next p
    Unlock
    DrawScreen
Forever
Kyseessähän on vain 2D-pyöritys jonka voi tehdä kolmella eri setillä koordinaatteja - (x,y), (y,z) tai (x,z).

Re: Kierto pystysuunnassa

Posted: Mon Oct 15, 2012 7:39 pm
by RaatoX
Kiitos taas Koodaaja. Tulenkin käyttämään kääntämistä eri tarkoitukseen kuin koodissa.
Halusin vain tajuta asian kokonaisuudessaan.