Sin ja Cos esimerkki

Oletko tehnyt jotain, mistä muut voisivat hyötyä. Postita vinkit tänne.
Post Reply
Igr0
Active Member
Posts: 110
Joined: Thu Oct 02, 2008 8:04 pm
Location: Helsinki, Finland

Sin ja Cos esimerkki

Post by Igr0 »

Olen täällä foorumeilla pyörinyt jo jonkin aikaa, mutta varsinaisia pelejä en oikeastaan ole saanut aikaiseksi. Kuitenkin olen tässä vähän aikaa puuhastellut pienen koodinpätkän kanssa, jonka alkuperäinen tarkoitus oli vain olla harjoitusta itselleni sinin ja kosinin kanssa. Harjoitus osoittautuikin mielestäni melko selkeäksi esimerkiksi sinin ja kosinin toiminnasta yleisesti sekä CB-koodauksen yhteydessä, ja niinpä ajattelin postata sen tänne teidän muidenkin riemuksi, koska vastaavanoloisia esimerkkejä en pikaisen etsinnän jälkeen täältä löytänyt.

Esimerkki on suunnattu lähinnä niille joille sinin ja kosinin salat eivät vielä oikein ole auenneet. Sen pääasiallisin tarkoitus olisi siis selventää sinin ja kosinin toimintaa, eli miksi Sin ja Cos saavat sellaisia arvoja kuin ne saavat eri arvoilla. Toissijainen tarkoitus on tietenkin toimia esimerkkinä siitä miten Sin ja Cos funktioita käytetään CB:llä koodatessa.

Koodi saattaa olla osittain hieman purkkaisaa, mutta koen sen ainakin itse riittävän selkeäksi muillekkin kuin CB-guruille. Koko koodia en ole kommentoinut, ja jotkut kommentit voivat olla hieman... sekavia.

Niille, jotka yrittävät/haluavat oppia tästä jotain:
- copypastea ja aja koodi
- kokeile mitä tämä ohjelma tekee
- lue koodi läpi
- kokeile tehdä koodiin muutoksia ja katso mitä tapahtuu
- tee aikaisemmat kohdat ajatuksella( ekassa kohdassa ei tarvitse kyllä ajatustyötä juurikaan ;) )

Code: Select all

//++++++++++++++++++++SinCos EsimerkkiOhjelma++++++++++++++++++++++++++++++++
//------------------------Made by Igr0---------------------------------------
//Ohjelma esittää selkeästi(tai ainakin sen olisi tarkoitus esittää), millä
//perusteella sini ja kosini saavat mitäkin arvoja. Koodi ei välttämättä ole
//ihan huippuunsa hiottu, mutta itselleni se kelpaa tälläisenään ihan hyvin. 
//Kulman vaihtaminen tapahtuu nuolinäppäimillä. Koodia saa
//ihan vapaasti käyttää, lähinnä siitä syystä että se on aikalailla ihan 
//perushuttua, jonka perimmäinen tarkoitus on auttaa ymmärtämään siniä ja
//kosinia ainakin vähän. Jos tämä on jonkun mielestä sekavaa paskaa tai 
//paskaa ylipäätään niin omahan on mielipiteensä, itse ainakin opin tätä 
//tekemällä aika paljon, joten minä en niistä mielipiteistä mitään häviä. :P
//---------------------------------------------------------------------------
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

//Vielä pieni selitys siitä, miten Sin ja Cos funktioita voidaan CB:n kanssa 
//käyttää:
//Otetaan joku satunnainen kohta, vaikka (200,150). Sitten haluttaisiin piirtää 
//vaikka piste 100 pisteen päähän kohdasta (200,150). Tämä piste voisi olla vaikka
//38 asteen kulmassa pisteestä (200,150) katsoen. Eli piste halutaan piirtää hiukan
//oikealle ja ylöspäin pisteestä (200,150).
//Se tapahtuisi seuraavasti:
//    Dot 200 + Cos(38) * 100, 150 - Sin(38) * 100

