Objektorientierte Programmierung


Sketch: Geometrie-Editor


Für diesen Sketch benötigen Sie eine Tastatur und eine Maus. Um einen Punkt zu erzeugen, klicken Sie mit der linken Maustaste auf die Oberfläche. Um diesen Punkt zu markieren, muss man gleichzeitig die SHIFT-Taste drücken. (Mit der SHIFT-Taste links oder rechts erzeugt man Großbuchstaben).
Hält man die linke Maustaste auf einem Punkt gedrückt und bewegt die Maus, kann man diesen Punkt verschieben – alle von ihm abhängigen Objekte (Geraden, Kreise, Schnittpunkte …) passen sich dabei automatisch an.
Eine Gerade bzw. Strecke markiert man mit der rechten Maustaste. Es gibt eine Unmenge geometrische Figuren, die man hier eintragen kann. Welche Tasten verwendet werden müssen, ist unten dargestellt.




Tasten- oder Mausaktion Wirkung
Taste l Strecke, zwei Punkte
Taste g Gerade, zwei Punkte
Taste m Mittelsenkrechte, zwei Punkte
Taste h Seitenhalbierende, drei Punkte, vom ersten aus
Taste w Winkelhalbierende, drei Punkte, vom ersten aus
Taste o Lot, drei Punkte, vom ersten aus
Taste p Parallele, drei Punkte, Parallele durch den ersten
Taste r Rechteck, zwei Punkte
Taste c Kreis, zwei Punkte, Mittelpunkt auf dem ersten
Taste e Ellipse, drei Punkte, erster Punkt ist der Punkt in der Mitte
Taste y Polygon, mindestens drei Punkte, Verbindung der Punkte nach der Reihe
Taste q Schnittpunkt, zwei Geraden oder Strecken
Taste b Punkt auf Gerade, eine Gerade oder Strecke, ein Punkt
Taste v Pfad, vier Punkte
Taste x Bezier-Kurve, vier Punkte
Taste d Markierte Objekte löschen

Die in der Tabelle erwähnte Anzahl von Punkten bzw. von Geraden müssen vor dem entsprechenden Tastendruck markiert sein!
Hier erfährt man, was Pfade und Bezier-Kurven sind.

Objektorientierter Entwurf dahinter

Interessant an diesem Sketch ist weniger die Zeichnerei selbst als der Entwurf im Hintergrund. Jedes Objekt – Punkt, Gerade, Kreis, Schnittpunkt, Mittelsenkrechte usw. – ist eine eigene Klasse, die von einer gemeinsamen abstrakten Basisklasse (z. B. KonstruktionsObjekt) erbt. Diese Basisklasse schreibt vor, dass jede Unterklasse mindestens zwei Methoden implementieren muss: eine zum Zeichnen (zeichne()) und eine zum Neuberechnen der eigenen Lage (berechne()), sobald sich ein abhängiges Objekt ändert. Weil jede Unterklasse diese Methoden auf ihre eigene Weise umsetzt – ein Kreis berechnet seinen Radius anders als eine Mittelsenkrechte ihre Steigung – spricht man hier von Polymorphie: Der Editor kann durch die ganze Liste aller Objekte laufen und einfach objekt.zeichne() aufrufen, ohne zu wissen oder zu unterscheiden, um welchen konkreten Typ es sich handelt.

Damit das Verschieben eines Punktes automatisch alle abgeleiteten Objekte aktualisiert, merkt sich jedes Objekt, von welchen anderen Objekten es abhängt (bei einer Geraden z. B. ihre beiden Randpunkte, bei einem Schnittpunkt die beiden sich schneidenden Geraden). Logisch bilden alle Konstruktionsobjekte damit einen gerichteten azyklischen Graphen (DAG) – den sogenannten Abhängigkeitsgraphen. Wird ein Basispunkt verschoben, muss nicht die gesamte Konstruktion neu berechnet werden, sondern nur der Teil, der über Kanten dieses Graphen von dem verschobenen Punkt erreichbar ist. Damit das in der richtigen Reihenfolge geschieht – ein Schnittpunkt darf erst neu berechnet werden, wenn beide ihn definierenden Geraden schon aktuell sind – durchläuft man den Graphen in topologischer Sortierung: Objekte ohne offene Abhängigkeiten zuerst, dann schrittweise alle, deren Voraussetzungen bereits erfüllt sind. Entstünde dabei ein Zyklus (ein Objekt hängt, direkt oder über Umwege, von sich selbst ab), gäbe es keine gültige Reihenfolge mehr – deshalb muss der Editor beim Anlegen neuer Objekte darauf achten, dass kein Objekt von einem Objekt abhängt, das wiederum (mittelbar) von ihm selbst abhängt.

Dieses Muster – Objekte, die sich bei Änderung ihrer Abhängigkeiten selbst aktualisieren – ist als Observer-Entwurfsmuster bekannt und findet sich in ähnlicher Form in jeder dynamischen Geometrie-Software (z. B. GeoGebra) sowie in Tabellenkalkulationen: Auch dort löst die Änderung einer Zelle die Neuberechnung aller Zellen aus, deren Formel direkt oder indirekt auf diese Zelle verweist – und auch dort muss, intern, in topologischer Reihenfolge neu gerechnet werden.

Sketch Geometrie-Editor

Menu