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
Edit: Koodia ja kommentteja vähän parantelin.