Kello

Oletko tehnyt jotain, mistä muut voisivat hyötyä. Postita vinkit tänne.
Post Reply
KilledWhale
Tech Developer
Tech Developer
Posts: 545
Joined: Sun Aug 26, 2007 2:43 pm
Location: Liminka

Kello

Post by KilledWhale »

Eli tässä olisi tällainen pieni cos + sin kikkailu joka piirtää kellon ja viisarit koneesi kellon mukaan. Optimoida tätä voisi esim. laskemalla osan arvoista valmiiksi muuttujiin ja piirtämällä kaiken lukuunottamatta viisareita kuvaan, mutta laiskuus vei voiton :D Pitemmittä puheitta:

Code: Select all

SCREEN 600,600
Repeat
SetWindow "Kello: "+Time()
//parsitaan tunnit, minuutit ja sekunnit erillisiin muuttujiin
h=Int(GetWord(Time(),1,":"))
m=Int(GetWord(Time(),2,":"))
s=Int(GetWord(Time(),3,":"))
//laitetaan ulkoreunoihin himmennystä
For i=1 To 10
  Color i*23,i*17,0
  Circle 44+i,44+i,600-(44+i)*2
Next i
//piirretään oranssit reunukset
Color 230,170,0
Circle 55,55,600-110
//himmennetään reunojen ja kellotaulujen välinen osa
For i=1 To 10
  Color 230-i*23,170-i*17,0
  Circle 66+i,66+i,600-(66+i)*2
Next i
//kellotaulun harmaa tausta
Color 50,50,50
Circle 75,75,450
Color 255,255,255
//piirretään numero 1-12 ja niiden taakse paksumpi pallero
For i=12 To 1 Step -1
  Text 300+Cos(90-(i*(360/12)))*210-(TextWidth(""+i)/2),300-Sin(90-(i*(360/12)))*210-(TextHeight(""+i)/2),i
  Circle 300+Cos(90-(i*30))*220-3,300-Sin(90-(i*30))*220-3,6
Next i
//piebnemmät pallerot ympäri kellotaulua
For i=1 To 60
  Circle 300+Cos(90-(i*6))*220-1,300-Sin(90-(i*6))*220-1,2
