Uw eigen analoog klokje in .3 nanoseconden
gebracht door Natox

fig 1
(fig 1)

1. Algemeen
1.1 Boring
Iedereen die ooit een zichzelf respecterende wiskundecurcus heeft moeten ondergaan, heeft fig. 1 nog ergens gezien. Inderdaad, het is een (redelijk) orthonormaal assenstelsel. Ze hebben ons altijd wijsgemaakt dat je daar functies zoals y=13x+37, y=3x² enzo kunt op tekenen. Nu gaat het hem vooral om de functie met de vorm x² + y² = 1. Voor de onwetenden onder ons, dit is een vergelijking van een cirkel met middelpunt (0,0) en met straal 1.

Aangezien het geen gemakkelijke formule is om y aan de hand van x te zoeken, doen we beroep op de goniometrie. Die stelt ons in staat x en y in functie van een derde variable te schrijven, namelijk hoek t tussen de x as en de rechte PO. De coördinaten van P worden dan:
P: x=cos t (fig 2)
y=sin t
Als we nu t vloeiend van 0° naar 360° laten toenemen, zal het punt met coördinaten (cos t, sin t) over de cirkel lopen, in tegenwijzerzin.
Aangezien het bereik van sinus- en cosinus functie [-1;1] is, zullen x en y nooit groter dan 1 worden, wat we kunnen verhelpen met een simpele vermenigvuldiging met constante a:
P: x=a*cos t
y=a*sin t
Dit levert ons een cirkel op met middelpunt (0,0) en straal a.
En wat dacht je, natuurlijk kunnen we het middelpunt veranderen, en dat door een getal b bij onze x en y op te tellen:
P: x=a*cos(t) + b
y=a*sin(t) + b
Nu hebben we een cirkel met middelpunt (b,b) en straal a. (fig 3)
fig2
(fig 2)

fig3
(fig 3)
fig4
(fig 4)

(fig 5)

1.1 Getting interessanter
Uhu, en wat heeft dit met mijn beloofd analoog klokje te maken, hoor ik je al denken. Wel, heel veel eigenlijk. Zoals je kunt zien op fig 4, kunnen we zo'n theoritisch assenstelsel toepassen op een form, nu nog voor de gelegenheid gespiegeld rond de x-as. De twee hoeken op fig 4 zijn t en t+q, waarbij q>0. Als we t vloeiend laten verhogen tot de waarde van t+q, dan zal het groene been tegenwijzerzin verdraaien rond M.

Als we dat nu herbekijken op de normale form (niet gespiegeld - fig(5)), dan zien we dat het groene been draait rond punt M, in wijzerzin, wat ons al heel wat dichter brengt bij ons klokje.

2. Secondewijzer
2.1 Algemeen
In een gewoone, aardse minuut zitten er 60 seconden. Dat wilt zeggen, dat het secondetellerke van 0 tot 59 gaat, en terug. Nu toevallig zijn er 360° in een cirkel, wat ons toelaat zeer simpel het aantal seconden om te zetten naar een hoek op de cirkel.
Hoek=sec*6

0 voor 0 seconden en 354 voor 59 seconden. Maar aangezien de Cos() en de Sin() functie enkel met radialen werken, moeten we de graden omzetten naar radialen. Er zitten 2PI radialen in 360 graden, waardoor de omzetformule is:
RadHoek=Hoek*2PI/360 of
RadHoek=Hoek*PI/180
De hoek in radialen in functie van het aantal seconden wordt dus:
RadHoek=sec*6*PI/180
of
RadHoek=sec*PI/30

