Pyhton_uhr

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Cabasa
User
Beiträge: 4
Registriert: Mittwoch 6. Januar 2016, 20:48

Hallo alle Wissenden und Helfenden..

Ich habe erst vor kurzen begonnen mich mit Python zu beschäftigen.
Und schon bei meiner ersten Idee stosse ich schon an meine Grenzen.

Ich hatte mir vorgenommen mal eine Analoge Uhr in einem Fenster azuzeigen, allerding in einen 24 Stunden - Format..
also mit nur einem Zeiger.... (Zusätzlich sollte noch die Zeit in bewährter Art und Weise (mit Zahlen) innerhalb der Uhr angezeigt werden)
Fragt mich bitte nicht wie ich auf so eine Idee komme...:)

Ich beschloss mich zu benutzung von Pygame als Unterstützung (circle für den Rand der Uhr, und Line für den Zeiger..)
Allerdings bekomme ich es nicht hin, mit der aus der Zeit berechneten Gradzahl ((Stunden*3600 + Minuten*60 + Sekunden)/240)
den Zeiger in die richtige Position zu bringen..(Dieser würde sich auch sehr langsam bewegen..).

Aslo biite ich mal um Vorschläge wie ich diese Problem evtl in den Griff bekomme...
(Anhand der Gradzahlen (Umrechnen in Bogenmasse??) die Zielpunkte inerhelb des 24 Stunden Ziffernblattes zu bekommen...)

Danke schon mal...
Diese Dokument enthält keine Signatur, da dafür eine Mehrwertsteuer von 19% fällig wäre !
Üpsilon
User
Beiträge: 222
Registriert: Samstag 15. September 2012, 19:23

Dafür musst du dich ein bissl an die Mathematik der neunten Klasse erinnern.

OK, ich kürze das mal ab:
3 Uhr ist 0 Grad (weil grade nach rechts), also 0 im Bogenmaß. (Bzw 6Uhr bei der 24h-Uhr)
Eine Stunde später entspricht 30° weniger. Das sind Pi/6 im Bogenmaß. (Oder 15° und Pi/12 in deiner komischen 24h-Uhr.)
-> Winkel = -Pi/6 * (Uhrzeit - 3)

Hätten wir das schonnmal geklärt. Den Stundenzeiger zeichnest du jetzt als Strich vom Mittelpunkt der Uhr folgendermaßen:
Nach oben: Y=sin(Winkel) * Zeigerlänge
nach rechts: X=cos(Winkel) * Zeigerlänge

LG.
PS: Die angebotene Summe ist beachtlich.
Cabasa
User
Beiträge: 4
Registriert: Mittwoch 6. Januar 2016, 20:48

Erstmal Danke für den Fixen Tipp...

Schule 9. Klasse... mann das war im letzten Jahrtausend... und dan noch SIn() und Cos()...Tilt !!!
:D

Ich habe mal das Programm hier angehängt.. da ich immo nicht weiterkomme... er macht zwar was..
aber irgendwie nichts richtig...
evtl mal drüberschauen... und die richtige Idee finden...

Danke !

Code: Alles auswählen

#Fenster einrichten und benennen
uhr = pygame.display.set_mode ((860,860))
pygame.display.set_caption ("Die 24-Stunden-Uhr !")

#Farbe für Uhrenkranz und Zeiger
coloruhr = pygame.Color (0,255,0)
colorzeiger = pygame.Color (255,0,0)

#Radius für Kreis und Zeigerberechnen
radius = 400

#Uhrenkranz
for durchmesser in range (390,401):
    pygame.draw.circle(uhr,coloruhr,(430,430),durchmesser,1)

#Endlosschleife (ja ... ich weiss macht man nicht so...)
while True:

    #Zeitauslesen und in Stunde, Minute, Sekunde aufspalten
    zeit = localtime ()
    stunde = zeit[3]
    minute = zeit[4]
    sekunde = zeit[5]

    #Winkelberechnung anhand der Zeit
    #24 Stunden mal 3600 ergibt 86400 (=1 Tag) das durch 360 ergibt 240
    #das heist also aller 240 sek (4 Minuten) sollte sich der Zeiger bewegen.. 
    alpha = round((stunde*3600+minute*60+sekunde)/240,0)
     
    
    #Endpunkte des Zeigers auf der Uhr brechnen
    #Anhand des radius und +430 pixel damit er auf 
    #den Uhrkranz trifft...
    punktx = round(radius*cos(alpha),0)+430
    punkty = round(radius*sin(alpha),0)+430
    
    #Tadaa ! Und den Zeiger zeichnen...           
    pygame.draw.aaline(uhr,colorzeiger,(430,430),(punktx,punkty),1)

    pygame.display.flip()
------------------------------------------------------------------------------------------

