Navigation überspringen

Miniprojekt: Analoge Uhr

Beabsichtigte Lernziele

In diesem Beispiel soll eine analoge Uhr mit Stunden-, Sekunden- und Minutenzeiger programmiert werden. Dabei sollen die GUI-Anbindungen Java-Swing und Java-AWT zur Verwendung kommen.

Problemverständnis

  1. Analoge Uhren sind gekennzeichnet durch eine fortlaufende Kreisbewegung aller Zeiger.
  2. Die Auflösung der jeweiligen Zeiger hängt jedoch von ihrer Zeiteinteilung ab. So teilt sich für den Stundenzeiger der Kreis im einfachsten Falle auf zwölf Teilsegmente auf, für den Minuten und Sekundenzeiger in 60 Teile.
  3. Die Zeiger sollten aufgrund ihrer Farbe und Länge unterscheidbar sein.
  4. Die GUI / Grafik muss sich selbstständig aktualiesieren.

Kreisbewegungen

Aus dem mathematisch / technischen Umfeld sind Kreisfunktionen bekannt. Die Zeigerbewegung auf einem festen Radius läßt sich einfach mit Hilfe der Polarkoordinaten darstellen:

Quelle: https://de.wikipedia.org/wiki/Polarkoordinaten

Der Punkt P ist also nur noch abhängig von dem gewählten Radius und dem eingeschlossenen Winkel.

Am Beispiel des Stundenzeigers wollen wir diesen Umstand auf die Uhrezit übertragen.

Kreiseinteilung berechnen:

Analog-Uhren unterscheiden nicht nach Tageszeit sondern stellen in der Einteilung von zwölf Stunden die Uhrzeit dar. Aus diesem Grunde können wir den Kreis in zwölf gleich große Teilsegmente teilen.

\Delta \Phi_{Stunde} = \frac{360^{°}}{12}=30^{°}

1. Im nächsten Schritt müssen wir beachten, dass die mathematische Zählrichtung im Einheitskreis gegen den Uhrzeigersinn bei der positiven Abzisse (x-Achse) startet. Analog-Uhren hingegen starten bei der positiven Ordinate (y-Achse) und laufen mit dem Uhrzeigersinn. Den Versatz  von der positiven Abzisse zur positiven Ordniate können wir einfach berücksichtigen, indem wir 90° zu dem resultierenden Winkel aufaddieren. Das ist immergültig, da in kartesischen Koordinatensystemen (wie oben gezeigt) Abzisse und Ordinate orthogonal (rechwinklig) zueinander stehen.

2. Die gegenläufige Zählrichtung ist etwas schwieriger zu beachten. Bei periodischen Bewegungen ist es mathematisch möglich die Drehrichtung umzudrehen, indem man von einer vollen Umdrehung die Teilumdrehung abzieht. Das heißt für den Stundenzeiger:

12 - i_{ZaehlerStunde} \cdot \Delta \Phi_{Stunde}

3. Aus 1. beachten wir nun noch die Addition um 90°

\Phi_{Stunde} = 12 - i_{ZaehlerStunde} \cdot \Delta \Phi_{Stunde} + 90°

Berechnung der Zeiger-Endkoordinaten

Zur Vorbereitung für die Zielplatform Java, rechnen wir die Oben gefundenen Winkelinformationen des Stundenzeigers um in kartesische (x- und y-Wert) Koordinaten.

WIKIPEDIA gibt uns Antwort:

x=r_{Stunde} \cdot cos(\Phi_{Stunde}) \\ y=r_{Stunde} \cdot sin(\Phi_{Stunde})

Koordinatenvorbereitung für Java

Die x- und y-Werte können negativ sein, siehe Zeichnung oben. In unserer Zielplatform Java können wir das nicht darstellen. Die Analog-Uhr soll in einem Java-Swing JForm dargestellt werden. Zur Umsetzung müssen wir daher noch die Verschiebung des oben gezeigten Diagramms in die Fenstermitte beachten.

Reflexion

Setzen Sie die oben gezeigten Ansätze mit den zusätzlichen Forderungen nach Unterscheidbarkeit der Zeiger in Java-Swing und Java-AWT um. Folgende Hinweise sollen Ihnen dabei helfen:

  • nutzen Sie die repaint()-Funktion. Beachten Sie dabei, dass Java stets mit der paint()-Funktion zeichnet. Ein repaint() kann daher auf sämtliche Container, Panel usw. angewendet werden. Statische Elemente sind jedoch nicht möglich mit repaint() neu zu zeichnen.
  • Gestalten Sie Ihren Quelltext so, dass sie einfach Größenanpassungen durchführen können. Das heißt, erzeugen Sie beispielsweise den Mittelpunkt des Fensters nicht fest sondern ermitteln ihn mit Hilfe von Container-Funktionen.