Next i
//piirretään harmaat viivat minuuttien ja tuntien alapuolelle
//pehmentämään viivoja
Color 100,100,100
//minuuttien kulma on 90-(m)*6-(s/10)
//tuo -s/10 asettaa minuuttiviisarin liikkumaan myös
//sekuntien mukaan jolloin vältytään yhtäkkisiltä
//tökkäisyiltä
Line2(300,300,300+Cos(90-(m)*6-(s/10))*190,300-Sin(90-(m)*6-(s/10))*190,6)
//aikalailla sama kuin edellinen, mutta sekuntien 
//sijasta vähennetään minuuttien määrän  mukaan
Line2(300,300,300+Cos(90-(h*30)-(m/2))*150,300-Sin(90-(h*30)-(m/2))*150,6)
Color 255,255,255
//piirretään vielä ohuemmat viivat harmaiden minuutti-
// ja tunti viisareiden päälle
Line2(300,300,300+Cos(90-m*6-(s/10))*190,300-Sin(90-m*6-(s/10))*190,3)
Line2(300,300,300+Cos(90-(h*30)-(m/2))*150,300-Sin(90-(h*30)-(m/2))*150,3)
//piirretään punainen sekuntiviisari
//koska sekunteja on vain 60 kulma lasketaan sekuntit*6
//ja vähennetään kulma 90:stä(kellotaulun yläreuna)
Color 255,0,0
Line 300,300,300+Cos(90-s*6)*200,300-Sin(90-s*6)*200
//piirretään vielä keskiosa kelloa koristamaan
For i=1 To 5
Color i*25,i*25,i*25
Circle 290+i,290+i,20-i*2
Next i
DrawScreen
Forever
//funktio jolla voi piirtää viivan määräten itse paksuuden
Function line2(x#,y#,x2#,y2#,w=1)
xx#=x#
yy#=y#
//otetaan kulma pisteiden väliltä
ang#=GetAngle(xx#,yy#,x2#,y2#)
//jos etäisyys on enemmän kuin 1 siirrytään etiä päin
While Distance(xx#,yy#,x2#,y2#)>1
//piirretään pallo niin, että sen keksipiste sattuu
//kohtaan missä ollaan menossa
Circle xx#-w/2,yy#-w/2,w
//kasvatetaan x ja y koordinaatteja pisteiden
//välisen kulman mukaan
xx#=xx#+Cos(ang#)
yy#=yy#-Sin(ang#)
Wend
EndFunction 
//optimoin hiukan

Code: Select all

SCREEN 600,600
taulu=MakeImage(600,600)
DrawToImage taulu
//laitetaan ulkoreunoihin himmennystä
For i=1 To 10
  Color i*23,i*17,0
  Circle 44+i,44+i,600-(44+i) Shl 1
Next i
//piirretään oranssit reunukset
Color 230,170,0
Circle 55,55,600-110
//himmennetään reunojen ja kellotaulujen välinen osa
For i=1 To 10
  Color 230-i*23,170-i*17,0
  Circle 66+i,66+i,600-(66+i) Shl 1
Next i
//kellotaulun harmaa tausta
Color 50,50,50
Circle 75,75,450
Color 255,255,255
//piirretään numero 1-12 ja niiden taakse paksumpi pallero
For i=12 To 1 Step -1
  Text 300+Cos(90-i*30)*210-(TextWidth(""+i) Shr 1),300-Sin(90-i*30)*210-(TextHeight(""+i) Shr 1),i
  Circle 300+Cos(90-i*30)*220-3,300-Sin(90-i*30)*220-3,6
Next i
//piebnemmät pallerot ympäri kellotaulua
For i=1 To 60
  Circle 300+Cos(90-i*6)*220-1,300-Sin(90-i*6)*220-1,2
Next i
DrawToScreen
Repeat
DrawImage taulu,0,0
SetWindow "Kello: "+Time()
//parsitaan tunnit, minuutit ja sekunnit erillisiin muuttujiin
h=Int(GetWord(Time(),1,":"))
m=Int(GetWord(Time(),2,":"))
s=Int(GetWord(Time(),3,":"))
Color 255,255,255
For i=12 To 1 Step -1
  Text 300+Cos(90-i*30)*210-(TextWidth(""+i) Shr 1),300-Sin(90-i*30)*210-(TextHeight(""+i) Shr 1),i
Next i
//piirretään harmaat viivat minuuttien ja tuntien alapuolelle
//pehmentämään viivoja
Color 100,100,100
//minuuttien kulma on 90-(m)*6-(s/10)
//tuo -s/10 asettaa minuuttiviisarin liikkumaan myös
//sekuntien mukaan jolloin vältytään yhtäkkisiltä
//tökkäisyiltä
Line2(300,300,300+Cos(90-m*6-s/10)*190,300-Sin(90-m*6-s/10)*190,6)
//aikalailla sama kuin edellinen, mutta sekuntien
//sijasta vähennetään minuuttien määrän  mukaan
Line2(300,300,300+Cos(90-h*30-m Shr 1)*150,300-Sin(90-h*30-m Shr 1)*150,6)
Color 255,255,255
//piirretään vielä ohuemmat viivat harmaiden minuutti-
// ja tunti viisareiden päälle
Line2(300,300,300+Cos(90-m*6-s/10)*190,300-Sin(90-m*6-s/10)*190,3)
Line2(300,300,300+Cos(90-h*30-m Shr 1)*150,300-Sin(90-h*30-m Shr 1)*150,3)
//piirretään punainen sekuntiviisari
//koska sekunteja on vain 60 kulma lasketaan sekuntit*6
//ja vähennetään kulma 90:stä(kellotaulun yläreuna)
Color 255,0,0
Line 300,300,300+Cos(90-s*6)*200,300-Sin(90-s*6)*200
//piirretään vielä keskiosa kelloa koristamaan
For i=1 To 5
Color i*25,i*25,i*25
Circle 290+i,290+i,20-i Shl 1
Next i
DrawScreen
Forever
//funktio jolla voi piirtää viivan määräten itse paksuuden
Function line2(x#,y#,x2#,y2#,w=1)
xx#=x#
yy#=y#
//otetaan kulma pisteiden väliltä
ang#=GetAngle(xx#,yy#,x2#,y2#)
//jos etäisyys on enemmän kuin 1 siirrytään etiä päin
While Distance(xx#,yy#,x2#,y2#)>1
//piirretään pallo niin, että sen keksipiste sattuu
//kohtaan missä ollaan menossa
Circle xx#-w Shr 1,yy#-w/2,w
//kasvatetaan x ja y koordinaatteja pisteiden
//välisen kulman mukaan
xx#=xx#+Cos(ang#)
yy#=yy#-Sin(ang#)
Wend
EndFunction
//edit nyt otsikko päivittyy...
Last edited by KilledWhale on Tue Jan 29, 2008 7:11 pm, edited 2 times in total.
CoolBasic henkilökuntaa
Kehittäjä

cbFUN Kello
cbSDL
Whale.dy.fi

<@cce> miltäs tuntuu olla suomen paras
Henkru
Advanced Member
Posts: 359
Joined: Sun Aug 26, 2007 2:46 pm

Re: Kello

Post by Henkru »

Eilenhän tuon jo näin irkissä. Täytyy sanoo et hieno on. Vieläkun sais piirettyä ilman ikkunaa. Taitaa olla cbFun:in PutPixel kyl liian hidas siihen hommaan :D
Marcoder
Active Member
Posts: 120
Joined: Tue Aug 28, 2007 8:21 am

Re: Kello

Post by Marcoder »

Ihan jees.
Simuloidaan pientä mekaanista "klappia" kun korvataan sekuntiviisarin piirto rivillä 54 seuraavalla pätkällä:

Code: Select all

ss# = s
If ps <> s Then ss + 0.2
ps = s
Line 300,300,300+Cos(90-ss*6)*200,300-Sin(90-ss*6)*200
willy
Newcomer
Posts: 2
Joined: Sat Sep 29, 2007 12:42 pm

Re: Kello

Post by willy »

Aika veikeä ja hieno kello on :)
Pieni epäkohta tosin pistää silmään. Nimittäin tuo ohjelman otsikko, "Kello: "+Time(), kun ei päivity. Tämähän tietysti on helposti korjattavissa, mikäli sen tahtoo tehdä.
Mainio ja esteettinen kello. :)
-willy[]
quakenet: #windymill
icq: 426647025
GUEST

Re: Kello

Post by GUEST »

:/ Miksiköhän mulla kellon viisarit menevät hieman epätahtiin? Eli välillä lyönti myöhästyy ja sitten ohjelma ottaa sen kiinni nopeuttamalla lyöntiä. Se myös välillä jättää jonkun sekunnin kokonaan pois. Mutta ulkoasultaan hieno kello.
KilledWhale
Tech Developer
Tech Developer
Posts: 545
Joined: Sun Aug 26, 2007 2:43 pm
Location: Liminka

Re: Kello

Post by KilledWhale »

GUEST wrote::/ Miksiköhän mulla kellon viisarit menevät hieman epätahtiin? Eli välillä lyönti myöhästyy ja sitten ohjelma ottaa sen kiinni nopeuttamalla lyöntiä. Se myös välillä jättää jonkun sekunnin kokonaan pois. Mutta ulkoasultaan hieno kello.
Taitaa olla vain puhdasta lagia. Kellonaika kun luetaan suoraan tietokoneesta.
CoolBasic henkilökuntaa
Kehittäjä

cbFUN Kello
cbSDL
Whale.dy.fi

<@cce> miltäs tuntuu olla suomen paras
Post Reply