:?:
Zuletzt geändert von Anonymous am Donnerstag 7. Januar 2016, 22:59, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Diese Dokument enthält keine Signatur, da dafür eine Mehrwertsteuer von 19% fällig wäre !
sepplx123
User
Beiträge: 13
Registriert: Montag 14. Dezember 2015, 04:13

Füge doch einfach mal mehr "print"-Anweisungen ein und lass dir den berechneten Winkel und die Punkte anzeigen. Da müsstest du doch recht schnell sehen, dass deine beiden Formeln noch fehlerhaft waren und nichts gescheites dabei raus kam.

Zum Winkel brauche ich denke ich nichts sagen oder? Das sollte ersichtlich sein wie die Formel lauten muss.
Bei den Koordinaten von punktx und punkty wird der Winkel für "cos" und "sin" im Bogenmaß erwartet. Mit der Ergänzung "alpha/180*pi" wird das erledigt. Die "-90"Grad werden dann noch abgezogen, weil 0-Grad nicht "oben" ist sondern "rechts" am Kreis. Das kannste dir ja mal bei WIkipedia oder so nochmals genauer anschauen.

Anbei mal die Anpassung damit es funktioniert.

Code: Alles auswählen

x = True

#Fenster einrichten und benennen
uhr = pygame.display.set_mode ((860,860))
pygame.display.set_caption ("Die 24-Stunden-Uhr !")
 
#Farbe für Uhrenkranz und Zeiger
coloruhr = pygame.Color (0,255,0)
colorzeiger = pygame.Color (255,0,0)
 
#Radius für Kreis und Zeigerberechnen
radius = 400
 
#Uhrenkranz
for durchmesser in range (390,401):
    pygame.draw.circle(uhr,coloruhr,(430,430),durchmesser,1)
 
#Endlosschleife (ja ... ich weiss macht man nicht so...)
while x==True:
 
    #Zeitauslesen und in Stunde, Minute, Sekunde aufspalten
    zeit = time.localtime()
    stunde = zeit[3]
    minute = zeit[4]
    sekunde = zeit[5]
 
    #Winkelberechnung anhand der Zeit
    #24 Stunden mal 3600 ergibt 86400 (=1 Tag) das durch 360 ergibt 240
    #das heist also aller 240 sek (4 Minuten) sollte sich der Zeiger bewegen..
    alpha = round((stunde*3600+minute*60+sekunde)/86400*360,3)
    print('alpha:',alpha)
    
    #Endpunkte des Zeigers auf der Uhr brechnen
    #Anhand des radius und +430 pixel damit er auf
    #den Uhrkranz trifft...
    punktx = round(cos(alpha/180*pi-90),3)*radius + 430
    punkty = round(sin(alpha/180*pi-90),3)*radius + 430
    print('punktx:',punktx,'punkty:',punkty)
   
    #Tadaa ! Und den Zeiger zeichnen...          
    pygame.draw.aaline(uhr,colorzeiger,(430,430),(punktx,punkty),1)
 
    pygame.display.flip()
    x=False
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

zum Umrechnen gibt es die Funktion math.radians, dann sollte noch die -90 auf der richtigen Seite der Klammer stehen. Was für einen Sinn hat denn eigentlich die Runderei? Wenn schon möchte man doch, dass der Zeiger Punkt 12 Uhr auf 12 umspringt und nicht schon ein paar Minuten vorher.
Cabasa
User
Beiträge: 4
Registriert: Mittwoch 6. Januar 2016, 20:48

Hallo Leute...

Super Hilfe... und dann auch noch so fix...

Das mit dem umrechnen in Bogenmass hatte ich heute auch schon gefunden... und mein Progg darauf umgestellt...
mit

alpha = round((stunde*3600+minute*60+sekunde)/240-90,0)

bogen = radians(alpha)

..... Funzt es...

Aja und das das mit der Ausgabe der einzelnen Werte über print() hatte ich auch drinne, nur zum posten hier rausgenommen.. .)

Das Runden nehm ich, damit der aaline eine ganze zahl als x,y bekommt, und wie gesagt... ist nur ne Spielerei aber so fängt es immer an...
Diese Dokument enthält keine Signatur, da dafür eine Mehrwertsteuer von 19% fällig wäre !
BlackJack

@Cabasa: Du rundest auf drei Nachkommastellen damit Du ganze Zahlen bekommst? Darüber solltest Du vielleicht noch mal nachdenken. ;-) Lass das runden sein, das macht keinen Sinn.
Cabasa
User
Beiträge: 4
Registriert: Mittwoch 6. Januar 2016, 20:48

Danke für den Kommentar...

Aber ich Runde auf 0 Stellen....das mit den 3 Stellen kam vom seppl....

Hast aber Recht.. Fuktioniert auch ohne Runden.... und spart auch noch Rechenzeit.. und Speicherplatz....

:P
Diese Dokument enthält keine Signatur, da dafür eine Mehrwertsteuer von 19% fällig wäre !
Antworten