//Eli alkupisteen(200,150) x-koordinaattiin lisätään kosinin arvo 38:n asteen kohdalla 
//kerrottuna sillä luvulla kuinka kauas tämä uusi piste halutaan alkupisteestä.
//Alkupisteen y-koordinaatista taas vähennetään(*ks. selitys alempaa) sinin arvo 38:n 
//asteen kohdalla kerrottuna jälleen tämän uuden pisteen ja alkupisteen välisellä 
//etäisyydellä.
//Voidaan myös ajatella että näiden pisteiden välinen etäisyys on ympyrän säde, sillä
//jos piirrettäisiin tällä tavoin 100 pikselin päähän pisteestä (200,150) pisteitä yhden 
//asteen välein, alkaisi syntyvä kuvio muistuttamaan ympyrää(ks. kohta Ison ympyrän piir-
//to pisteillä).

//*SELITYS ylempänä mainittuun kohtaan:
//Tuossa tapauksessa y-koordinaatista pitää vähentää sinin arvo, koska CB käyttää oletuksena
//piirtokomennoille koordinaatistoa, jossa piste (0,0) on vasemmassa yläkulmassa, ja y:n
//arvo kasvaa alaspäin mentäessä. Kun taas käytetään normaalia xy-koordinaatistoa
//(ks. DrawToWorld manuaalista) y-koordinaattiin lisätään sinin arvo, aivan kuten x-koordi-
//naattiin lisättiin kosinin arvo.

SCREEN 600,600 //tehdään 600 x 600 pikselin ikkuna
FrameLimit 60

//alkuarvot
angle# = 0
kosini# = 1
sini# = 0