2.1 Specifiek
De schaalverdeling op een VBform is nogal klein, dus zullen we voor a(straal) 1000, en voor b(middelpunt) 2000 nemen.
Om te beginnen, zullen we een Line-object nemen als wijzer. We zorgen ervoor dat de X1 en de Y1 propery op b (2000) staan. We zetten een Timer object op onze form, en in de Timer1_Timer event zullen we onze X2,Y2 aanpassen, naargelang het aantal seconden. Dit geeft ons deze code:
Option Explicit
Const PI = 3.14159267 'Waarschijnlijk wel ergens al defined
Const a = 1000 Const b = 2000
Private Sub Timer1_Timer() Dim sec As Integer
sec = Second(Now) Line1.X2 = a * Cos(sec * PI / 30) + b Line1.Y2 = a * Sin(sec * PI / 30) + b End Sub

Bij het testen van deze code, stel je tot je grote verbazing vast, dat het verkeerd is! (fig6) Onze zwarte wijzer staat namelijk verkeerd. De nulpositie van een klok(blauw) verschilt 90° van die van op ons embryo(rood). Dus we moeten onze functie aanpassen. We hadden:
RadHoek=sec*6*PI/180
Daar moet 90° van de hoek af, of 270° er bij:
RadHoek=(sec*6+270)*PI/180 of
RadHoek=(sec+45)*PI/30
De code wordt:

Option Explicit
Const PI = 3.14159267 
Const a = 1000
Const b = 2000
Private Sub Timer1_Timer() Dim sec As Integer
sec = Second(now) + 45 Line1.X2 = a * Cos(sec * PI / 30) + b Line1.Y2 = a * Sin(sec * PI / 30) + b End Sub
fig6
(fig6)
fig7
(fig7)
3 Minutenwijzer
3.1 Algemeen
Identiek hetzelfde als bij de secondewijzer.
3.1 Specifiek
Nu plaatsen we een tweede Line-object (rood) op onze form, met zelfde X1 en Y1 als onze secondewijzer, nl 2000 (b).
Onze Timer1_Timer wordt:
Private Sub Timer1_Timer()
    Dim sec As Integer
    Dim min As Integer
    sec = Second(Now) + 45   'Het aantal seconden
    min = Minute(Now) + 45
    Line1.X2 = a * Cos(sec * PI / 30) + b
    Line1.Y2 = a * Sin(sec * PI / 30) + b
    
    Line2.X2 = a * Cos(min * PI / 30) + b
    Line2.Y2 = a * Sin(min * PI / 30) + b
End Sub
...en ons klokje ziet er uit zoals op fig 7.

4 Uurwijzer
4.1 Algemeen
Het uurwijzertje is bijna hetzelfde als de secondewijzer, behalve dan dat er 12 uur zijn ipv 60. Dus:

RadHoek=(hou*30+270)*PI/180 of
RadHoek=(hou+9)*PI/6

4.2 Specifiek
We voegen nog een wijzerke toe (mauve :p), en samen met deze code

Private Sub Timer1_Timer()
    Dim sec As Integer
    Dim min As Integer
    Dim hou As Integer
    sec = Second(Now) + 45   'Het aantal seconden
    min = Minute(Now) + 45
    hou = Hour(Now) + 9
    
    Line1.X2 = a * Cos(sec * PI / 30) + b
    Line1.Y2 = a * Sin(sec * PI / 30) + b
    
    Line2.X2 = a * Cos(min * PI / 30) + b
    Line2.Y2 = a * Sin(min * PI / 30) + b
    
    Line3.X2 = a * Cos(hou * PI / 6) + b
    Line3.Y2 = a * Sin(hou * PI / 6) + b
   
End Sub
... vormt dat fig 8.
Proficiat met uw analoog klokje!!!
Het ziet er natuurlijk nogal saai uit, en daarom:
fig8
(fig8)

fig9
(fig9)

