Inhaltsverzeichnis
5.2.1. Zusätzliche Funktionalität bei Mechanismen
Hier wird der in Abschnitt 4. entwickelte Algorithmus zur Visualisierung implementiert. Wie schon bei seinem Entwurf bemerkt, erzeugt dieser Algorithmus bei mehrmaligem Anwenden auf die gleiche Struktur ganz verschiedene Grafiken - je nachdem, welche zufälligen Permutationen der Glieder untersucht werden. Das läßt sich ausnutzen, um dem Anwender für den Fall des Nichtgefallens einer grafischen Darstellung Alternativen anbieten zu können: Das Drücken eines Buttons veranlaßt einfach eine erneute Suche nach einer geeigneten Darstellung. Dabei sollte aber auch ein Rückwärtsgehen möglich sein, um dem Anwender eine echte Auswahl zu ermöglichen. Das Programm muß sich dazu den Startwert des Zufallsgenerators für jede einzelne alternative Darstellung merken, was dadurch erreicht wird, dass es diesen Wert einfach selbst festlegt: Er wird anfangs auf 0 gesetzt und für jede alternative Darstellung um 1 erhöht (Variable alt) [C 39].
Zur Implementierung sind noch einige programmtechnische Details zu klären. Der Kernalgorithmus verbindet Glieder entweder auf geradem Wege, über die obere oder über die untere Hälfte. In der Implementierung wird das dadurch realisiert, dass die Höhe des jeweiligen Gelenks auf 0, 1 oder -1 gesetzt wird [C 46]. Die eigentlichen Gelenkhöhen werden erst nach Abschluss des Kernalgorithmus berechnet [C 48], behalten dann aber dieses Vorzeichen. Zum Bestimmen der Gelenkhöhen wird das gleiche Vorgehen verwendet wie im Kernalgorithmus, nur werden diesmal die Höhen der Gelenke mitverfolgt. Die Verbindungen werden wieder mit steigender Länge durchlaufen, was mit absolut zunehmenden Gelenkhöhen einher geht. Damit die Grafik später auf die gewünschte Größe skaliert werden kann, müssen die maximalen Gelenkhöhen in beiden Richtungen gespeichert werden.
Bei der Verbindung des Gestells wird nicht - wie im Kernalgorithmus - grundsätzlich die obere Verbindung gewählt, wenn diese nicht blockiert ist. Um die Übersichtlichkeit der Grafik zu verbessern, kommt statt dessen ein intelligenteres Verfahren zum Einsatz, das anhand der bisherigen Gelenke des betroffenen Gliedes erkennt, ob dieses eher in der oberen oder eher in der unteren Hälfte liegt. In dieser Hälfte wird das Glied dann auch mit dem Gestell verbunden, sofern möglich [C 47].
Das Formen der endgültigen grafischen Ausgabe aus den Gliedpositionen und Gelenkhöhen unter Weglassen überflüssiger Teile ist recht aufwändig. Die Glieder werden einzeln nacheinander gezeichnet, wobei grundsätzlich zwischen zweigelenkigen und mehrgelenkigen unterschieden werden muß. Bei zweigelenkigen Gliedern [C 34] wird eine einfache Linie zwischen den beiden Gelenken gezogen, die aber u.U. nicht gerade sein darf, um andere Glieder nicht zu überschneiden.
Mehrgelenkige Glieder [C 35] werden als Polygon dargestellt, wobei jedes Gelenk ein Eckpunkt ist. Auch hier können zusätzliche Eckpunkte notwendig sein, um andere Glieder nicht zu überschneiden, oder um eine flächige, nicht entartete Gliedform herzustellen. Die Eckpunkte des Polygons werden reihum entgegen des Urzeigersinnes gesucht. Zuerst müssen also von oben nach unten alle Gelenke an der linken Seite des Gliedes verbunden werden. Danach folgen die Gelenke an der rechten Seite von unten nach oben.
Um die manchmal unvermeidbaren Überschneidungen möglichst exakt darzustellen, erfolgt diese Prozedur zunächst für alle nicht überschneidenden Glieder und Gelenke und anschließend für die überschneidenden. Kinematische Ketten und AGn werden einfarbig dargestellt. Bei Mechanismen erhält jedes Glied eine Farbe entsprechend seiner AG; die Farben werden einer vordefinierten Palette entnommen [C 33].
Zuletzt ist noch die Frage offen, wie viele Permutationen der Algorithmus eigentlich nach der geeignetsten Darstellung durchsuchen soll. Um keinen Kompromiß zwischen Wartezeit und Darstellungsqualität eingehen zu müssen, wird diese Zahl nicht fest vorgegeben. Statt dessen zeigt der Algorithmus immer die beste Darstellung an, die er bislang gefunden hat. Parallel sucht er aber weiter nach einer besseren - also überschneidungsärmeren - Darstellung, ohne dabei die Anwendung zu blockieren. Diese Aufgabe wird mittels eines separaten Threads [C 45] implementiert, womit gleichzeitig auch eine einfache Kapselung des Visualisierungsalgorithmus erfolgt. Sobald durch den Thread eine erste geeignete Darstellung gefunden wurde, wird dies durch ein Flag (Feld Verfügbar) angezeigt. Jedesmal, wenn der Thread eine bessere Darstellung findet, veranlasst er ein Neuzeichnen der Grafik. Allerdings ist sicher zu stellen, dass der Thread auch in jedem Fall korrekt beendet wird. Das ist nicht nur dann notwendig, wenn er eine überschneidungsfreie Darstellung gefunden hat. Der Thread muß in einigen Fällen auch aus dem noch suchenden Zustand heraus gestoppt werden; nämlich wenn er mit einer neuen Suche beginnen soll oder wenn das Programm beendet wird.