//PÄÄSILMUKKA
Repeat

    //x- ja y-akseleiden piirto
    Line ScreenWidth()/6,ScreenHeight()/2,ScreenWidth()/6*5,ScreenHeight()/2
    Line ScreenWidth()/2,ScreenHeight()/6,ScreenWidth()/2,ScreenHeight()/6*5
    
    
    //ISON YMPYRÄN PIIRTO PISTEILLÄ kaksi kertaa, jotta se näyttäisi yhtenäisemmältä 
    //Eli käytännössä 360 pistettä ikkunan keskipisteen ympärille 150 pikselin 
    //päähän siitä
    For i#=0.0 To 360.0
        Dot (ScreenWidth()/2)+Cos(i)*150,(ScreenHeight()/2)-Sin(i)*150
    Next i#
    
    //Sama kuin edellinen kohta, mutta asteet ovat puoli astetta isompia kuin 
    //aiemmin.
    For i#=0.5 To 360.5
        Dot (ScreenWidth()/2)+Cos(i)*150,(ScreenHeight()/2)-Sin(i)*150
    Next i#
    
    
    //kulma-asteikko 10 asteen välein
    For i=0 To 360 Step 10
        Dot (ScreenWidth()/2)+Cos(i)*147,(ScreenHeight()/2)-Sin(i)*147
    Next i
    
    
    //KULMAN NÄYTTÄVÄ PIENI YMPYRÄ (ei näy nollan asteen kulmassa)   
    //kulman ollessa 0:n ja 360:n välillä, piirretään ympyrää kyseessä olevaan kulmaan asti kulmaan asti
    If angle# > 0 And angle# < 360 Then 
        For i=0 To angle#
            Dot (ScreenWidth()/2)+Cos(i)*25,(ScreenHeight()/2)-Sin(i)*25
        Next i
        
    //kulman ollessa 0:n ja -360:n välillä, piirretään ympyrää kyseessä olevaan kulmaan asti
    ElseIf angle# < 0 And angle# > -360 Then  
        For i=0 To angle# Step -1
            Dot (ScreenWidth()/2)+Cos(i)*25,(ScreenHeight()/2)-Sin(i)*25
        Next i
        
    //Kulman ollessa yli 360 astetta, piirretään ympyrä vain kerran, jotta ohjelma ei hidastuisi useampia
    //kierroksia ympäri mentäessä.
    ElseIf angle# >= 360
        For i=0 To 360
            Dot(ScreenWidth()/2)+Cos(i)*25,(ScreenHeight()/2)-Sin(i)*25
        Next i
        
    //Kulman ollessa alle -360 astetta, piirretään ympyrä vain kerran, jotta ohjelma ei hidastuisi useampia
    //kierroksia ympäri mentäessä.
    ElseIf angle# <= -360 Then 
        For i=0 To -360 Step -1
            Dot (ScreenWidth()/2)+Cos(i)*25,(ScreenHeight()/2)-Sin(i)*25
        Next i
    EndIf 
    
    
    //VIHREÄ VIIVA joka näyttää kulman, eli se ns. viisari jota liikutellaan.
    //Viivan alku on ikkunan keskipiste ja loppu on 175 pikselin päässä siitä, sen 
    //hetkisessä kulmassa alkukohdasta nähden.
    Color 20,250,20
    Line ScreenWidth()/2,ScreenHeight()/2,ScreenWidth()/2+Cos(angle#)*175,ScreenHeight()/2-Sin(angle#)*175
    
    //Kulman liikutus nuolinäppäimillä.(oikealle -> kulma pienenee, ja vasemmalle päinvastoin)
    If RightKey() Then angle# = angle# - 1
    If LeftKey() Then angle# = angle# + 1
    
    //Kosinin pyöristys nollaksi tarvittaessa, liukulukuvirheiden takia.
    kosini# = Cos(angle#)
    If angle#=90.0 Or angle#=270.0 Then
        kosini# = 0
    ElseIf angle#=-90.0 Or angle#=-270.0 Then
        kosini# = 0
    EndIf 
       
    //Sinin pyöristys nollaksi tarvittaessa, liukulukuvirheiden takia.
    sini# = Sin(angle#)
    If angle#=180.0 Or angle#=360.0 Then
        sini# = 0
    ElseIf angle#=-180.0 Or angle#=-360.0 Then
        sini# = 0
    EndIf
    
    //Piirretään punainen viiva, joka ilmaisee kosinin pituuden.
    //Tehdään kolmella erillisellä viivalla, jotta saadaan yksi paksu viiva.
    Color cbDarkRed
    Line 300,299,300+Cos(0)*(150*kosini#),299
    Line 300,300,300+Cos(0)*(150*kosini#),300
    Line 300,301,300+Cos(0)*(150*kosini#),301
    
    //Piirretään sininen viiva, joka ilmaisee sinin pituuden.
    //Tehdään kolmella erillisellä viivalla, jotta saadaan yksi paksu viiva.
    Color cbDarkBlue
    Line 301,300,301,300-Sin(90)*(150*sini#)
    Line 300,300,300,300-Sin(90)*(150*sini#)
    Line 299,300,299,300-Sin(90)*(150*sini#)
    
    
    //TEKSTIT
    
    //kulman näyttävä teksti, suluissa kulma näkyy aina välillä 0-360
    Color cbWhite
    Text 0,0,"Kulma: " + angle# + " (" + WrapAngle(angle#) + ")"
    
    //kosinin arvo tekstinä
    Color cbDarkRed
    Text 0,13,"Kosini: " + kosini#
    
    //sinin arvo tekstinä
    Color cbDarkBlue
    Text 0,26,"Sini: " + sini#
    
    //numerot selventämään ympyrän asteikkoa(chr(176) on astemerkki)
    Color cbWhite
    Text 292,78,"90"+Chr(176)
    Text 287,510,"270"+Chr(176)
    Text 70,293,"180"+Chr(176)
    Text 510,293,"0"+Chr(176)
    
    Text 120,550,"Kulmaa muutetaan nuolinäppäimillä. (<- ja ->)"
    Text 500,580,"Made by Igr0"

    DrawScreen //tästä tuskin tarvitsee erikseen selittää mitään ;D

Forever 
Kommenttia, plussia ja miinuksia saa heitellä. :)

Edit: Koodia ja kommentteja vähän parantelin.
Last edited by Igr0 on Fri Dec 25, 2009 6:10 pm, edited 1 time in total.
User avatar
valscion
Moderator
Moderator
Posts: 1599
Joined: Thu Dec 06, 2007 7:46 pm
Location: Espoo
Contact:

Re: Sin ja Cos esimerkki

Post by valscion »

Harvinaisen hyvä ja selkeä esimerkki! Joillekin saattaa jäädä epäselväksi, miksi piirrettäessä Sin- ja Cos- funktioita niitä kerrotaan tietyillä numeroarvoilla. Voisi ehkä pari kommenttia lisätä, jotka kertovat kyseisen numeron olevan säteen pituus (tai siis etäisyys ympyrän keskipisteestä).

Vähän voisi optimoida, iiiihan pikkuisen, koodin siitä kumminkaan vaikeaselkoisemmaksi muuttuvaksi. Kun piirretään pieni ympyrä, joka näyttää kulman, niin angle#:n voisi pyöristää välille -360 - 360 astetta, niin ei ohjelma alkaisi lagaamaan jos mentäisi parikin kierrosta ympäri :)
cbEnchanted, uudelleenkirjoitettu runtime. Uusin versio: 0.4.1 — Nyt myös sorsat GitHubissa!
NetMatch - se kunnon nettimättö-deathmatch! Avoimella lähdekoodilla varustettu
vesalaakso.com
Igr0
Active Member
Posts: 110
Joined: Thu Oct 02, 2008 8:04 pm
Location: Helsinki, Finland

Re: Sin ja Cos esimerkki

Post by Igr0 »

VesQ wrote:... Voisi ehkä pari kommenttia lisätä, jotka kertovat kyseisen numeron olevan säteen pituus (tai siis etäisyys ympyrän keskipisteestä). ... Kun piirretään pieni ympyrä, joka näyttää kulman, niin angle#:n voisi pyöristää välille -360 - 360 astetta, niin ei ohjelma alkaisi lagaamaan jos mentäisi parikin kierrosta ympäri :)
Kommentteja lisäilin ja nyt ei pitäisi enää ohjelman hidastua kun mennään useampia kierroksia ympäri. ;)
SPuntte
Tech Developer
Tech Developer
Posts: 650
Joined: Mon Aug 27, 2007 9:51 pm
Location: Helsinki, Finland
Contact:

Re: Sin ja Cos esimerkki

Post by SPuntte »

Kerrassaan loistava esimerkki!

En perehtynyt täydellisesti koodiin tai sen kommentointiin, mutta alun perusteella niistä käy hyvin ilmi sinin ja kosinin merkitys ja käyttö. Itse ohjelma on todella havainnollinen. Yksikköympyrä auttaa havainnollistamaan trigonometrian tarvetta käytettäessä kulmia ja etäisyyksiä. Voisit vielä lisätä kokoelmaan (tai tehdä aiheesta kokonaan uuden esimerkin) tangenttifunktion ja suorakulmaisen kolmion trigonometriaa. Tangentti nimittäin on siinä erityisen käyttökelpoinen.
CoolBasic henkilökuntaa
Tech-kehittäjä
CoolBasic Classic, Cool VES

CoolPhysicsEngine | MissileSystem | Jana-ympyrä -törmäys | cbSimpleTexture | CoolCPLX
Igr0
Active Member
Posts: 110
Joined: Thu Oct 02, 2008 8:04 pm
Location: Helsinki, Finland

Re: Sin ja Cos esimerkki

Post by Igr0 »

SPuntte wrote:...tekstiä...
Kiva että kelpaa. :) Ja saatanpa tehdäkin tangenttifunktion ja suorakulmaisen kolmion trigonometriasta jonkinnäköistä esimerkkiä. Olisi ainakin itselle hyvää kertausta yo-kokeita varten.
User avatar
buke44
Active Member
Posts: 169
Joined: Sat May 23, 2009 8:10 pm
Location: Tampere

Re: Sin ja Cos esimerkki

Post by buke44 »

Jes! Vihdoinkin tajusin nämä. Tein yksinkertaisen kellon harjotusohjelmana

Code: Select all

FrameLimit 10
SCREEN 800, 600

Repeat

aika$=Time ()

kulma=Int (Right (aika, 2))*6-90

kulma2=Int (Mid (aika, 4, 2))*6-90

kulma3=Int (Left (aika, 2))*30-90

Color cbWhite
Line 400, 300, 400+Cos (kulma)*200, 300+Sin (kulma) *200
Color cbRed
Line 400, 300, 400+Cos (kulma2)*200, 300+Sin (kulma2) *200
Color cbBlue
Line 400, 300, 400+Cos (kulma3)*200, 300+Sin (kulma3) *200
Color cbWhite
Circle 200, 100, 400, 0

CenterText 400, 550, Time ()

DrawScreen 
Forever 
Post Reply