Kierto pystysuunnassa

Voit pyytää apua ohjelmointiongelmiin täältä.
Post Reply
RaatoX
Member
Posts: 54
Joined: Thu Aug 12, 2010 7:04 pm

Kierto pystysuunnassa

Post by RaatoX » Mon Oct 15, 2012 2:01 pm

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

User avatar
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Kierto pystysuunnassa

Post by koodaaja » Mon Oct 15, 2012 4:54 pm

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).

RaatoX
Member
Posts: 54
Joined: Thu Aug 12, 2010 7:04 pm

Re: Kierto pystysuunnassa

Post by RaatoX » Mon Oct 15, 2012 7:39 pm

Kiitos taas Koodaaja. Tulenkin käyttämään kääntämistä eri tarkoitukseen kuin koodissa.
Halusin vain tajuta asian kokonaisuudessaan.

Post Reply