Koordinaten AUF Kreis errechnen (Analoge Uhr)

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Koordinaten AUF Kreis errechnen (Analoge Uhr)

Beitrag von Bisonte »

Hallo miteinander.

Ich habe gerade mal ein mathematisches Problem,
wo ich grade wie der Ochs vorm Berge stehe :

Ich möchte mit 2D Befehlen eine analoge Uhr zeichnen.
Das ist an sich nicht das Problem (ganz simpel ein Kreis).

Nun kommen die Zeiger... Wie berechne ich die Koordinaten auf
der Kreislinie für den Line() Befehl... ?
Und wie berechne ich die Unterteilungen (in Sekunden und Stunden),
also wohin der Zeiger z.B. bei 22 Sekunden zeigen muss.

Da ich grad nicht weiss wie man das mathematisch nennt hilft mir Google
leider auch nicht weiter ;)

P.S. Es gab mal einen Code für diese Uhr aus dem Film das Boot, nur wurde dort
mit Screen und Sprite3D gearbeitet und dort entdeckte ich nicht mal den Ansatz
irgendeiner Formel...
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

Re: Koordinaten AUF Kreis errechnen (Analoge Uhr)

Beitrag von NicknameFJ »

Hallo Bisonte,

hier ein Link zu einem Analoguhr Programm von Stargate

http://www.purebasic.fr/german/viewtopi ... r&start=10

Vielleicht kannst Du Dir hieraus die nötigen Anregungen ziehen.

Grüße

NicknameFJ
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Koordinaten AUF Kreis errechnen (Analoge Uhr)

Beitrag von Bisonte »

Vielen Dank ...

Das sieht vielversprechend aus.
Hätt ich mir ja denken können, dass was matheartiges von Stargate ist ;)
Aber durchwühl mal seine gefühlten 2 Mio. Posts nach dem Wort Uhr ....
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Koordinaten AUF Kreis errechnen (Analoge Uhr)

Beitrag von STARGÅTE »

Der Source ist dort aber etwas übertrieben.

Eigentlich brauchst du nur sowas hier:

Code: Alles auswählen

Procedure.f ClockX(Value.f)
  ProcedureReturn Sin(Value*#PI*2)
EndProcedure

Procedure.f ClockY(Value.f)
  ProcedureReturn -Cos(Value*#PI*2)
EndProcedure
welched dir X, und Y geben wenn du der Prozedure eine Normierte Zeit gibst (Stunde/12, Minute/60, Sekunde/60)

Code: Alles auswählen

Enumeration
 #Window
 #Timer
 #Gadget
 #Image
EndEnumeration


Procedure.f ClockX(Value.f)
  ProcedureReturn Sin(Value*#PI*2)
EndProcedure

Procedure.f ClockY(Value.f)
  ProcedureReturn -Cos(Value*#PI*2)
EndProcedure

Procedure UpdateImage()
  Protected Hour, Minute, x, y
  Protected Time = Date()
  StartDrawing(ImageOutput(#Image))
    DrawingMode(#PB_2DDrawing_AllChannels)
    Box(0, 0, 400, 400, $00000000)
    DrawingMode(#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Transparent)
    ; Uhrhintergrund
    ; Stunden
    For Hour = 1 To 12
      x = 200+ClockX(Hour/12)*180 - TextWidth(Str(Hour))/2
      y = 200+ClockY(Hour/12)*180 - TextHeight(Str(Hour))/2
      DrawText(x, y, Str(Hour), $FF000000)
    Next
    ; Minuten/Sekunden
    For Minute = 1 To 60
      x = 200+ClockX(Minute/60)*160
      y = 200+ClockY(Minute/60)*160
      If Minute%5=0
        Circle(x, y, 3, $FF000000)
      Else
        Circle(x, y, 2, $80000000)
      EndIf
    Next
    ; Zeiger
    ; Stunde (mit Minutendifferenz)
    x = 200+ClockX(Hour(Time)/12+Minute(Time)/60/12)*100
    y = 200+ClockY(Hour(Time)/12+Minute(Time)/60/12)*100
    LineXY(200, 200, x, y, $FF000000)
    ; Minuten
    x = 200+ClockX(Minute(Time)/60)*140
    y = 200+ClockY(Minute(Time)/60)*140
    LineXY(200, 200, x, y, $FF000000)
    ; Sekunden
    x = 200+ClockX(Second(Time)/60)*160
    y = 200+ClockY(Second(Time)/60)*160
    LineXY(200, 200, x, y, $FF000000)
  StopDrawing()
  SetGadgetState(#Gadget, ImageID(#Image))
EndProcedure


CreateImage(#Image, 400, 400, 32|#PB_Image_Transparent)

OpenWindow(#Window, 0, 0, 400, 400, "Analoge Uhr", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
  ImageGadget(#Gadget, 0, 0, 400, 400, ImageID(#Image)) : UpdateImage()
  
AddWindowTimer(#Window, #Timer, 1000)

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      End
    Case #PB_Event_Timer
      Select EventTimer()
        Case #Timer
          UpdateImage() 
      EndSelect
  EndSelect
ForEver
EDIT:
Mit rotierten Sprites3D gehts natürlich einfacher, da brauchst du dann nur die Normierte Zeit *360 rechnen und bekommst die richtige Rotation
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Koordinaten AUF Kreis errechnen (Analoge Uhr)

Beitrag von Bisonte »

Das ist natürlich noch einfacher ;) Danke...

Aber Sprite3D und Screen ist ein wenig "overdressed" für ein kleines "Uhrengadget" was ich versuche ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Antworten