Sv: Analog klocka
Inte speciellt.
Steg:
1. Ta fram tiden.
2. Dela upp den i timmar, minuter och sekunder. Där har du en digital klocka enkelt.
3. Om timmar >12 så timmar=timmar-12
4. Nu översätter du varje grej till en vinkel (lämpligtvis i radianer, men i grader går också):
radtim=2*pi*timmar/12
radmin=2*pi*minuter/60
radsek=2*pi*sekunder/60
5. Rita ut visare med en given startpunkt och en given längd, i de vinklarna du just räknat ut.
Det blir alltså streck mellan (xs, ys) och (xs+r*cos(radtim), us+r*sin(radtim)).
6. Lägg eventuellt till lite annat skit också (småstreck etc.).
Svara
Sv:Analog klocka
Ett tillägg bara; gjorde ett test, och insåg en liten grej; när du delar upp i timmar, minuter och sekunder i steg 2, så kan du antingen ta heltalsdelen, eller ha med decimalerna. Skillnaden blir att visarna "hoppar" fram, lite som klockan mellan sändningarna på tv, om man tar heltalsdelen. Kör man hela grejen blir det mer som på en vanlig klocka.
Edit: Ytterligare ett tillägg: du behöver inte dra bort 12 på timmen. Sin och cos är ju definierade för >2pi också... vad tänkte jag på... =)
Svara
Sv:Analog klocka
Så här blev min snabbt ihopsvängda lösning förut:
<code>
Option Explicit
Private Sub Timer_Timer()
Dim Tim As Double, Min As Double, Sek As Double
Dim RadTim As Double, RadMin As Double, RadSek As Double
Const pi As Double = 3.14159265358979
'Heltalsvariant
'Tim = Hour(Now)
'Min = Minute(Now)
'Sek = Second(Now)
'Decimalvariant
Sek = Second(Now)
Min = Minute(Now) + Sek / 60
Tim = Hour(Now) + Min / 60
RadTim = 2 * pi * Tim / 12 - pi / 2
RadMin = 2 * pi * Min / 60 - pi / 2
RadSek = 2 * pi * Sek / 60 - pi / 2
Dim xs As Double, ys As Double
Dim timw As Double, minw As Double, sekw As Double
Dim timh As Double, minh As Double, sekh As Double
xs = Form1.ScaleWidth / 2
ys = Form1.ScaleHeight / 2
timw = Form1.ScaleWidth / 6
minw = Form1.ScaleWidth / 2.5
sekw = Form1.ScaleWidth / 2.1
timh = Form1.ScaleHeight / 6
minh = Form1.ScaleHeight / 2.5
sekh = Form1.ScaleHeight / 2.1
Form1.Cls
'Ellipitisk
Form1.Line (xs, ys)-(xs + timw * Cos(RadTim), ys + timh * Sin(RadTim))
Form1.Line (xs, ys)-(xs + minw * Cos(RadMin), ys + minh * Sin(RadMin))
Form1.Line (xs, ys)-(xs + sekw * Cos(RadSek), ys + sekh * Sin(RadSek))
'Form1.Circle (xs, ys), Max(ScaleWidth, ScaleHeight) / 2
'Cirkulär
'Form1.Line (xs, ys)-(xs + timw * Cos(RadTim), ys + timw * Sin(RadTim))
'Form1.Line (xs, ys)-(xs + minw * Cos(RadMin), ys + minw * Sin(RadMin))
'Form1.Line (xs, ys)-(xs + sekw * Cos(RadSek), ys + sekw * Sin(RadSek))
'Form1.Circle (xs, ys), ScaleWidth / 2
End Sub
Private Function Max(a As Double, b As Double) As Double
If a > b Then Max = a Else Max = b
End Function
</code>
Finns mycket att snygga upp, etc., men det funkar.
Svara
Sv: Analog klocka
Jodå, den fungerar, kanske inte så snygg men grunden har jag nu
Tackar så mycket
Svara