Autoren - Graphische Datenverarbeitung - Goethe

Werbung
Autor
Thore Tams ([email protected]), Informatik
Aufgabenstellung
Für die an der Professur für Graphische Datenverarbeitung der Johann Wolfgang
Goethe-Universität in Entwicklung befindliche WBT1-Umgebung „LernBar“ war ein
Kurs zum Thema „Rasteralgorithmen“ auf Grundlage von [FOLE] zu erstellen.
Rasteralgorithmen dienen der Annäherung zu zeichnender Strukturen (Linien, Kreise
etc.) auf einem Rasterdisplay. Die einzelnen Seiten in einem LernBar-Kurs werden in
HTML geschrieben, hierzu existieren Vorlagen für Macromedia Dreamweaver. Für
die interaktiven Elemente des Kurses waren Java-Applets unter Verwendung von
Java3D zu programmieren. Die Zielgruppe des Kurses sollten Studierende der
Informatik, Informatiker und an graphischer Datenverarbeitung interessierte
Personen sein.
Kursstruktur
Die Literaturvorlage zum Kurs besteht aus drei Teilen, die sich mit Rasteralgorithmen
zum Zeichnen von Linien, Kreisen und Ellipsen in dieser Reihenfolge befassen. Die
vorgestellten Algorithmen werden ebenfalls in dieser Reihenfolge komplizierter, so
dass es keinen Sinn hat, hier eine Umstellung vorzunehmen. Linien, Kreise und
Ellipsen machen je eine Lerneinheit aus. In jeder Lerneinheit wird zunächst ein nahe
liegender, offensichtlicher Ansatz zum Zeichnen der Grafikprimitiven vorgestellt und
dann dessen Nachteile verdeutlicht werden. Grafische Probleme der simplen
Ansätze werden an einem Applet veranschaulicht. Auf folgenden Seiten wird dann
ein Midpoint-Algorithmus hergeleitet. Der resultierende Midpoint-Algorithmus wird
zum Abschluss der Lerneinheit wieder in Form eines Applets visualisiert.
Didaktische Überlegungen
Die wichtigste didaktische Anforderung an einen Kurs ist sicher die, dass der
vorgestellte Stoff vom Lernenden verstanden wird. Unnötige Komplexität muss
vermieden werden. Andererseits darf sich der Lernende nicht langweilen, da gerade
an Computern viele ablenkende Faktoren zu finden sind. Wer checkt nicht häufiger
als sonst seine E-Mail, wenn die gerade am Computer zu bearbeitende Aufgabe
langweilig oder ungeliebt ist?
1
Web Based Training
Darstellung
Die vorgestellten Algorithmen sollen vom User in Aktion betrachtet werden können.
Er sollte einen möglichst umfassenden Überblick über grafische Ausgabe, aktuelle
Position im Algorithmus und Wert der verwendeten Variablen haben. Diese
Anforderungen sind denen eines Debuggers für eine Programmiersprache nicht
unähnlich.
Der andere wichtige Aspekt dieses Kurses ist die Herleitung der Algorithmen, die
Erklärung, warum sie so funktioniert, wie sie funktionieren. Direkt aus den
Algorithmen wird dies nicht offensichtlich: Die vorgenommenen Umformungen, um
einen inkrementellen Algorithmus zu erhalten, verschleiern die zu Grunde liegenden
Funktionen. Die Frage, woher die zur Entscheidungsvariablen addierten Deltas
kommen, ist nicht intuitiv durch Betrachten des Codes zu beantworten.
Somit kommt der Herleitung der Algorithmen von der impliziten Funktionsgleichung
bis zur inkrementellen Berechnung eine größere Bedeutung zu. Dieser
mathematiklastige Prozess lässt sich nur als Text dargestellt wirklich verstehen; die
vorgenommen Umformungen korrespondieren nicht visuell eingängig mit grafischen
Vorgängen. Da dieses Problem die Didaktik der Mathematik und verwandter
Wissenschaften allgemein interessieren dürfte, wäre eine Lösung wünschenswert
gewesen, Genius und Zeit haben aber nicht ausgereicht.
Interaktion
Der grundlegende Vorteil des Computer Based Training gegenüber einem Buch ist
die größere Einbindungsmöglichkeit des Lernenden. Er soll nicht nur Seiten
umblättern, sondern auch Geschehen beeinflussen können, was einen Kurs
letztendlich interessant und fesselnd werden lässt. Vor diesem Hintergrund dürfen
interaktive Elemente aber nicht um ihrer selbst willen eingesetzt werden, sondern
müssen einen echten Mehrwert bieten. Hier entstehen bei der Vorstellung von
Algorithmen gewisse Schwierigkeiten. Überlegte und verworfene Ansätze für eine
erhöhte Interaktion mit dem User sind:
1. Festlegen eigener Start- und Endpunkte der Linien
Besonders die vorgestellten Line-Algorithmen müssen im allgemeinen Fall
Steigung und Richtung der zu zeichnenden Linie beachten, Sonderfälle sind
Vielfache von 45°. Für den Algorithmus bedeutet dies eine Vielzahl an
Fallunterscheidungen, Umdeutungen von Parametern oder Dopplung von
Code. Weiterhin wird nur eine Linie gezeichnet, der Code des Algorithmus
aber schwerer verständlich und in der hier gewählten Form im Applet nicht
mehr sinnvoll darstellbar. Für den Benutzer entsteht kaum ein zusätzlicher
Lerneffekt; demgegenüber steht ein erhöhter Programmieraufwand.
2. Festlegen eigener Radien und Mittelpunkte bei Ellipsen und Kreisen
Durch die Wahl anderer Radien führt bei Kreisen und Ellipsen nicht zu
spektakulären Effekten. Es passiert nichts was nicht auch schon in den
vorgegebenen Beispielen geschieht. Ein anderer Mittelpunkt als der Ursprung
ist eine triviale Erweiterung (Addition eines Offsets zu den Koordinaten), so
dass auch hier der Zugewinn fraglich erscheint.
3. Quiz oder Lernkontrollen
Wie fragt man ab, ob ein Algorithmus verstanden wurde? Mit vernünftigem
Aufwand lassen sich nur Multiple-Choice-Tests oder Lückentexte auswerten.
Die möglichen Multiple-Choice-Fragen zu den vorgestellten Algorithmen sind
entweder trivial („Welcher der aufgeführten Algorithmen hat das beste
Laufzeitverhalten?“) oder müssen auf Details eingehen, die erst bei der
Implementierung des Algorithmus, nicht aber zum grundsätzlichen
Verständnis nötig sind („Liegt der Midpoint bei negativem Vorzeichen der
Entscheidungsvariablen innerhalb oder außerhalb des Kreises?“). Solche
Quiz langweilen eher.
Von den angedachten interaktiven Elementen blieb lediglich ein manueller Modus bei
den Applets mit vorgegebenen Zeichenprimitiven übrig. Nach dem Laden des
Applets startet die Simulation des Algorithmus automatisch und schaltet nach Ablauf
eines festen Intervalls zur nächsten Programmzeile. Am Ende des Algorithmus wird
die Zeichenfläche gelöscht und die Simulation startet erneut. So wird die Aufmerksamkeit des Nutzers erregt. Sollte die Simulation zu schnell laufen, kann auf den
manuellen Modus umgeschaltet werden und dann per Mausklick im Single-StepVerfahren zur nächsten Codezeile gesprungen werden. Der Benutzer hat jetzt die
Möglichkeit, den Code, die Variablen und ihre Werte sowie die resultierende grafische Ausgabe in Ruhe zu betrachten.
Implementierung
Entwicklungsumgebung
Die Entwicklung der Applets und des Kurses fand teilweise in Frankfurt und teilweise
in Krakau statt. In Krakau wurde ein PC unter Windows 2000 verwendet. Als JavaEntwicklungsumgebung stand hier von vornherein Eclipse wegen der gemachten
Erfahrungen während der „Fingerübungen“ in der Anfangsphase des Praktikums
fest. Für die HTML-Seiten wurde eine 30-Tage-Testversion von Macromedia
Dreamweaver MX 2004 verwendet.
In Frankfurt stand Rechner mit Mac OS X 10.2 zur Verfügung. Für diese Version
existiert keine aktuelle Version von Eclipse, jedoch wird von Apple mit dem
ProjectBuilder eine Entwicklungsumgebung mitgeliefert, die auch rudimentär mit
Java umgehen kann. Wichtige Features wie Code Completion sind aber nicht
vorhanden. Schwerer wog jedoch die Nichtverfügbarkeit von Java3D für Mac OS X
10.2, erst für 10.3 steht Java3D zur Verfügung. Diese Faktoren waren dann der
Anlass für ein Betriebssystemupgrade. Der ProjectBuilder wird unter 10.3 durch das
Nachfolgeprodukt Xcode ersetzt, das angeblich auch Code-Completion beherrscht.
Nach einer kurzen Internet-Recherche wurde klar, dass nicht nur ich an der
korrekten Einrichtung dieses Features gescheitert bin. Der sinnvollste Schritt wäre
auch vor dieser Erfahrung schon gewesen, eine für 10.3 verfügbare, aktuelle Version
von Eclipse zu installieren. Ein weiteres Problem ergab sich durch die voreilige
Installation einer 30-Tage-Testversion von Macromedia Dreamweaver. Als die
Seitenerstellung für den Kurs akut wurde, war diese abgelaufen. Der Timestamp für
den Testzeitraum war nicht auffindbar, eine komplette Neuinstallation des Systems
kam jedoch nicht in Frage. Letztlich wurde Dreamweaver unter VirtualPC zum
Laufen gebracht, womit auch gleich eine Testmöglichkeit für die LernBar bestand,
die nur im Internet Explorer unter Windows funktioniert. Leider ist die in VirtualPC
emulierte Grafikkarte nicht Java3D-fähig.
Klassendiagramm
Abbildung 1: Klassendiagramm
Das Klassendiagramm (Abbildung 1) ist an UML angelehnt, die Pfeile geben eine
„extends“- oder „implements“-Relation in Java wieder, die Linien zeigen die
Benutzung einer Klasse an. Aus Platzgründen wurden nicht alle Applet-Klassen
dargestellt und auch ein paar unwesentliche Klassen weggelassen.
Beschreibung der Klassen
Die Applets des Kurses sind sich von der Funktionalität her sehr ähnlich. Darum hat
es sich angeboten, möglichst viele identische Funktionen und Eigenschaften auszulagern. Als zwangsläufige Folge erben alle Applets von einer abstrakten Klasse
AlgorithmApplet, die das Userinterface implementiert, das Weiterschalten um je
einen Schritt in den dargestellten Algorithmen realisiert und mit dem Timer MyTimer
interagiert. Für die Interaktion mit dem Timer musste außerdem das Interface
ActionListener implementiert werden. AlgorithmApplet erzeugt eine Zeichenfläche
und drei Buttons zur Bedienung. Die Zeichenfläche ist ein Canvas, von dem
Canvas3D erbt, von dem wiederum MyGrid erbt.
MyGrid ist für die Verwaltung der Zeichenfläche zuständig. Die Klasse erzeugt bei
der Initialisierung ein Raster und ein Koordinatenkreuz. Es stehen Funktionen für das
Zeichnen von Linien, Kreisen und Ellipsen bereit, die die anzunähernden Grafikobjekte der vorgestellten Algorithmen darstellen. Ironischerweise kennt Java3D keine
direkten Möglichkeiten zum Zeichnen von Kreisen und Ellipsen, so dass diese durch
ein LineStripArray als 360-Eck angenähert werden.
Die vom Algorithmus berechneten Punkte werden durch Sphären dargestellt. Fest
gesetzte Punkte werden durch massive Sphären repräsentiert, mögliche nächste
Punkte des Midpoint-Algorithmus durch transparente Sphären. Diese Punktkandidaten müssen wieder entfernt und somit in der Szene einfach gefunden werden können. Dazu werden alle gesetzten Punkte als Node-Objekte mit ihren Koordinaten in
einer Node-List gespeichert.
Für den Midpoint, der ebenfalls immer wieder entfernt werden muss, wurde ein
anderer Weg beschritten. Per Definition wird nur ein Midpoint unterstützt, dem eine
eigene BranchGroup spendiert wurde. Das Löschen des Midpoints beschränkt sich
auf das Aushängen der BranchGroup.
Die Simulation des Algorithmus wurde in einer Select-Anweisung verpackt. Die
globale Variable gStep gibt immer den nächsten Schritt im Algorithmus vor und dient
der Verzweigung zum jeweiligen Case-Block. Dort werden die Berechnungen des
Algorithmus mit echten Variablen durchgeführt und gStep auf die Nummer der
nächsten auszuführenden Anweisung gesetzt. Schließlich werden eventuell
veränderte Variablen in der Anzeige in MyGrid aktualisiert und die aktuelle
Codetextzeile hervorgehoben. Zwischen der rein internen Variable gStep und der
Zeilennummer des Codetextes besteht kein direkter Zusammenhang. Die Simulation
befindet sich in der Routine doStep, deren Aufruf entweder vom Timer oder vom
Step-Button aus initiiert wird.
Oberflächendesign
Für die Benutzeroberfläche wurde eine möglichst klare, nicht überladene Lösung
bevorzugt. Außerdem musste auf Grund des beschränkten Platzes der Zeichenfläche so viel Platz wie möglich gegeben werden. Die vom Layout vorgegebenen
Schablonen für Applets waren generell breiter als hoch, so dass die Buttons am
rechten Rand angeordnet wurden.
Um die Applets möglichst portabel zu halten, wurde auf eine pixelgenaue Ausrichtung der Bedienelemente verzichtet und auf die Layoutmechanismen von Java
vertraut. Insbesondere bleibt so die Flexibilität bestehen, die Applets in unterschiedlichen Größen in den Schablonen der Lernbar zu benutzen. Unter Mac OS X
(Abbildung 2) sieht das Resultat sogar recht ansprechend aus, unter Windows
(Abbildung 3) stört der fehlende Abstand der Buttons zu den Nachbarelementen
etwas.
Abbildung 2: Buttons unter Mac OS X
Abbildung 3: Buttons unter Windows
2000
Das wichtigste Problem bestand darin, Grafikdarstellung, Codedarstellung und Variablendarstellung mit der beschränkten Anzeigefläche in Einklang zu bringen. Wenn
der User alle drei Elemente ohne Probleme im Auge behalten können und gleichzeitig die Grafik nicht zu klein werden soll, müssen diese Darstellungen gemischt werden. Während die Grafik mehr oder weniger die gesamte Zeichenfläche einnimmt,
werden die Variablen des Algorithmus am linken Rand und der Code des Algorithmus am rechten Rand eingeblendet (Abbildung 4).
Abbildung 4: Anzeigefläche der Applets
Als nächstes musste ein Lösung für die sich widersprechenden Anforderungen
„Lesbarkeit des angezeigten Codes“ und „Überblick über möglichst viele Codezeilen“
gefunden werden. Es war schnell klar, dass nicht der gesamte Code auf einmal auf
die Zeichenfläche passt und bewegt werden muss. Da Text3D keine Zeilenumbrüche
unterstützt und auch für die Hervorhebung der aktuellen Codezeile jede Zeile einzeln
ansprechbar sein soll, muss für jede Zeile ein eigenes Text3D-Objekt und daraus ein
Shape3D Objekt generiert werden. Alle Codezeilen zusammen hängen in einer
TransformGroup, um den gesamten Code bequem verschieben zu können. Die
aktuelle Codezeile wird somit immer in der Mitte des Bildschirms angezeigt und
gleichzeitig farblich anders dargestellt.
Quellen
[FOLE] James D. Foley, Andries van Dam, Steven K. Feiner, John F. Hughes:
Computer Graphics: Principles and Practice; Addison-Wesley; Boston; 1990; pp. 7291
[SOWI] Henry Sowizral, Dave Nadeau: Introduction to Programming with Java 3D;
San Diego; 1999; http://www.sdsc.edu/~nadeau/Courses/Siggraph99/
[SUNM] Sun Microsystems: Java 3D 1.3.1 Implementation Documentation; Santa
Clara; 2003; http://java.sun.com/products/java-media/3D/download.html
Herunterladen