fig10
(fig10

(fig11)

5 Toeters en bellen
5.1 Toeters
De constante a die we 1000 genomen hebben om te beginnen, bepaalt de lengte van de wijzer. Als we dus de a van de uurwijzer 750 ipv 1000 nemen, zal deze een 1/4 korter zijn dan de andere twee wijzers. Met een cirkel rond de wijzers (middelpunt(b,b) en straal 1050 krijgen we iets zoals fig 9.
5.2 Bellen
Eigenlijk ziet het er nog doodsaai uit, met die lijntjes-wijzers, en wie heeft ooit gezegd dat wijzers maar uit 1 lijntje mogen bestaan?
Probeer eens uit te zoeken hoe fig 10 na te bootsen.
We hebben tot nu toe voor zowel X als Y dezelfde constante a (1000) genomen, maar als we voor Y 6/10 daarvan nemen, dan krijgen we een ellipsvormig klokje ipv een rond, zoals te zien is in fig 11.

6 Volledig

Option Explicit
Const PI = 3.14159265358979 Const a = 1000 'straal Const b = 2000 'middelpunt
Private Sub Timer1_Timer() Dim sec As Integer Dim min As Integer Dim hou As Integer sec = Second(Now) + 45 'seconden + correctie min = Minute(Now) + 45 hou = Hour(Now) + 9 'secondewijzer met a(Y)=(a * 6 / 10) Line1.X2 = a * Cos(sec * PI / 30) + 2000 Line1.Y2 = (a * 6 / 10) * Sin(sec * PI / 30) + 2000 'minuutwijzer Line2.X2 = a * Cos(min * PI / 30) + 2000 Line2.Y2 = a * 6 / 10 * Sin(min * PI / 30) + 2000 'bellen voor minuutwijzer f21.X1 = Line2.X2 f21.Y1 = Line2.Y2 f22.X1 = Line2.X2 f22.Y1 = Line2.Y2 f21.X2 = 200 * Cos((min + 4) * PI / 30) + 2000 f21.Y2 = 200 * 6 / 10 * Sin((min + 4) * PI / 30) + 2000 f22.X2 = 200 * Cos((min - 4) * PI / 30) + 2000 f22.Y2 = 200 * 6 / 10 * Sin((min - 4) * PI / 30) + 2000 s21.X1 = Line2.X1 s21.Y1 = Line2.Y1 s22.X1 = Line2.X1 s22.Y1 = Line2.Y1 s21.X2 = f21.X2 s21.Y2 = f21.Y2 s22.X2 = f22.X2 s22.Y2 = f22.Y2 'uurwijzer 1/4 korter dan minuutwijzer Line3.X2 = a * 3 / 4 * Cos(hou * PI / 6) + 2000 Line3.Y2 = a * 6 / 10 * 3 / 4 * Sin(hou * PI / 6) + 2000 'bellen voor uurwijzer f1.X1 = Line3.X2 f1.Y1 = Line3.Y2 f2.X1 = Line3.X2 f2.Y1 = Line3.Y2 f1.X2 = 200 * Cos((hou + 4 / 5) * PI / 6) + 2000 f1.Y2 = 200 * 6 / 10 * Sin((hou + 4 / 5) * PI / 6) + 2000 f2.X2 = 200 * Cos((hou - 4 / 5) * PI / 6) + 2000 f2.Y2 = 200 * 6 / 10 * Sin((hou - 4 / 5) * PI / 6) + 2000 s1.X1 = Line3.X1 s1.Y1 = Line3.Y1 s2.X1 = Line3.X1 s2.Y1 = Line3.Y1 s1.X2 = f1.X2 s1.Y2 = f1.Y2 s2.X2 = f2.X2 s2.Y2 = f2.Y2 End Sub
De source valt hier te downloaden.
7 Slot
Zo, we zijn er van af. Moest ik ergens met mijn code de mensenrechten schenden, of ingaan tegen de ethiek van de scene, of gewoon onvolledig of onduidelijk zijn, kun je me dat altijd laten weten. Commentaar is altijd welkom. Ik ben altijd te bereiken via IRC op irc.krey.net, op channel #botwars, of via mail op davyhollevoet at hotmail dot com.