Halbautomatische Linienführung in Adora-Modellen unter Berücksichtigung des Zoom-Algorithmus Diplomarbeit im Fach Informatik vorgelegt von Tobias Reinhard Horw, Schweiz Matrikelnummer 00–713–446 Angefertigt am Institut für Informatik der Universität Zürich Prof. Dr. Martin Glinz Betreuer: Silvio Meier Christian Seybold Abgabetermin der Arbeit: 30. September 2004 Inhaltsverzeichnis Abbildungsverzeichnis 1 Einführung 1.1 Aufgabenstellung . . . . . . . 1.2 Aufbau der Arbeit . . . . . . 1.3 Adora Grundlagen . . . . . 1.3.1 Grundkonzepte . . . . 1.3.2 Sprachkonstrukte . . . 1.3.3 Visualisierungskonzept 1.4 Zoom-Algorithmus . . . . . . iii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 2 3 4 4 6 10 12 2 Problemstellung 2.1 Linienführung mit Hindernissen . . . . . . . . . . . 2.1.1 Direkte Linien . . . . . . . . . . . . . . . . 2.1.2 Orthogonale Linien . . . . . . . . . . . . . . 2.1.3 Weitere Ansätze . . . . . . . . . . . . . . . 2.1.4 Beurteilungskriterien . . . . . . . . . . . . . 2.1.5 Linienführung in Adora-Modellen . . . . . 2.2 Dynamisches Layout . . . . . . . . . . . . . . . . . 2.2.1 Mental Map des Benutzers . . . . . . . . . 2.2.2 Mental Map einer Linie . . . . . . . . . . . 2.3 Sekundärnotation . . . . . . . . . . . . . . . . . . . 2.3.1 Sekundärnotation der Linienführung . . . . 2.3.2 Änderungen am Layout . . . . . . . . . . . 2.4 Anforderungen an einen Linienführungsalgorithmus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 16 17 19 19 20 20 22 22 23 24 25 26 26 . . . . . . . . . 28 29 30 31 32 33 34 37 38 38 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Bestehende Ansätze der Linienführung 3.1 Automatisches Layouten von Graphen . . . 3.1.1 Graphenlayouter . . . . . . . . . . . 3.1.2 Layouten von dynamischen Graphen 3.1.3 Anwendbarkeit auf Adora-Modelle 3.2 Schaltungsentwurf . . . . . . . . . . . . . . 3.2.1 Algorithmus von Lee . . . . . . . . . 3.2.2 Line Probing . . . . . . . . . . . . . 3.2.3 Weitere Ansätze . . . . . . . . . . . 3.2.4 Anwendbarkeit auf Adora-Modelle i . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . INHALTSVERZEICHNIS 3.2.5 ii Routing in Kommunikationsnetzwerken . . . . . . . . . . . . . . . . . 4 Linienführung in einem dynamischen Layout 4.1 Moderate Änderungen der direkten Linienführung . . . . . . . . . . 4.1.1 Das Linienproblem . . . . . . . . . . . . . . . . . . . . . . . . 4.1.2 Vorgehen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.3 Beurteilung . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 Anwendung des Zoom-Algorithmus auf die Hilfspunkte . . . . . . . . 4.2.1 Vorgehen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.2 Beurteilung . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.3 Kopplung der Hilfspunkte an die Knoten . . . . . . . . . . . 4.3 Echter Routing-Algorithmus: Kachelbasierte Linienführung . . . . . 4.3.1 Explizite Repräsentation des freien Raumes . . . . . . . . . . 4.3.2 Entkopplung der eigentlichen Linienführung vom Finden eines ten Pfades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3.3 Sekundärnotation . . . . . . . . . . . . . . . . . . . . . . . . . 4.3.4 Linienüberlappungen und -überscheidungen . . . . . . . . . . 4.3.5 Beurteilung . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3.6 Weitere Anwendungsmöglichkeiten für die Datenstruktur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . geeigne. . . . . . . . . . . . . . . . . . . . . . . . . 5 Realisierung des Linienführungsalgorithmus 5.1 Datenstruktur: Corner Stitching . . . . . . . . . . 5.1.1 Kachel an bestimmter Position lokalisieren 5.1.2 Datenstruktur aufbauen . . . . . . . . . . . 5.1.3 Nachbarn bestimmen . . . . . . . . . . . . . 5.2 Geeigneten Pfad finden . . . . . . . . . . . . . . . 5.3 Linienführung . . . . . . . . . . . . . . . . . . . . . 5.3.1 Orthogonale Linienführung . . . . . . . . . 5.3.2 Linienführung mit Hilfe von Splines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 41 41 41 42 44 45 46 46 48 48 48 51 56 58 59 61 62 62 62 64 66 67 70 70 76 6 Zusammenfassung und Diskussion 77 Literaturverzeichnis 79 Abbildungsverzeichnis 1.1 1.2 1.3 1.4 1.5 Adora-Modell eines Steuerungssystems einer Heizung Kontextdiagramm des Steuerungssystems . . . . . . . Vorgehen des Zoom-Algorithmus . . . . . . . . . . . . Berechnung der Verschiebevektoren gemäss Berner . . Fehlende Invertierbarkeit beim Zoom-Algorithmus . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 10 12 13 14 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.10 2.11 Hindernisse bei der Linienführung . . . . . . . . . . . . . . . . . . . . Direkte Linienführung . . . . . . . . . . . . . . . . . . . . . . . . . . . Einfügen mehrer Hilfspunkte . . . . . . . . . . . . . . . . . . . . . . . Orthogonale Linienführung . . . . . . . . . . . . . . . . . . . . . . . . Weitere Ansätze zur Linienführung . . . . . . . . . . . . . . . . . . . . Linienführung in einem Scenariochart . . . . . . . . . . . . . . . . . . Veränderung des Layouts durch den Zoom-Algorithmus . . . . . . . . Konflikt bei der Erhaltung der Mental Map einer Linie . . . . . . . . . Einfluss der Start- und Endpunkte auf die orthogonale Linienführung Einflussnahme bei der direkten und orthogonalen Linienführung . . . . Erhaltung der Sekundärnotation bei manuellen Änderungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 18 18 19 20 21 23 24 25 25 26 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 Verlegung von bestehenden Linien durch yFiles . . Gitterstruktur . . . . . . . . . . . . . . . . . . . . . Kosten berechnen . . . . . . . . . . . . . . . . . . . Pfad zurückverfolgen . . . . . . . . . . . . . . . . . Berechnete Distanzwerte . . . . . . . . . . . . . . . Vorgehen beim Line Probing . . . . . . . . . . . . Fluchtpunkte beim Line Probing . . . . . . . . . . Beispiel eines Gitter-Graphen . . . . . . . . . . . . Uniforme Gitterstruktur bei einem Adora-Modell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 33 34 35 36 37 37 38 39 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 Linienproblem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lösung des Linienproblems durch das Einfügen von Hilfspunkten . . . . Grenzen der moderaten Anpassung der Linienführung . . . . . . . . . . Verschieben eines Hilfspunktes durch den Zoom-Algorithmus . . . . . . Problem bei der Anwendung des Zoom-Algorithmus auf die Hilfspunkte Anwendung des von Marty erweiterten Algorithmus von Berner . . . . . Corner Stitching Datenstruktur . . . . . . . . . . . . . . . . . . . . . . . Repräsentation der Nachbarschaftsbeziehungen zwischen den Kacheln . Pfad aus freien Kacheln . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 43 44 46 47 47 49 49 51 iii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ABBILDUNGSVERZEICHNIS iv 4.10 4.11 4.12 4.13 4.14 4.15 4.16 4.17 Uniforme Zellen / Kacheln der Corner Stitching Struktur . . . . . . Berechnung der Distanzwerte . . . . . . . . . . . . . . . . . . . . . . Beziehung zwischen Pfaden und ihren Elternpfaden . . . . . . . . . . Pfadstruktur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mehrere gleich lange Pfade . . . . . . . . . . . . . . . . . . . . . . . Verschiedene Möglichkeiten der Linienführung in einem Pfad . . . . Erhaltung der Sekundärnotation durch die Corner Stitching Struktur Möglichkeiten zur Auflösung von Linienüberscheidungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 53 54 54 55 56 57 58 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 5.10 5.11 5.12 Kachel an einem bestimmten Punkt lokalisieren . . . . . . . . . . . . . Knoten in die Corner Stitching Struktur einfügen . . . . . . . . . . . . Unterschiedliche Corner Stitching Strukturen innerhalb eines Knotens Auffinden aller Nachbarn einer Kachel . . . . . . . . . . . . . . . . . . Finden eines geeigneten Pfades . . . . . . . . . . . . . . . . . . . . . . Bestimmung des Startpunktes durch den Linienführungsalgorithmus . Mögliche Konstellationen bei der orthogonalen Linienführung . . . . . Bestimmung der Eintritts- und Austrittsrichtung . . . . . . . . . . . . Vorgehen bei der orthogonalen Linienführung . . . . . . . . . . . . . . Problemfälle bei der orthogonalen Linienführung . . . . . . . . . . . . Mehrere Lösungen bei der orthogonalen Linienführung . . . . . . . . . Linienführung mit Hilfe von Splines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 64 66 67 68 69 71 71 72 74 75 76 Kapitel 1 Einführung Die Bedeutung von Software hat in den letzten Jahren durch die zunehmende Automatisierung in fast allen Lebensbereichen stark zugenommen. Dementsprechend werden Software-Systeme immer komplexer und in Bereichen eingesetzt, in denen ein Fehlverhalten zu grossem wirtschaftlichem Verlust oder zur Gefährdung von Menschenleben führen kann. Die vielen Terminund Kostenüberschreitungen oder gar abgebrochenen Projekte zeigen, dass die Entwicklung von Software auch heute noch nur ungenügend beherrscht wird. Mit der Enwicklung neuer Methoden und Techniken versucht das Software Engineering die Softwareentwicklung in systematische und zuverlässigere Bahnen zu lenken. Die ersten Probleme bei der Entwicklung eines Software-Systems bringt bereits die Spezifikation, d.h. die Erhebung der an das System gestellten Anforderungen, mit sich. Dies hat in erster Linie damit zu tun, dass in dieser Phase auf einem hohen Abstrahierungslevel gearbeitet werden muss und Personen aus den verschiedensten Bereichen in den Prozess involviert sind. Als erschwerender Faktor kommt hinzu, dass Fehler, die in diesen frühen Phasen begangen werden, später oft gar nicht mehr oder nur mit hohen Kosten korrigiert werden können. Eine Spezifikation der Anforderungen in natürlicher Sprache lässt sich zwar ohne verherige Schulung erstellen und ist für alle Beteiligte verständlich; in eine solche Spezifikation schleichen sich jedoch leicht Mehrdeutigkeiten und Widersprüche ein und die Zusammenhänge sind oft nur schwer zu erkennen. Aus diesem Grund haben sich eine ganze Reihe teilformaler und formaler Modelle zur Beschreibung von Anforderungen und Entwürfen von Software-Systemen entwickelt. In den letzten Jahren hat sich aus diesen Ansätzen UML (Unified Modeling Language [Rum99]) zu einem inoffiziellen Industriestandard entwickelt. UML ist ein offener und erweiterbarer Standard, der laufend weiterentwickelt wird und deshalb mitlerweile auch einen sehr grossen Sprachumfang aufweist. Modelle bestehen in UML aus einer losen Sammlung von Einzelmodellen, welche die verschiedenen Aspekte (wie z.B. die statische Struktur oder das dynamische Verhalten) eines Systems beschreiben. Durch diese Aufteiltung in verschiedene separate Modelle kann es leicht zu Konsistenzproblemen (d.h. widersprüchlichen Aussagen in verschiedenen Teilmodellen) kommen und das Zusammensuchen der relevanten Informationen kann sich mühsam gestalten. Daneben leidet UML auch noch unter anderen konzeptionellen Schwächen. So existiert z.B. keine Möglichketen für eine systematische Systemdekompositi- 1 KAPITEL 1. EINFÜHRUNG 2 on1 , die eine Aufteilung des Gesamtsystems in kleinere und leichter verständliche Teilsysteme ermöglicht. Zusätzlich sind auch viele Sprachkonstrukte nicht eindeutig definiert. Adora [Joo99], [Gli02], [Xia04] ist eine objektorientierte Sprache zur Spezifikation von Anforderungen und Beschreibung von Software-Entwürfen mit dem Ziel, einige der grössten Schwächen aktueller Modellierungssprachen wie z.B. UML zu überwinden. Adora steht dabei als Akronym für “Analysis and Description Of Requirements and Architecture” und wurde von der Forschungsgruppe Requirements Engineering der Universität Zürich entwickelt. Gegenüber bestehenden Modellierungssprachen weist Adora im Wesentlichen folgende Besonderheiten auf: • Die Verwendung eines integrierten Modells, das nicht, wie z.B. UML, auf Klassen, sondern auf abstrakten Objekten basiert und durch eine hierarchische Dekomposition eine Strukturierung des Systems ermöglicht. • Ein Werkzeugkonzept, das die Visualisierung von Modellen in ihrem Kontext und in Übereinstimmung mit ihrer logischen Struktur ermöglicht. • Die Unterstützung eines flexiblen und inkrementellen Modellierungsprozesses, der insbesonders je nach Problemstellung verschiedene Formalitätsgrade von Modellen zulässt. 1.1 Aufgabenstellung Adora ist in erster Linie eine graphische Spezifikationssprache, wodmit die Modelle primär mittels graphischer Symbole beschrieben werden. Bei dieser Visualisierung werden Beziehungen zwischen den Symbolen der verschiedenen Sprachkonstrukten durch Linien repräsentiert. Dabei ist es in der Regel unvermeidlich, dass es zu Überschneidungen zwischen diesen Linien und anderen graphischen Symbolen kommt. Um die Lesbarkeit von Adora-Modellen nicht zu beeinträchtigen ist es notwendig, die Linien um diese Hindernisse herumzuführen. Das Problem der Linienführung tritt in dieser Form nicht nur in Adora-Modellen sondern z.B. auch in UML-Klassenmodellen auf. Adora erlaubt es jedoch zusätzlich, ein System auf verschiedenen Abstraktionsebenen zu beschreiben und darzustellen. Dabei können Details der einzelnen Systemteile ein- oder ausgeblendet werden, wodurch das Layout2 der Darstellung verändert wird. Dadurch weisen Adora-Modelle kein statisches Layout auf, bei dem die Symbole bei der Erstellung des Modells platziert und dann deren Positionen und Grössen nicht mehr verändert werden. Bei Adora muss vielmehr davon ausgegangen werden, dass aus dem integrierten Gesamtmodell heraus für den Benutzer jeweils die Darstellung, die ihn bei seiner momentanen Tätigkeit am Besten unterstützt, dynamisch generiert wird. Ein Adora-Modell weist damit eine dynamische Darstellung auf, wodurch auch die Linienführung dynamisch erfolgen muss. Die Linienführung ist damit keine einmalige Tätigkeit, sondern muss z.B. bei einem Wechsel des Abstraktionsniveaus von Neuem durchgeführt werden. Die dynamischen Darstellung erfordert zudem eine automatische Linienführung, da der Benutzer sonst nach jeder Änderung der Darstellung die Linien manuell anpassen muss. 1 Ab Version 2.0 [Omg03] bietet nun auch UML Möglichkeiten zur Systemdekomposition. Der Begriff Layout umfasst im Rahmen dieser Arbeit die Positionen und Grössen der graphischen Symbole, die bei der Linienführung als Hindernisse auftreten können. Die Linien selbst gehören bei dieser Definition nicht zum Layout. Der Begriff des Layouts wird damit gleich wie in [Ber02] und [Mar02] verwendet. 2 KAPITEL 1. EINFÜHRUNG 3 Auch ist es dem Benutzer möglich, Änderungen am Layout (d.h. der Position und Grösse der graphischen Symbole) eines Adora-Modells vorzunehmen, um das Modell entsprechend seinen Vorstellungen zu gestalten. Diese vom Benutzer vorgenommenen Änderungen, die sogenannte Sekundärnotation [Pet95], soll dabei unabhängig von der aktuell generierten Darstellung so weit wie möglich erhalten werden. Die Sekundärnotation umfasst jedoch nicht nur die Position und Grösse der graphischen Symbole, sondern auch die Linien, mit denen Beziehungen zwischen den verschiedenen Sprachkonstrukten repräsentiert werden. Bei einer durch eine Veränderung der Darstellung notwendig gewordenen Anpassung der Linien muss deshalb auch die Sekundärnotation dieser Linien so weit wie möglich erhalten werden. Mit diesen drei Problembereichen der Linienführung in einem Adora-Modell beschäftigt sich die vorliegende Arbeit. Dabei wird sowohl das grundlegende Problem analysiert, es werden bestehende Ansätze auf ihre Anwendbarkeit untersucht und ein neuer Ansatz wird vorgeschlagen. 1.2 Aufbau der Arbeit Die Arbeit gliedert sich in sechs aufeinander aufbauende Kapitel. Das Einführungskapitel behandelt zuerst die Grundlagen der Sprache Adora. Danach folgt eine kurze Übersicht über die grundlegenden Konzepte zur Visualisierung von Adora-Modellen. Abgeschlossen wird dieses erste Kapitel mit einer Diskussion der bestehenden Zoom-Algorithmen, da diese einen grossen Einfluss auf die Linienführung ausüben. Eine detaillierte Diskussion des Problems der Linienführung in Adora-Modellen folgt in Kapitel 2. Dabei geht es sowohl um die Linienführung in einem statischen Layout, als auch um die speziellen Probleme, die sich durch das dynamische Layout von Adora-Modellen ergeben. Zusätzlich befasst sich dieses Kapitel mit den Auswirkungen einer automatischen Linienführung auf den Benutzer und - umgekehrt - mit dem Einfluss des Benutzers auf die Linienführung. In Kapitel 3 werden bestehende Ansätze der Linienführung aus den verschiedensten Bereichen, wie dem automatischen Zeichnen von Graphen oder dem computerunterstützten Entwurf elektronischer Schaltungen, vorgestellt. Diese Ansätze gehen von einem statischen Layout aus; ein dynamisch generiertes Layout, wie es bei Adora-Modellen auftritt, ist bei diesen Ansätzen nicht vorgesehen. Kapitel 4 geht auf Strategien für die Linienführung in Adora-Modellen ein. Diese unterscheiden sich von den Ansätzen in Kapitel 3 durch die zusätzliche Dynamik des Layouts. Dabei werden als Erstes Ansätze diskutiert, die bereits andernorts (wie z.B. in [Ber02]) vorgeschlagen worden sind. Ausgehend von den Problemen, die bei der Anwendung dieser Ansätze auftauchen, wird danach eine neue Strategie zur Linienführung in Adora-Modellen entwickelt. Die zur Realisierung des in Kapitel 4 vorgestellten Ansatzes benötigten Algorithmen werden in Kapitel 5 näher vorgestellt. Die Beschreibung bewegt sich dabei auf einer relativ abstrakten Ebene, ohne auf die Realisierung in einer bestimmten Sprache oder Umgebung einzugehen. Kapitel 6 schliesslich bildet mit einer Zusammenfassung und Beurteilung der Resultate der Arbeit den Abschluss. Im abschliessenden Kapitel wird auch noch auf offene Fragen und im Rahmen dieser Arbeit nicht behandelte Probleme eingegangen. KAPITEL 1. EINFÜHRUNG 1.3 4 Adora Grundlagen Die folgenden Abschnitte führen die Grundlagen der Sprache Adora ein. Dabei werden die der Sprache zu Grunde liegenden Konzepte, die wichtigsten Sprachkonstrukte und die Grundlagen der Visualisierung behandelt. Es handelt sich dabei jedoch nur um eine Übersicht über die elementarsten Eigenschaften und nicht um eine systematische Beschreibung der Sprache. Für eine detaillertere Beschreibung von Adora sei deshalb auf [Joo99], [Gli02], [Ber02] und [Xia04] verwiesen. 1.3.1 Grundkonzepte Adora basiert im Wesentlichen auf den folgenden fünf grundlegenden Konzepten: • Verwendung von abstrakten Objekten an Stelle von Klassen • Strukturierung des zu modellierenden Systems durch ein hierarchische Dekomposition in eine Teil/Ganzes-Hierarchie • Modellierung aller Aspekte des Systems in einem einzigen integrierten Modell • Möglichkeit verschiedene Teile des Systems je nach Wichtigkeit und damit verbundenem Risiko mit unterschiedlichen Formalitätsgraden zu beschreiben • Visualisierung des Modells in seinem Kontext, indem Details immer mit einer Abstrahierung ihres Kontexts visualisiert werden Abstrakte Objekte Im Gegensatz zu den meisten objektorientierten Modellierungssprachen steht bei Adora nicht ein Klassenmodell sondern ein Objektmodell im Mittelpunkt. Bei Klassendiagrammen ist es nicht möglich, mehrere Objekte der gleichen Klasse oder Beziehungen zwischen Objekten (und nicht Klassen) zu modellieren [Joo97], [Gli00]. Diese beiden Situationen treten in der Praxis jedoch häufig auf. Ausserdem ist eine hierarchische Zerlegung des Gesamtmodells mit Klassenmodellen nur schwer durchführbar. Dies liegt in erster Linie daran, dass Objekte einer bestimmten Klasse in verschiedenen Teilen des Systems auftauchen können. Werden abstrakte Objekte, d.h. abstrakte Repräsentationen konkreter Objekte, verwendet, so treten diese Probleme nicht auf. Wird mit abstrakten Objekten gearbeitet, so rücken die kontextabhängigen Aspekte der Objekte (z.B. Kommunikation, Interaktion, Beziehungen) in den Vordergrund, was das Systemverständnis erleichtert. Kontextunabhängige Aspekte der Objekte (d.h. die gemeinsamen Eigenschaften aller Objekte eines Typs) werden in Adora in einem Typverzeichnis beschrieben. Ein Typ in Adora entspricht damit einer Klasse, wie sie z.B. in einem UML-Klassenmodell auftritt. Die Typen können damit analog zu Klassenhierarchien in einer Subtypenhierarchie organisiert werden. Um die Präzision in den Modelle zu erhöhen, unterscheidet Adora zwischen Objekten und Objektmengen. Objekte repräsentieren dabei eine einzelne Instanz und Objektmengen stehen als Repräsentanten für mehrere Instanzen. KAPITEL 1. EINFÜHRUNG 5 Hierarchische Dekomposition Um auch in einer grösseren Spezifikation die Übersicht zu behalten, ist es unumgänglich, das Gesamtsystem in kleinere Teilsysteme zu zerlegen. Dabei gliedert eine gute Zerlegung das System rekursiv in kohärente Teile, die über schmale Schnittstellen miteinander kommunizieren und für sich ohne detailliertes Wissen der anderen Teile verstanden werden können. Zusätzlich sollte von jeder Komposition und ihren Beziehungen eine abstrakte Übersicht existieren. Bestehende Modellierungssprachen beinhalten normalerweise zwei verschiedene Möglichkeiten zur Dekomposition des Gesamtsystems: (i) die verschiedenen Aspekte des Systems werden in unterschiedlichen Modellen beschrieben und (ii) verwandte Informationen werden in Behälterkonstrukten (wie z.B. Paketen in UML) abgelegt. Beide diese Ansätze vermögen jedoch den Anforderungen an eine gute Dekomposition nicht zu genügen. Eine Dekomposition bezüglich der verschiedenen Aspekte ermöglicht keine Zerlegung in kohärenten Teile, solange diese Teile nicht den Aspekten entsprechen. In Behälterkonstrukten können, wie der Name schon andeutet, beliebige Dinge abgelegt werden. Pakete in UML haben z.B. eine zu schwache Semantik um als Komposition in dem Sinne zu dienen, dass eine Komposition eine abstrake Übersicht ihrere Teile und derer Beziehungen darstellt. Im Gegensatz dazu werden Objekte in Adora rekursiv in weitere Objekte zerlegt. Dadurch entsteht eine Teil/Ganzes-Hierarchie, die Objekte in eine baumartige Struktur einteilt. Objekte der tieferen Hierarchiestufen modellieren damit kleine Ausschnitte des Systems im Detail, Objekte auf höheren Hierarchiestufen grosse Teile des Systems auf einer abstrakteren Ebene. Integriertes Gesamtmodell In bestehende Modellierungssprachen setzt sich das Gesamtmodell in der Regel aus einer Reihe mehr oder weniger stark gekoppelter Diagramme zusammen. Bei dieser sogenannten Aspektmodellierung werden die einzelnen Aspekte des Systems getrennt voneinander dargestellt. So beschreiben in UML z.B. Klassendiagramme die statische Struktur des Systems und Zustandsautomaten das dynamisches Verhalten des Systems getrennt voneinander. Zusammenhänge und Abhängigkeiten zwischen den verschiedenen Aspektmodellen müssen deshalb explizit beschrieben werden. Dabei kann es leicht zu Unstimmigkeiten und Widersprüchen zwischen den verschiedenen Modellen kommen und viele Informationen werden in den verschiedenen Modellen redundant abgelegt. Adora modelliert - im Gegensatz dazu - alle Modellierungsaspekte (z.B. Struktur, Daten, Verhalten, Benutzerinteraktion) in einem integrierten Gesamtmodell. Dadurch wird zusätzlich die Definition einer strengen Konsistenznotation möglich, welche als Grundlage für automatische Konsistenzprüfungen dienen kann. Ein einzelnes Modell ermöglich auch eine systematisches Vorgehen bei der Modellierung und reduziert den Anteil redundanter Informationen und damit auch die Gefahr von Widersprüchen und Unstimmigkeiten. Die Verwendung eines integrierten Modells bedeutet jedoch nicht, dass immer alle Informationen in einem einzigen Diagramm dargestellt werden. Bei einer solchen Flut von Informationen wäre es kaum mehr möglich, sich im Modell zurecht zu finden. Die Menge der dargestellten Informationen reduziert sich aus folgenden zwei Gründen: (i) durch die hierarchische Dekomposition ist der Benutzer in der Lage den Fokus und die Abstraktionsebene der Darstellung auszuwählen und (ii) verwendet Adora ein Visualisierungskonzept, das auf der Einblendung KAPITEL 1. EINFÜHRUNG 6 von Aspekten anstelle verschiedener Modellen beruht. Die Basissicht besteht dabei nur aus den Objekten und Objektmengen und deren hierarchischer Struktur. In diese Basissicht können vom Benutzer dann weitere Aspekte eingeblendet werden. Das integrierte Gesamtmodell ist daher in der Regel ein abstraktes Modell, aus dem - je nach Intension des Benutzers - verschiedene Darstellungen generiert werden. Die Lesbarkeit des Modells wird dabei durch eine geeignete Wahl der Abstraktionsebene und durch das Ausblenden von zur Zeit nicht interessierenden Aspekten gewährleistet. Variabler Formalitätsgrad Die Aufgabe der Software-Entwicklung besteht darin, die informalen Vorstellungen des Auftraggebers in den vollständig formalen Programmcode zu überführen. Beim ersten Schritt dieses Prozesses, der Anforderungsspezifikation, sollte die Modellierungssprache die Wahl des Formalitätsgrades dem Benutzer überlassen. Der Formalitätsgrad kann damit der Komplexität und Risikolastigkeit der Problemstellung angepasst werden. Das Spektrum kann dabei von der informalen natürlichen Sprache bis hin zu vollständig formalen Elementen reichen. In Adora hat der Benutzer die Wahl zwischen informalen, formalen oder teilformale Spezifikationsmöglichkeiten. Zustandübergänge können z.B. mit Hilfe einer formalen Notation, informal mit Text oder teilformal beschrieben werden. Die Wahl des Formalitätsgrades bezieht sich dabei nicht auf das gesamte Modell, sondern es ist auch möglich, verschiedene Teile eines Systems mit unterschiedlichen Formalitätsgraden zu beschreiben. Visualisierung des Kontextes Werden in existierenden Modellierungssprachen Möglichkeiten nur Systemdekomposition zur Verfügung gestellt, so verwenden diese normalerweise einen explosiven Zoom. Dabei werden die einer Komposition untergeordneten Elemente in einem separaten Diagramm dargestellt. UML z.B. ermöglicht das Zusammenfassen von verwandten Informationen in einem Paket und die Darstellung dieser Pakete und deren Beziehungen untereinander in einem Diagramm. Die innere Struktur eines Pakets wird dann jedoch durch ein separates Klassendiagramm beschrieben, wodurch die Informationen über den Kontext (d.h. die anderen Pakete und die Beziehungen zwischen den Paketen), in den das Paket eingebettet ist, verloren gehen. Ein explosiver Zoom führt also zu einem Verlust des umgebenden Kontextes. Adora verwendet demgegenüber ein Fischaugenkonzept [Fur86], wodurch es möglich wird, eine oder mehrere Komponenten des Systems mit einem höheren Detaillierungsgrad als sein Umfeld darzustellen, wobei das Umfeld und damit der Kontext auf einer abstrakteren Ebene sichtbar bleibt, [Ber02]. Dadurch wird die Verständlichkeit der Modelle erhöht und das Navigieren erleichtert. Diese Technik erlaubt es auch, den Abstrahierungsmechanismus der Sprache durch ein entsprechendes Visualisierungskonzept in einem Werkzeug zu unterstützen. 1.3.2 Sprachkonstrukte Ein Adora-Modell setzt sich aus einer hierarchischen Objektstruktur und einem Typenverzeichnis zusammen. Das Objektmodell wird durch die sogenannte Basisstruktur beschrieben und ist nach dem Prinzip der Teil/Ganzes-Hierarchie aufgebaut. Die Basisstruktur kann durch KAPITEL 1. EINFÜHRUNG 7 eine Reihe von aspektbezogenen Einblendungen ergänzt werden. Im Typenverzeichnis werden die gemeinsamen (d.h. kontextunabhängigen) Eigenschaften aller Objekte eines bestimmten Typs in textueller Form beschrieben. Die folgenden Abschnitte beschreiben die Basistruktur und die verschiedenen Einblendungen. Dabei dient ein verteiltes Steuerungssystem einer Heizung [Gli02] als Beispiel. Das System soll eine komforable Steuerung eines Heizungssystems in einem aus mehreren Räumen bestehenden Gebäude ermöglichen. Dabei ist es möglich, das gesamte System von einem einzigen Ort aus zu steuern. Zusätzlich kann auch eine Temperatursteuerung für jeden einzelnen Raum individuell freigeschaltet werden. Das verteilte System setzt sich damit aus zwei Hauptteilen zusammen, einem zentralen Steuerungsmodul und einer Reihe von Modulen zur individuellen Steuerung der Temperatur in einem bestimmten Raum. Abbildung 1.1 zeigt das AdoraModell dieses Systems. Abbildung 1.1: Adora-Modell eines Steuerungssystems einer Heizung Basisstruktur Die Basistruktur bildet eine Objekthierarchie bestehend aus Objekten und Objektmengen, die nach dem Prinzip der Teil/Ganzes-Hierarchie ineinander geschachtelt sind. Objekte werden darin als Rechtecke und Objektmengen als Rechteckstapel dargestellt. So ist das MasterModule in Abbildung 1.1 als Objekt modelliert, da es davon nur eine Instanz geben kann. Weil es für jeden Raum eine eigene Instanz des RoomModule gibt, wird dieses als Objektmenge mit der Kardinalität (1,n) modelliert. Ein hierarchisch übergeordnetes Objekt steht im Modell als Abstraktion seiner Komponenten im Sinne einer Kompositionsabstraktion. Um die Hierarchie im Modell sichtbar zu machen, wird ein Komprimierungs- und Expansionsmechanismus verwendet, der es ermöglicht eine Komposition auf einer beliebigen Abstraktionsebene darzustellen. Wird ein Objekt oder ei- KAPITEL 1. EINFÜHRUNG 8 ne Objektmenge abstrahiert, d.h. durch die Ausblendung der darin enthaltenen Elemente, dargestellt, so werden seinem Namen drei Punkte angefügt. So sind in Abbildung 1.1 auf Seite 7 z.B. BoilerControlPanel und BoilerControl in einer abstrahierten Form dargestellt, das Objekt RoomModule ist im Gegensatz dazu vollkommen expandiert, wodurch alle darin enthaltenen Elemente sichtbar werden. Strukturelle Sicht Mit der strukturellen Sicht lässt sich die Basisstruktur mit Informationen über die Beziehungen zwischen den Objekten und Objektmengen erweitern. Alle Arten von Informationsfüsse zwischen Objekten werden in Adora durch eine Art von Beziehung, der Assoziation, beschrieben. Eine Assoziation ist in Adora immer eine gerichtete binäre Beziehung und wird durch die Angabe einer Bezeichnung und der Kardinalität näher spezifiziert. Besteht zwischen zwei Objekten eine bidirektionale Beziehung, so wird diese durch zwei gerichtete Assoziationen modelliert. In einem Adora-Modell werden Assoziationen durch Linien zwischen den beteiligten Objekten oder Objektmengen dargestellt. Da sich in einem Adora-Modell die zwei an einer Assoziation beteiligten Objekte auf verschiedenen Abstraktionsebenen befinden können, müssen auch die Beziehungen die hierarchische Struktur des Modells in geeigneter Form widerspiegeln. Beziehungen auf einer tiefen Abstraktionsebene müssen also auch auf höheren Abstraktionsebenen sichtbar bleiben. So existiert z.B. in Abbildung 1.1 auf Seite 7 eine Assoziation zwischen zwei in BoilerControlPanel und BoilerControl enthaltenen Objekten. Da diese beiden Objekte in der aktuellen Darstellung nicht sichtbar sind, wird die Assoziation abstrahiert (durch eine dickere Linie) dargestellt. Im Gegensatz dazu stellt die Assozation zwischen Settings und Controller innerhalb von RoomControl eine Beziehung zwischen diesen beiden Objekten dar und ist deshalb nicht abstrahiert. Teilweise ist es nötig, sowohl die abstrahierte als auch die nicht abstrahierte Form einer Assoziation gleichzeitig darzustellen. In diesem Fall werden die beiden Assoziationen durch eine Haarlinie miteinander verbunden, um die hierarchischen Beziehungen zwischen den Assoziationen hervorzuheben [Joo99]. Verhaltensorientierte Sicht Im Gegensatz zu den meisten anderen Modellierungssprachen wird bei Adora auch das Verhalten in die Basisstruktur integriert und damit mit dem Objektmodell verknüpft. Das Verhalten wird dabei durch Statecharts [Har87] beschrieben. Zustände werden dabei, wie in Statecharts üblich, durch Rechtecke mit abgerundeten Ecken dargestellt. Neben elementaren Zuständen sind auch komplexe Zustände möglich. Komplexe Zustände enthalten selbst wieder elementare oder komplexe Zustände. Die Statecharts wurden in Adora in der Form erweitert, dass sie auch Objekte und Objektmengen enthalten können. Dabei repräsentieren jedes Objekt und jede Objektmenge einen abstrakten Zustand, der weitere Objekte und/oder Zustände enthalten kann. Objekte, die einen Zustand beschreiben, werden dabei als Komponentenzustand bezeichnet. Führt ein Zustandsübergang zu einem solchen Komponentenzustand, so bedeutet dies, dass eine Instanz des Objekts erzeugt wird. Beim Verlassen des Komponentenzustandes wird diese Instanz wieder zerstört. Das Objekt HeatingOn in Abbildung 1.1 auf Seite 7 ist ein Komponentenzustand. KAPITEL 1. EINFÜHRUNG 9 Kommt es vom elementaren Zustand HeatingOff zu einem Zustandsübergang auf HeatingOn, so wird eine Instanz davon erzeugt. Im Kontext der Heizungssteuerung ist das so zu verstehen, dass die Funktionen zur Steuerung der Heizung eines Raumes erst verfügbar werden, wenn die Heizung für diesen Raum eingeschalten worden ist. Zustände werden durch Zustandsübergänge miteinander verbunden. Bei einem Zustandsübergang wird durch eine Übergangsbedingung und eine Übergangsaktion spezifiziert, unter welchen Umständen der Zustandsübergang eintritt und welche Aktionen dabei ausgelöst werden. Ein Zustandsübergang wird bei den Statecharts durch einen Pfeil zwischen den beiden Zuständen dargestellt. Die Bedingungen und Aktionen der Zustandsübergänge können dabei informal, formal oder teilformal spezifiziert werden. So wird z.B. in Abbildung 1.1 der Zustandsübergang vom Zustand LocalControlOf zum Zustand LocalControlOn formal spezifiziert, derjenige vom Zustand LocalControlDisabled zum Komponentenzustand LocalControlEnabled informal mit natürlicher Sprache. Funktionale Sicht In der funktionalen Sicht werden Eigenschaften von Objekten oder Objektmengen beschrieben, die nicht bereits durch den Typ im Typenverzeichnis definiert worden sind. Die funktionale Sicht existiert nur in textueller Form und wird auch nicht wie die anderen Sichte in die Basisstruktur eingeblendet. Haben z.B. die beiden Objekte BoilerControl und RoomControl im Modell von Abbildung 1.1 den gleichen Typ, so können mit Hilfe der funktionalen Sicht die Unterschiede (z.B. in den Initialisierungswerten der Attribute) beschrieben werden. Benutzersicht Die Benutzersicht beschreibt das System aus dem Blickwinkel des Benutzers, wobei dieser den inneren Aufbau des Systems nicht kennt. Die Benutzersicht wird in Adora durch hierarchisch strukturierte Szenarien beschrieben. Unter Szenario wird dabei eine geordnete Menge von Interaktionen zwischen Partnern, in der Regel dem System und einer Menge von externen Akteuren, verstanden. Objekte und Szenarien stellen in Adora komplementäre Konzepte dar. Szenarien beschreiben die Stimuli, die von externen Akteuren in das System gelangen, und die Reaktionen des Systems darauf. Hängen diese Reaktionen von vorhergehenden Stimuli und Reaktionen ab, so ist eine Spezifikation mit Szenarien alleine nicht mehr möglich. In solchen Fällen werden zusätzlich auch die Objekte benötigt. Szenarien werden in Adora-Modellen durch Ovale dargestellt und können in Objekte eingebettet werden. Ein eingebettetes Szenario interagiert bei seiner Ausführung mit dem umgebenden Objekt. Szenarien können textuell oder mit Hilfe von Statecharts spezifiziert werden. Zusätzlich ist es auch möglich, die Szenarien mit Hilfe sogenannter Scenariocharts [Xia04] zu beschreiben. Szenariocharts sind um Nebenläufigkeit erweiterte Jackson-Diagramme [Jac75]. Mit Hilfe diese Scenariocharts ist auch in der Benutzersicht eine hierarchische Dekomposition möglich. Dabei werden Szenarien auf einer hohen Abstraktionsebene durch weitere Szenarien auf einer tieferen Ebene genauer beschrieben. Die Benutzersicht ermöglicht damit die Einbettung einer zweiten parallelen Hierarchie in die Basisstruktur. KAPITEL 1. EINFÜHRUNG 10 Kontextuelle Sicht In der kontextuellen Sicht werden die Akteure und Objekte in der Umgebung des zu modellierenden Systems dargestellt. Da die kontextuelle Sicht ebenfalls in die Basisstruktur eingeblendet wird, kann der Kontext des Systems auf jeder Abstraktionsebene dargestellt werden. Wird das System weitestgehend abstrahiert, so entspricht die Basisstruktur mit der eingeblendeten kontextuellen Sicht einem Kontextdiagramm. Abbildung 1.2 zeigt das Kontextdiagramm des Steuerungssystems aus Abbildung 1.1 auf Seite 7. Dabei wird von allen Details innerhalb von HeatingControlSystem abstrahiert. Operator, Boiler, RadiatorValve und User sind in diesem Diagramm Akteure, die mit dem System interagieren. In Adora können nicht nur Beziehungen zwischen den Akteuren und dem System, sondern auch Beziehungen zwischen verschiedenen Akteuren ausserhalb des Systems spezifiziert werden. Akteure werden in Adora graphisch durch Sechsecke dargestellt und die Beziehungen durch Linien. Abbildung 1.2: Kontextdiagramm des Steuerungssystems 1.3.3 Visualisierungskonzept Um die Erstellung und Bearbeitung von Adora-Modellen in einem Werkzeug zu ermöglichen, wurde ein neuartiges Visualisierungskonzept [Ber02], [Xia04] entwickelt, das dem Abstraktionsmechanismus der Sprache Rechnung trägt. Dabei wird nicht - wie in den meisten Werkzeugen üblich - ein explosiver Zoom, sondern ein Zoom, der auf dem sogenannten Fischaugenkonzept [Fur86] aufbaut, eingesetzt. Dieses Visualisierungskonzept wird in den nächsten Abschnitten näher erläutert. Zuerst soll aber die folgende Aufzählung einen kurzen Überblick über die Anforderungen an ein gutes Visualisierungskonzept geben [Ber02]. Ein solches Konzept ist sowohl für die Verständlichkeit als auch die Benutzerfreundlichkeit eines graphischen Modells von entscheidender Bedeutung. • Die Orientierung im Modell soll dadurch unterstützt werden, dass jeweils nur so viele Details wie im Moment benötigt dargestellt werden, ohne dass dabei der globale Kontext, in den diese eingebettet sind, verloren geht. KAPITEL 1. EINFÜHRUNG 11 • Der kognitive Ballast für die Navigation muss minimiert werden. Als kognitiver Balast [Bea90] werden jene Überlegungen des Benutzers bezeichnet, die ausschliesslich dazu dienen, die Bedienungsschritte zu bestimmen, die zum Erreichen eines Navigationsschrittes benötigt werden. • Der Semantik der zugrunde liegenden Notation muss Rechnung getragen werden, um die Ausdrucksstärke des Modells in der Visualisierung zu erhöhen. • Die Verständlichkeit der Visualisierung soll durch die Unterstützung des Abstraktionsmechanismus des Modells erhöht werden. • Die Visualisierung soll eine Sekundärnotation [Pet95] unterstützen. Die Sekundärnotation umfasst dabei die Änderungen, die der Benutzer manuell am Layout vornimmt. Diese Sekundärnotation sollte auch bei der Durchführung von Navigationsaktivitäten so weit wie möglich erhalten bleiben. Werden hierarchische Strukturen in einem Werkzeug visualisiert, so kommt dabei in den meisten Fällen eine der folgenden Techniken zum Einsatz: (i) es wird jeweils nur ein Element und dessen direkte Nachfolger in der Hierarchie auf einmal dargestellt oder (ii) alle Elemente werden in einer einzigen Sicht (teilweise noch mit einer zusätzlichen Übersicht) visualisiert. Bei (i) kommt dabei in der Regel ein explosiver Zoom zum Einsatz. Bei einem explosiven Zoom geht der aktuelle Kontext verloren, weil das Element, auf das der Zoom angewandt wird, nach dem Zoomschritt das gesamte aktuelle Fenster einnimmt oder in einem neuen Fenster dargestellt wird. Diese Werkzeuge können also nur entweder eine globale Sicht ohne lokale Details oder lokale Details ohne den globalen Kontext darstellen. Dadurch wird der kognitive Ballast bei wachsender Modellgrösse erheblich vergrössert [Ber98]. Im Gegensatz dazu setzt das Visualisierungskonzept von Adora auf das Fischaugenkonzept [Fur86]. Das Fischaugenkonzept bietet - in Analogie zu einem Fischauge - eine Visualisierung, die im fokussierten Punkt lokale Details zeigt, wobei der Detaillierungsgrad mit wachsender Entfernung von diesem Punkt abnimmt. Eine Fischaugensicht visualisiert ein Modell also mit Hilfe eines Weitwinkelobjektivs. Dadurch können sowohl lokale Details als auch der globale Kontext in einer Sicht dargestellt werden. Die lokalen Details werden dabei benötigt, um dem Benutzer alle Informationen über den Teil bereitzustellen, auf den er im Moment fokussiert ist. Der globale Kontext ist nötig, um die Position des Fokus im gesamten Modell zu bestimmen und damit Voraussetzung für eine schnelle und einfache Orientierung und Navigation. Beim Visualisierungskonzept von Adora wird das Fischaugenkonzept nicht in seiner ursprünglichen Form angewandt, sondern den Anforderungen angepasst. Die Fischaugensicht wird dabei nicht durch eine geometrische Projektion eines grossen flachen Modells generiert. Stattdessen kommt eine logische Fischaugensicht zum Einsatz, die auf dem Abstraktionsmechanismus von Adora aufbaut. Weiter sind in der Fischaugensicht, wie sie in Adora zum Einsatz kommt, mehr als nur ein Fokus möglich. Durch dieses Konzept können im Moment weniger interessierende Element in komprimierter Form (d.h. abstrahiert) und die im Zentrum des Interesse liegenden Element in expandierter Form dargestellt werden. Das Visualisierungskonzept führt dazu, dass in Adora-Modellen zwei Möglichkeiten der Navigation existieren [Sch96], eine physikalische und eine logische Navigation. Physikalische Navigation wird nötig, sobald die Grösse der Darstellung die Grösse des Bildschirms überschreitet. Dabei handelt es sich um die etablierte Navigationsart in einem flachen Modell, wobei KAPITEL 1. EINFÜHRUNG 12 normalerweise Mittel wie Rollbalken oder ein Zoom (in diesem Fall ein Zoom mit globalem Skalierungseffekt) zum Einsatz kommen. Adora bietet zusätzlich noch eine logische Navigation für das Navigieren in der hierarchischen Struktur. Damit wird es möglich, Elemente zu verfeinern3 (Einzoomen) und damit darin enthaltene Element auf einer tieferen Abstraktionsebene sichtbar zu machen. Beim Vergröbern (Auszoomen) wird von den Datails, die in einem Element enthalten sind, abstrahiert und damit eine abstraktere Sicht generiert. 1.4 Zoom-Algorithmus Das zur logischen Navigation benötige Vergröbern und Verfeinern von Objekten, Objektmengen und komplexen Zuständen erfordert einen Algorithmus, der die dabei notwendigen Änderungen am Layout vornimmt. Beim Visualisierungskonzept von Adora-Modellen übernimmt der Zoom-Algorithmus von Berner [Ber02] diese Aufgabe. Er bietet die notwendige Funktionalität zur Verfeinerung von Objekten. Die Vergröberung kann ebenfalls mit diesem Algorithmus realisiert werden, wobei jedoch zusätzliche Massnahmen nötig werden, um Okklusionen4 zwischen Objekten zu verhindern. Wird ein Objekt in einem logischen Zoom-Schritt verfeinert oder vergröbert, so ändert sich die Grösse des Objekts, um Platz für die Darstellung der darin enthaltenen Details zu schaffen bzw. diesen Platz wieder freizugeben, wenn die Details nicht mehr dargestellt werden. Bei einer solchen Grössenänderung müssen auch die Positionen der Objekte in der Umgebung des Objekts angepasst werden. Diese Objekte werden dabei radial um den Betrag verschoben, um den das Objekt in diese Richtung verkleinert oder vergrössert wurde. Abbildung 1.3 illustriert das grundlegende Vorgehen des Zoom-Algorithmus. Abbildung 1.3: Vorgehen des Zoom-Algorithmus 3 Die Begriffe verfeinern und vergröbern wurden von [Ber02] eingeführt und werden deshalb auch in dieser Arbeit weiterverwendet. 4 Unter Okklusionen sind Situationen zu verstehen, bei denen es zu Überlappungen zwischen zwei oder mehreren Objekten kommt. KAPITEL 1. EINFÜHRUNG 13 Das Verfeinern eines Objektes erfolgt dabei in drei sich rekursiv wiederholenden Schritten: 1. Die Grösse des Objekts, das verfeinert werden soll, wird bestimmt. Dabei muss genügend Platz geschaffen werden, um alle im Objekt enthaltenen Elemente darzustellen. 2. Für jedes Objekt, das sich auf der selben Darstellungsebene befindet, wird ein Verschiebevektor berechnet und das Objekt damit verschoben. Ein Objekt befindet sich auf der gleichen Darstellungsebene wie das verfeinerte Objekt, wenn beide Objekte das gleiche Objekt als direkt übergeordnete Komposition haben. 3. Ist das verfeinerte Objekt selbst wieder in einer Komposition enthalten, so wird die Grösse dieses übergeordneten Objekts angepasst. Dabei sind erneut die Schritte 1 bis 3 zu durchlaufen. Anhand von Abbildung 1.3 auf Seite 12 lässt sich dieses Vorgehen nachvollziehen. Objekt A soll verfeinert werden. Die dafür benötige Grösse wird in Schritt 1 berechnet und entspricht dem mit A’ bezeichneten Rechteck. Die Objekte B, C und D, die sich auf der selben Darstellungseben wie A befinden, müssen nun in Schritt 2 verschoben werden. Dazu müssen als Erstes die Verschiebevektoren berechnet werden. Dazu wird für Objekt B eine Gerade durch die Mittelpunkte von A und B geführt. Der Verschiebevektor wird nun durch die Schnittpunk→ − te dieser Linie mit den Rechtecken A und A’ definiert ( b für Objekt B in Abbildung 1.3). Die − → → Verschiebevektoren − c und d für die Objekte C und D werden in analoger Weise berechnet. Bei diesem einfachen Vorgehen kann es jedoch zu Okklusionen zwischen Objekten kommen, weshalb im Algorithmus von Berner die Verschiebevektoren in leicht abgewandelter Form berechnet werden. Das Vorgehen hierzu ist in Abbildung 1.4 veranschaulicht: Abbildung 1.4: Berechnung der Verschiebevektoren gemäss Berner KAPITEL 1. EINFÜHRUNG 14 Im Beispiel von Abbildung 1.4 wird wiederum Objekt A verfeinert, wodurch die Objekte B, C und D verschoben werden müssen. Für die Berechnung der Verschiebevektoren wird zuerst die Umgebung von A in der Ausgangssituation in vier Halbebenen unterteilt. In Abbildung 1.4 werden diese entsprechend ihrer geographischen Position mit N, S, W und O bezeichnet. Die Verschiebevektoren werden nun abhängig davon berechnet, in welcher Halbebene sich der Mittelpunkt des zu verschiebenden Objekts befindet. Um Okklusionen zu vermeiden wird dabei für jede Halbebene eine Minimaldistanz berechnet. Für die vier Halbebenen sind diese → → → → Minimaldistanzen in Abbildung 1.4 mit den Vektoren − n, − s,− w und − o dargestellt. Befindet sich der Mittelpunkt des zu verschiebenden Objekts vor der Verschiebung in zwei Halbebenen, so ist der Verschiebevektor durch die beiden Minimaldistanzen dieser Halbebenen definiert. In Abbildung 1.4 befindet sich nur der Mittelpunkt des Objekts C in zwei Halbebenen, nämlich → N und O. Der Verschiebevektor − c dieses Objektes entspricht nun dem Vektorprodukt von − → − → n und o . Befindet sich der Mittelpunkt des zu verschiebenden Objektes jedoch in nur einer Halbebene, so wird der Verschiebevektor - wie für Abbildung 1.3 auf Seite 12 beschrieben berechnet. Weil die Verschiebevektoren je nach Lage des zu verschiebenden Objekts beim Algorithmus von Berner unterschiedlich berechnet werden, erfüllt dieser das Kriterium der Invertierbarkeit5 nicht. Eine Layout-Operation wird in diesem Zusammenhang als invertierbar bezeichnet, sofern sie die folgenden beiden Bedingungen erfüllt: (i) der Algorithmus, der die Operation ausführt, kann auch für die Umkehroperation benutzt werden und (ii) die Ausführung der Operation und der Umkehroperation nacheinander führen wieder zum Ausgangszustand zurück. Die erste Bedingung (i) stellt für den Zoom-Algorithmus kein Problem dar, da er sowohl für die Verfeinerung als auch für die Vergröberung von Objekten eingesetzt werden kann. Die zweite Bedingung (ii) kann jedoch nicht erfüllt werden, wenn das zu verschiebende Objekt durch eine Verfeinerung oder Vergröberung in eine andere Halbebene verschoben wird. Abbildung 1.5 illustriert dieses Problem. Abbildung 1.5: Fehlende Invertierbarkeit beim Zoom-Algorithmus In Abbildung 1.5a wird Objekt A vergröbert, wodurch Objekt B verschoben werden muss. Der Mittelpunkt von B befindet sich dabei nur in einer Halbebene, nämlich O, wodurch der 5 [Ber02] verwendet dafür in Analogie zu den Sortieralgorithmen den Begriff der Stabilität. KAPITEL 1. EINFÜHRUNG 15 Verschiebevektor durch die Gerade durch die Mittelpunkte von B und A und deren Schnittpunkte mit den Rechtecken A und A’ definiert wird. Entspricht A nach der Vergröberung also A’, so entspricht B nach der Vergröberung von A B’. Abbildung 1.5b zeigt die Umkehroperation dieser Vergröberung, die Verfeinerung von A. Der Mittelpunkt von B befindet sich nun in zwei Halbebenen (N und O), wodurch sich der Verschiebevektor durch die Minimaldistanzen dieser beiden Halbebenen berechnet. Nach der Verfeinerung von A entspricht B damit B’. Die Anwendung der Vergröberung und deren Umkehroperation der Verfeinerung nacheinander führt in diesem Fall also nicht mehr zur Ausgangsituation zurück. Wäre der Algorithmus invertierbar, so müsste das Objekt B’ in Abbildung 1.5b dem Objekt B in Abbildung 1.5a entsprechen. Die Endsituation von Abbildung 1.5b mit A’ und B’ bleibt nun jedoch stabil, d.h. B’ bleibt auch nach mehrmaligem Verfeinern und Vergröbern an seiner Position, weil sich das Objekt B nun immer in der selben Halbebene befindet. Zusätzlich können auch bei der Berechnung der Verschiebevektoren, wie sie Berner vorschlägt, Okklusionen auftreten [Mar02]. Da die Projektionstechnik okklusionsfrei arbeiten muss (gemäss den Anforderungen auf Seite 103 in [Ber02]), müssen entstandene Okklusionen nachträglich erkannt und aufgelöst werden. Durch diese nachträglichen Eingriffe in das Layout verschärft sich aber das Problem der fehlenden Invertierbarkeit weiter, da der ZoomAlgorithmus nur auf das aktuelle Layout andewandt wird und Layoutveränderungen (d.h. Positionsändeurngen von Objekten), wie sie bei der Auflösung von Okklusionen entstehen, nicht mehr rückgängig machen kann. Die Invertierbarkeit ist aber nicht das einzige Kriterium zur Beurteilung der Qualität von Zoom- bzw. Verschiebealgorithmen. Neben der beschriebenen Invertierbarkeit enthält die Aufzählung von Marty [Mar02] z.B. auch noch die Raumeinteilung, die angibt, wie viel Freiraum der Algorithmus schafft und wie gut der bestehende Freiraum zur Verteilung der Objekte genutzt wird, oder den Grad der Automatisierung, d.h. die Anzahl der Schritte von Seiten des Benutzers gegenüber der Anzahl von Schritten, die vom Algorithmus übernommen wird. Die ausführliche Behandlung der fehlenden Inverterierbarkeit des Zoom-Algorithmus in dieser Einführung rührt daher, dass diese für die Linienführung eines der Hauptprobleme darstellt. Marty untersucht anhand dieser Kriterien auch noch Alternativen zum Algorithmus von Berner, die auch auf dem Grundgedanken der radialen Verschiebung beruhen, kommt dabei aber zur Erkenntnis, dass keiner der Ansätze (inkl. dem von Berner) eine rundum zufriedenstellende Lösung ermöglicht. Die vorliegende Arbeit nimmt im Folgenden den von Marty erweiterte Algorithmus von Berner zur Grundlage und behandelt deshalb auch die damit auftretenden Probleme. Grundätzlich wird die Linienführung jedoch unabhängig von einer speziellen Layout-Operation (wie z.B. dem Zoom-Algorithmus) behandelt. Kapitel 2 Problemstellung Bei der Visualisierung von Adora-Modellen werden, wie im verhergehenden Kapitel erläutert, Linien zur Repräsentation von Beziehungen zwischen Objekten oder Objektmengen (Assoziationen), Zustandsübergängen (Transitionen), hierarchischen Beziehungen zwischen Szenarien und Beziehungen zwischen externen Akteuren und dem System verwendet. Vor allem bei komplexeren Modellen ist es dabei in der Regel unvermeidlich, dass es zu Überschneidungen zwischen Linien und Knoten1 kommt. Auch Überlappungen von Linienbeschriftungen oder Überschneidungen von verschiedenen Linien treten mit zunehmender Komplexität der Modelle vermehrt auf. Solche Überschneidungen und Überlappungen beeinträchtigen die Lesbarkeit eines Modelles und sollten deshalb möglichst vermieden werden. Das Problem verschärft sich zusätzlich durch das dynamische Layout von Adora-Modellen, bei dem verschiedene Darstellungen aus dem integrierten Gesamtmodell generiert werden. Bei der Anwendung von Layout-Operationen, wie z.B. dem Zoom-Algorithmus, verändert sich das Layout (d.h. die Positionen und Grössen der Knoten) nicht unerheblich, wodurch neue Überschneidunge entstehen können. Auch wenn die Knoten bei der Erstellung des Modells sorgfältig so platziert werden, dass es zu möglichst wenigen Überschneidungen kommt, können z.B. beim Zoomen durch die Veränderungen der Positionen und Grössen der Knoten trotzdem Überschneidungen auftreten. Die folgenden Abschnitte beschreiben ausführlich das Problem der Linienführung im Allgemeinen und bei Adora-Modellen im Besonderen, um daraus die Anforderungen an einen Ansatz zur Linienführung in Adora-Modellen herzuleiten. 2.1 Linienführung mit Hindernissen Die Platzierung und Wahl der Grösse der verschiedenen Knoten wird bei Adora-Modellen durch den Benutzer vorgenommen. Mit der Wahl der Positionen und Grössen der Knoten legt der Benutzer zusätzliche Informationen über das zu modellierende System im Layout des Modells ab. Diese im Layout des Modells enthaltenen Informationen werden als Sekundärno1 Im Folgenden werden die graphischen Symbole aller Sprachkonstrukte, die bei der Linienführung als Hindernisse auftauchen können, in Anlehnung an die Graphentheorie unter dem Begriff Knoten zusammengefasst. Darunter fallen abstrakte Objekte und Objektmengen, elementare und komplexe Zustände, Szenarien und externe Akteure. 16 KAPITEL 2. PROBLEMSTELLUNG 17 tation [Pet95] bezeichnet. Das vom Benutzer erstellte Layout und damit die Sekundärnotation müssen möglichst erhalten bleiben. Dies gilt für alle Operationen, die Veränderungen an der graphischen Repräsentation des Modells vornehmen, d.h. sowohl für den Zoom-Algorithmus als auch für den Linienführungsalgorithmus. Im Gegensatz zum Zoom-Algorithmus, dessen Zweck in der Veränderung des Layouts liegt und der das bestehende Layout immer nur bis zu einem gewissen Grad erhalten kann, sollte der Linienführungsalgorithmus die Position und Grösse der Knoten nicht verändern und die Platzierung und Grösse der Knoten als gegeben und unveränderbar betrachten. Zur Vermeidung von Überschneidungen zwischen Linien und Knoten bleibt deshalb nur die Möglichkeit, die Linien explizit um die Hindernisse herumzuführen. Obwohl die verschiedenen in Abschnitt 1.3.2 beschriebenen Sprachkonstrukte, die als Hindernisse für die Linienführung in Frage kommen, durch unterschiedliche graphische Symbole repräsentiert werden, beschränkt sich die folgende Diskussion auf rechteckige Hindernisse, da sich, wie Abbildung 2.1 zeigt, alle graphischen Symbole durch ein Rechteck annähern lassen. Abbildung 2.1: Hindernisse bei der Linienführung In den folgenden Abschnitten wird auf verschiedene grundlegende Ansätze zur Führung von Linien und die dabei anwendbaren Strategien zur Vermeidung von Überschneidungen zwischen Linien und Knoten eingegangen. Dabei wird das Probleme der Überschneidungen von Linien untereinander und der Überlappungen von Linienbeschriftungen vorerst nicht behandelt. Dabei beziehen sich die Ausführungen auf ein statisches Layout, d.h. das Problem der Überschneidungen tritt nur beim Hinzufügen oder Verschieben von Linien oder Knoten auf. Das Problem tritt somit in der gleichen Form z.B. auch bei UML-Diagrammen auf. Das durch den Zoom-Algorithmus (oder andere Layout-Operationen) entstehende dynamische Layout wird in Abschnitt 2.2 behandelt. 2.1.1 Direkte Linien Der einfachste Ansatz der Linienführung besteht in der direkten Verbindung des Start- und Endpunktes durch ein gerade Linie. Die Linie entspricht damit immer dem direkten und damit kürzesten Weg. Da die beiden Knoten auf direktem Weg miteinander verbunden sind, lässt sich die Verbindung leicht erkennen, ohne die Linie lange suchen zu müssen. Der direkte Ansatz kommt vor allem bei Darstellungen von Sachverhalten, bei denen es auf Grund ihrer Struktur zu gar keinen oder nur sehr wenigen Überschneidungen von Knoten und Linien kommen kann. Beispiele dazu sind Stammbäume oder Bäume als Datenstrukturen in der Informatik. Ebenfalls weite Verbreitung geniesst die direkte Linienführung im Bereich der Visualisierung von Graphen. Bei Graphen haben die Knoten jedoch normalerweise keine oder eine vernachlässigbare Ausdehnung, wodurch Überschneidungen mit Linien2 selten auftreten. Im Gegensatz dazu haben die Knoten in einem Adora-Modell immer eine gewisse 2 Bei Graphen wird für die Linien in der Regel der Begriff Kante verwendet. KAPITEL 2. PROBLEMSTELLUNG 18 Grösse und die Modelle weisen normalerweise auch keine Struktur auf, die Überschneidungen verunmöglicht oder nur selten auftreten lässt. Abbildung 2.2 veranschaulicht die direkte Linienführung und eine dabei auftretende Überschneidung zwischen einer Linie und dem Knoten A. Abbildung 2.2: Direkte Linienführung Die Überschneidung in Abbildung 2.2 lässt sich durch das Einfügen eines Hilfspunktes in die Linie auflösen. Dadurch wird die Linie in zwei Segmente aufgeteilt und um Knoten A herumgeführt. Obwohl diese Linie jetzt nicht mehr direkt vom Start- zum Endpunkt führt, sondern den Umweg über einen Hilfspunkt nimmt, wird im Folgenden für diesen Ansatz weiterhin der Begriff der direkten Linienführung verwendet. Oftmals reicht jedoch ein einzelner Hilfspunkt nicht aus, um eine Linie um ein Hindernis herumzuführen. Liegen die Knoten ungünstig, wie z.B. in der Konstellation von Abbildung 2.3, sind zwei Hilfspunkte nötig, um das Hindernis zu umfahren, da nach dem Einfügen des ersten Hilfspunktes eines der beiden enstandenen Segmente wiederum durch Knoten B hindurchführt. Abbildung 2.3: Einfügen mehrer Hilfspunkte Je grösser das im Weg stehende Hindernis ist, desto eher sind zwei Hilfspunkte nötig um eine Linie darum herum zu führen. Da abstrakte Objekte und Objektmengen in Adora-Modellen aufgrund der Kompositionsabstraktion weiterer Knoten enthalten können, haben sie oftmals eine grosse Ausdehnung. Werden zwei Hilfspunkte benötigt, um eine Linie um ein Hindernis herumzuführen, so verläuft diese Linie, wie Abbildung 2.3 illustriert, in einem gewissen Bereich parallel zum Rand des Hindernisses. Damit geht ein grosser Vorteil der direkten Linienführung verloren, dass nämlich Linien leicht von Knoten zu unterscheiden sind, da sie, im Gegensatz zu den Rändern der Knoten, weder horizontal noch vertikal verlaufen. KAPITEL 2. PROBLEMSTELLUNG 2.1.2 19 Orthogonale Linien Bei der orthogonalen oder rechtwinkligen Linienführung besteht eine Linie nur aus horizontalen und vertikalen Segmenten. Der Begriff orthogonal bezieht sich dabei auf die einzelnen Segmente einer Linie, die immer orthogonal d.h. rechtwinklig aufeinandertreffen. Dieser Ansatz der Linienführung kommt z.B. bei Gegenstands-Beziehungs-Modellen im Bereich der Datenbanken oder oft auch bei UML-Klassenmodellen zum Einsatz. Eine orthogonal geführte Linie enthält, ausser wenn eine direkte horizontale oder vertikale Verbindung zwischen dem Start- und Endpunkt möglich ist, auch dann Hilfspunkte, wenn sie nicht um ein Hindernis herumführt. Die Linien werden dadurch länger und verbinden die beteiligten Knoten nicht mehr auf dem direkten Weg. Da die Linien jedoch nur aus horizontalen und vertikalen Segmenten bestehen, fügen sie sich nahtlos in Modelle, die in erster Linie aus rechteckigen Knoten bestehen, ein. Beispiele solcher Modelle sind die GegenstandsBeziehungs-Modelle, UML-Klassenmodelle und auch Adora-Modelle. Dies hat jedoch auch den Nachteil, dass es schwieriger wird, Linien von den Rändern der Knoten zu unterscheiden, vor allem wenn jeweils nur Teile der Linien oder Knoten sichtbar sind. Abbildung 2.4 zeigt das Beispiel aus Abbildung 2.2 mit orthogonal geführten Linien. Abbildung 2.4: Orthogonale Linienführung Überschneidungen von orthogonalen Linien mit Knoten können - wie in Abbildung 2.4 angedeutet - ebenfalls durch das Einfügen von Hilfspunkten oder aber durch das Verschieben von einzelnen oder mehreren Segmenten aufgelöst werden. Da eine orthogonal geführte Linie normalerweise bedeutend mehr Hilfspunkte enthält als eine direkte Linienführung, ist es oftmals möglich, die Linie ohne das Einfügen zusätzlicher Hilfspunkte nur durch das Verschieben bereits bestehender Hilfspunkte um das Hindernis herumzuführen. 2.1.3 Weitere Ansätze Zur Linienführung sind beliebige weitere Ansätze denkbar. So schlägt Berner [Ber02] den Einsatz von Splines vor, um die Linien als Kurven um Hindernisse herumzuführen. Eine solche Linienführung hat den Vorteil, dass sich die Linien stark von den rechteckigen Knoten abheben. Eine solche Linienführung hat wie die direkte Linienführung die Tendenz, dass sich Linien, die um mehrere grössere Hindernisse herumgeführt werden müssen, immer stärker der rechteckigen Form der Hindernisse angleichen und damit einer orthogonalen Linienführung immer ähnlicher werden. Die verschiedenen Ansätze können auch kombiniert werden. Abbil- KAPITEL 2. PROBLEMSTELLUNG 20 dung 2.5 illustriert drei weitere Möglichkeiten, um die Linie zur Verbindung der Knoten A und D zwischen den Knoten B und C hindurchzuführen. In Abbildung 2.5a wird die Linie durch den Einsatz von Splines geführt, Abbildung 2.5b und Abbildung 2.5c sind Kombinationen der verschiedenen Ansätze. Von all diesen Ansätzen geniessen der direkte und orthogonale Ansatz die weiteste Verbreitung. Abbildung 2.5: Weitere Ansätze zur Linienführung 2.1.4 Beurteilungskriterien Die Beurteilung der Qualität einer bestimmten Art der Linienführung erfolgt meistens anhand von bestimmten ästhetischen Kriterien wie z.B. der Anzahl der Linienschnittpunkte oder der durchschnittlichen Länge der Linien. Oftmals geben jedoch auch einfach persönliche Präferenzen den Ausschlag, die Linien z.B. direkt oder orthogonal zu führen. Daneben haben sich für bestimmte Bereiche auch bestimmte Stile der Linienführung durchgesetzt. So werden z.B. beim Zeichnen von Gegenstands-Beziehungs-Modellen die Linien in der Regel orthogonal geführt. Welchen Einfluss die Art der Linienführung auf die Lesbarkeit und Verständlichkeit von graphischen Modellen hat, ist kaum untersucht. Nur gerade im Bereich des Graphenlayouts wurde versucht anhand von Experimenten [Pur98] herauszufinden, welchen Faktoren die Lesbarkeit und Verständlichkeit eines Graphen positiv oder negativ beeinflussen. Dabei mussten die Probanden bestimmte Fragen zu den Graphen beantworten (z.B. wie lange der kürzeste Weg zwischen zwei Knoten ist). Die Anzahl der korrekten Antworten und die Zeit, die zur Beantwortung einer Frage benötigt wurde, wurden danach ausgewertet. Dabei zeigte sich, dass eine hohe Anzahl von Linienüberschneidungen und von Hilfspunkten in einer Linie die Lesbarkeit negativ beeinflussen. Eine direkte Übertragung dieser Resultate auf die Linienführung in einem Adora-Modell is aber kaum möglich, da sich diese stark von Graphen unterscheiden. So haben die Knoten bei einem Adora-Modell im Gegensatz zu den Graphen eine nicht vernachlässigbare Ausdehnung und die Position und Grösse der Knoten können - im Gegensatz zu den Graphenlayoutern - zur Optimierung der Linienführung nicht verändert werden. 2.1.5 Linienführung in Adora-Modellen Die Frage, welche Art der Linienführung für Adora-Modelle am geeignetsten ist, lässt sich nur schwer beantworten. Zum einen spielen dabei wiederum persönliche Präferenzen eine wichtige Rolle. Zum anderen können Linien, die unterschiedliche Beziehungen repräsentieren auch KAPITEL 2. PROBLEMSTELLUNG 21 unterschiedlich geführt werden. Als Beispiel hierzu soll das Scenariochart [Xia04] (vgl. dazu Abschnitt 1.3.2) aus Abbildung 2.6 dienen. Ein Scenariochart bildet eine Baumstruktur; die Linien zwischen den Szenarien repräsentieren also hierarchische Beziehungen. Baumstrukturen werden in der Regel mit einer direkten Linienführung visualisiert, wie dies auch für Abbildung 2.6a der Fall ist. Werden die Linien wie in Abbildung 2.6b orthogonal geführt, so ist für den erfahrenen Benutzer nicht sofort ersichtlich, dass es sich dabei um eine Baumstruktur handelt. Für Assoziationen zwischen abstrakten Objekten oder Objektmengen kann jedoch eine orthogonale Linienführung besser geeignet sein, da sich eine orthogonale Linienführung, wie in Abschnitt 2.1.2 beschrieben, für Layouts mit primär rechteckigen Hindernissen besonders eignet. Zusätzlich können die verschiedenen Beziehungen in der Visualisierung auch leichter voneinander unterschieden werden, wenn die Linien, die sie repräsentieren, unterschiedlich geführt werden. Abbildung 2.6: Linienführung in einem Scenariochart Ästhetische Kriterien für die Linienführung in Adora-Modellen lassen sich aus den Kriterien, die für das Zeichnen von Graphen (vgl. dazu Abschnitt 3.1) entwickelt wurden, ableiten. Das Kriterium, dass es zu keinen Überschneidungen zwischen Knoten und Linien kommen darf, ist eine grundlegende Anforderung an den Ansatz zur Linienführung und taucht deshalb in der folgenden Aufzählung nicht auf. • Möglichst kurze Linien. Wird eine Linie nicht direkt von Start- zum Endpunkt geführt, sondern über Umwege, so wird es für den Betrachter schwieriger herauszufinden, welchen Knoten durch eine Linie miteinander verbunden sind. Folgt die Linie, dem Weg, den das Auge beim Wechsel des Fokus von einem Knoten zu einem anderen nimmt, so lässt sich die Verbindung dieser beiden Knoten sofort erkennen. • Minimierung der Anzahl Hilfspunkte. Mit zunehmender Anzahl von Hilfspunkten steigt auch der Aufwand, der nötig ist, um einer Linie zu folgen. • Vermeidung von Linienüberlappungen und -überschneidungen. Kommt es zu KAPITEL 2. PROBLEMSTELLUNG 22 Überlappungen oder Überschneidungen3 von Linien, so muss der Betracher die beiden Linien zuerst voneinder trennen, um ihnen folgen zu können. Diese Kriterien stehen jedoch in vielen Fällen in Konflikt zueinander. So kann es z.B. nötig werden eine Linie zu verlegen, um Überschneidungen mit anderen Linien zu verhindern. Dadurch entspricht die Linie unter Umständen aber nicht mehr der kürzest möglichen Linie. 2.2 Dynamisches Layout Zusätzlich zum Problem der Linienführung mit Hindernissen muss der Linienführungsalgorithmus in einem Adora-Modell auch auf Veränderungen am Layout, wie sie z.B. durch den Zoom-Algorithmus hervorgerufen werden, entsprechend reagieren. Durch das Zoomen verändern sich die Grössen und Positionen der Knoten und sichtbare Linien können verschwinden und neue Linien können sichtbar werden. Durch die Verschiebung und Änderung der Grösse von Knoten können Überschneidungen mit Linien verschwinden oder neue hinzukommen. Das dynamische Layout von Adora-Modellen kommt jedoch nicht nur durch den Zoom-Algorithmus zu Stande, sondern z.B. auch durch das Ein- und Ausblenden von verschiedenen Aspekten. Die Visualisierung von Adora-Modellen unterscheidet sich z.B. von UML-Klassendiagrammen darin, dass verschiedene Darstellungen - je nach Abstraktionsebene und eingeblendeter Aspekte - dynamisch aus dem integrierten Gesamtmodell generiert werden. 2.2.1 Mental Map des Benutzers Bei der Arbeit mit graphischen Repräsentationen entwickelt der Benutzer eine sogenannten Mental Map [Ead91], [Ead95] der Darstellung. Diese Mental Map ermöglicht es ihm, sich vor allem in grossen und komplexen Darstellungen schnell und ohne grosse Mühe zurecht zu finden. So muss der Benutzer nach kurzer Zeit z.B. nicht mehr das gesamte Adora-Modell durchsuchen um einen bestimmten Knoten zu finden, sondern er sucht diese instiktiv an der richtigen Stelle. Die Mental Map beschränkt sich jedoch nicht nur auf graphische Modelle, sondern ist für alle Bereiche, die eine Orientierung erfordern, von Bedeutung. Werden die Erwartungen, die aus der Mental Map resultieren (z.B. der Ort an dem sich ein Knoten befinden sollte), nicht erfüllt, so findet sich der Benutzer im Modell kaum mehr zurecht und muss sich wieder eine neue Mental Map aufbauen. Automatische Eingriffe in die graphische Darstellung von Modellen sollten deshalb dafür sorgen, dass die Darstellung auch nach ihrer Anwendung noch möglichst mit der Mental Map des Benutzers übereinstimmt. Im Falle von Adora-Modellen betrifft dies in erster Linie den Zoom- und Linienführungsalgorithmus. Der Zoom-Algorithmus hat sich dabei um die Wahrung der relativen Position von Knoten gegenüber benachbarten Knoten zu bemühen. Durch das in Abschnitt 1.4 beschriebene Vorgehen wird versucht dieser Forderung so gut als möglich gerecht zu werden. Der Linienführungsalgorithmus muss versuchen, die Linien bei einer Veränderung des Layouts durch den Zoom-Algorithmus so anzupassen, dass sie weiter 3 Unter Überschneidung ist dabei die Kreuzung von zwei Linien zu verstehen. Bei einer Überlappung kommen die Linien in einem bestimmten Bereich aufeinander zu liegen. KAPITEL 2. PROBLEMSTELLUNG 23 mit der Mental Map des Benutzers übereinstimmen. Abbildung 2.7 zeigt ein einfaches AdoraModell vor und nach der Vergröberung von Knoten B. Der Zoom-Algorithmus platziert die Knoten A und C so, dass die Darstellung weiterhin der Mental Map des Benutzers entspricht. Innerhalb dieses angepassten Layouts muss der Linienführungsalgorithmus nun dafür sorgen, dass sich die Darstellung der Verbindung der Knoten A und C nur soweit verändert, dass eine schnelle Wiedererkennug ermöglicht wird. Abbildung 2.7: Veränderung des Layouts durch den Zoom-Algorithmus Wie bereits in Abschnitt 1.4 beschrieben, verändert der Zoom-Algorithmus in gewissen Situationen das Layout so stark, dass die Darstellung nur noch teilweise mit der Mental Map des Benutzers übereinstimmt. Im Weiteren ist der Algorithmus auch nicht stabil, d.h. die Umkehrung eines Zoom-Schrittes führt in vielen Fällen nicht mehr zum Ausgangslayout zurück. Da der Linienführungsalgorithmus auf das vom Zoom-Algorithmus veränderte Layout aufsetzen muss, kann er die Mental Map der Linien nur in dem Umfang erhalten, in dem der Zoom-Algorithmus die Mental Map bei der Positionierung der Knoten bewahrt. Zerstört also der Zoom-Algorithmus (oder eine andere Layout-Operation) die Mental Map des Layouts, so kann der Linienführungsalgorithmus normalerweise auch die Mental Map der Linien nicht mehr erhalten. 2.2.2 Mental Map einer Linie Gewisse Autoren (wie z.B. [Nor96]) argumentieren, dass für die Mental Map einer Darstellung nur die Positionen und Grössen der Knoten eine Rolle spielen. Bei Knoten erinnert sich der Benutzer an deren Position, Linien sind jedoch nur von Bedeutung, um Verbindungen “on the fly” zu erkennen und haben damit keinen Einfluss auf die Mental Map. Dieser Ansatz wird jedoch in dieser Arbeit nicht weiterverfolgt, da er auch keine Sekundärnotation ermöglicht. Für die Wiedererkennung einer Linie und damit mit der grössten Bedeutung fü die Erhaltung die Mental Map des Benutzers kommen verschiedene Eigenschaften einer Linie in Frage. Es sind dies unter anderem der Start- und Endpunkt auf dem Rand der beteiligten Knoten, die Anzahl der Hilfspunkte in der Linie oder dem Umstand, auf welcher Seite die Linie um ein bestimmtes Hindernis herumführt. Die Mental Map einer Linie ist dabei in hohem Masse von den Knoten, zwischen denen die Linie hindurchführt, anhängig. So bleibt die Mental Map der Linie in Abbildung 2.7 in erster Linie dadurch erhalten, dass die relative Position des vertikalen Liniensegments gegenüber den Knoten A und B gleich bleibt. Normalerweise ist es jedoch aus folgenden Gründen nicht möglich, alle diese Eigenschaften auch nach der KAPITEL 2. PROBLEMSTELLUNG 24 Veränderung des Layouts durch den Zoom-Algorithmus beizubehalten. Erstens kann sich das Layout so stark verändern, dass es mit der Erhaltung gewisser Eigenschaften zu einer unsinnigen Linienführung kommt. Und zweitens stehen gewisse Eigenschaften, wie Abbildung 2.8 veranschaulicht, in Konflikt zueinander. So ändert sich zwar bei der Lösung b) die Anzahl der Hilfspunkte in der Linie nicht, der Startpunkt auf der Startknoten befindet sich nach dem Zoom-Schritt jedoch nicht mehr auf dem linken, sondern auf dem oberen Rand. Lösung c) bewahrt zwar den Startpunkt verändert jedoch die Anzahl der Hilfspunkte. Abbildung 2.8: Konflikt bei der Erhaltung der Mental Map einer Linie Eine grosse Bedeutung bei der Erhaltung der Mental Map spielt die Invertierbarkeit (vgl. dazu Abschnitt 1.4) von Operationen, die Veränderungen am Layout vornehmen. Für den Linienführungsalgorithmus bedeutet dies, dass eine Linie nach einer auf eine Vergröberung folgende Verfeinerung eines Knotens wieder gleich aussehen sollte, wie vor der Vergröberung des Knotens. Der Linienführungsalgorithmus kann diese Invertierbarkeit jedoch nur garantieren, sofern auch der Zoom-Algorithmus dies tut. Dies ist, wie in Abschnitt 1.4 besprochen, nicht immer der Fall. 2.3 Sekundärnotation Neben der Primärnotation, durch die Symbole für die Repräsentation der verschiedenen Sprachkonstrukte definiert sind, ist für eine gute Verständlichkeit graphischer Repräsentationen die sogennante Sekundärnotation [Pet95] von grosser Bedeutung. Die Sekundärnotation umfasst das Layout der Darstellung, d.h. die Positionen und Grössen der Elemente bzw. Knoten. Bestimmte Strukturen und Beziehungen eines Modells werden erst durch die Position und Grösse der Elemente offensichtlicht. Zusätzlich lassen sich durch das Layouts für erfahrene Benutzer leicht bestimmte Muster im Modell erkennen. Bei Adora-Modellen wird die Sekundärnotation durch den Benutzer bei der Erstellung des Modells oder bei nachträglichen manuellen Änderungen definiert. Unter dem Begriff der Sekundärnotation werden deshalb bei Adora-Modellen die vom Benutzer manuell an der Darstellung vergenommenen Änderungen zusammengefasst. Die in Abschnitt 2.2.1 beschriebene Mental Map entspricht damit dem Layout, wie es durch den Benutzer mit Hilfe der Sekundärnotation definiert wird. Die Erhaltung der Mental Map wäre zwar auch ohne Einbezug der Sekundärnotation möglich, indem gar keine Änderungen durch den Benutzer zugelassen oder diese einfach ignoriert würden, wie dies z.B. bei automatischen Graphenlayoutern der Fall ist. Das Umgekehrte ist jedoch nicht der Fall, d.h. eine Sekundärnotation macht nur Sinn, wenn dadurch die Mental Map definiert wird und diese auch bei automatischen Änderungen KAPITEL 2. PROBLEMSTELLUNG 25 am Layout so weit wie möglich erhalten bleibt. 2.3.1 Sekundärnotation der Linienführung Im Bereich des Layouts wird die Sekundärnotation durch die Position und Grösse der Knoten definiert, da dies die Eigenschaften sind, die der Benutzer verändern kann. Bei der Linienführung sind die Linieneigenschaften, die die Sekundärnotation ausmachen, weniger offensichtlich. Bei allen Ansätzen kommt die Position der Start- und Endpunkte auf den Rändern der beteiligte Knoten als durch den Benutzer veränderbare Eigenschaft (und damit als Teil der Sekundärnotation) in Frage. Wie Abbildung 2.9 zeigt, hat der Benutzer bei der orthogonalen Linienführung bereits mit der Wahl der Start- und Endpunkte einen starken Einfluss darauf, wie die Linie zwischen den Knoten A und B geführt wird. So sind durch die Wahl von Start- und Endpunkt der Linien vier verschieden Linien möglich. Abbildung 2.9: Einfluss der Start- und Endpunkte auf die orthogonale Linienführung Ebenfalls als Teil der Sekundärnotation kommt die Position von Hilfspunkten in den Linien in Frage. Bei der orthogonalen Linienführung ist es dabei jedoch nicht möglich, nur einen einzelnen Punkt zu verschieben, da sonst die Linie nicht mehr nur aus horizontalen oder vertikalen Segmenten besteht. Es ist deshalb nur möglich ein Liniensegment und damit gleichzeitig zwei Punkte zu verschieben. Abbildung 2.10 veranschaulicht das Verändern der Position von Hilfspunkten sowohl bei der direkten als auch bei der orthogonalen Linienführung. Abbildung 2.10: Einflussnahme bei der direkten und orthogonalen Linienführung KAPITEL 2. PROBLEMSTELLUNG 26 Den grösstmöglichen Einfluss auf die Linienführung hätte der Benutzer dadurch, dass er beliebige Punkte auswählen könnte, durch welche die entsprechende Linie dann z.B. orthogonal hindurchgeführt wird. Ein solch starker Einbezug des Benutzers bringt jedoch zwei grundlegende Probleme mit sich. Erstens ist eine gewisse Automatisierung unerlässlich, da sich der Benutzer sonst kaum mehr um seine eigentliche Aufgabe, nämlich der Erstellung oder Bearbeitung eines Modells kümmern kann, da er zu stark mit Fragen des Layouts beschäftigt ist. Und zweitens ist eine solche vom Benutzer frei gewälte Linienführung nach der Anwendung des Zoom-Algorithmus (oder einer anderen Layout-Operation) oftmals nicht mehr sinnvoll, da sich das Layout zu stark verändert. 2.3.2 Änderungen am Layout Änderungen am Layout eines Adora-Modells können auf zwei verschiedene Arten auftreten: durch eine Layout-Operation wie z.B. den Zoom-Algorithmus oder manuell durch den Benutzer. Im ersten Fall ist die Erhaltung der Sekundärnotation (und damit der Mental Map) in jedem Fall in so hohem Masse wie möglich zu gewährleisten. Aber auch bei manuellen Änderungen durch den Benutzer kann die Erhaltung der Sekundärnotation Sinn machen. Und dies, obwohl eine solche Änderungen selbst die Sekundärnotation verändert. Abbildung 2.11 veranschaulicht eine solche Situation: Obwohl Knoten C und damit der Startpunkt der Linie verschoben wird, bleibt die Sekundärnotation der Linie erhalten, indem der Abstand des horizontalen Segments gegenüber Knoten A gleich bleibt. Abbildung 2.11: Erhaltung der Sekundärnotation bei manuellen Änderungen 2.4 Anforderungen an einen Linienführungsalgorithmus Zusammenfassend stellen sich an einen Linienführungsalgorithmus für Adora-Modelle folgende Anforderungen: 1. Der Linienführungsalgorithmus muss in der Lage sein, Linien in einem statischen Layout um Hindernisse herumzuführen ohne dabei das Layout (d.h. die Positionen und Grössen der Knoten) zu verändern. Darunter fällt auch die Verhinderung von Überschneidungen von Linien. KAPITEL 2. PROBLEMSTELLUNG 27 2. Bestehende Linien müssen bei der Anwendung des Zoom-Algorithmus (oder anderen Layout-Operationen) angepasst werden, ohne dass dabei neue Überschneidungen oder Überlappungen auftreten. Der für diese Anpassung verantwortliche Algorithmus muss dabei eine Laufzeit aufweisen, die eine interaktive Nutzung ermöglicht. Die vom ZoomAlgorithmus vorgenommenen Veränderungen am Layout verunmöglichen jedoch in vielen Fällen eine Anpassung der Linie, wodurch die Linie komplett neu geführt werden muss. 3. Die Sekundärnoation, d.h. manuelle Änderungen an den Linien, müssen bei diesen Anpassungen - so weit wie möglich - erhalten bleiben. Kapitel 3 Bestehende Ansätze der Linienführung Die Aufgabe, Linien zur Verbindung von zwei Punkten zwischen Hindernissen hindurchzuführen, stellt sich in verschiedenen Bereichen. Einer davon ist die graphische Darstellung von Informationen, z.B. Objekten und Beziehungen zwischen diesen Objekten. Da Graphen genau solche Beziehungen zwischen Objekten beschreiben, werden diese durch das Zeichnen von Graphen visualisiert. Die Objekte werden dabei als Knoten und die Beziehungen als Kanten bezeichnet. In einem Graph können dabei die verschiedensten Beziehungen repräsentiert werden, z.B. Verwandschaftsbeziehungen in einem Stammbaum oder Verkehrsverbindungen in Netzplänen von Verkehrsbetrieben. Auch die verschiedenen Beziehungen in einem AdoraModell können durch einen Graphen beschrieben werden. Aus Grüden der Übersichtlichkeit ist beim Zeichnen von Graphen darauf zu achten, dass es zu möglichst wenigen Überschneidungen zwischen Knoten und Kanten und Kanten untereinander kommt [Pur98]. Damit weist das Zeichnen von Graphen grosse Ähnlichkeiten zur Linienführung in Adora-Modellen auf. Eine etwas andere Aufgabe hat die Linienführung im Bereich des Schaltungsentwurfs. Dabei repräsentieren die Linien nicht bloss Beziehungen, sondern stellen physische Verbindungen zwischen den verschiedenen Elementen dar. Dadurch stellen sich auch andere Anforderungen an einen Algorithmus, der diese elektrischen Leitungen durch das Layout hindurchführt. So müssen z.B. Überschneidungen von Leitungen untereinander in jedem Fall verhindert werden, da damit die Platine oder Schaltung zerstört werden würde. Im Gegensatz zum Graphenlayout sind die Positionen und Grössen der Schaltungselemente in der Regel fest vorgegeben und können bei der Linienführung nicht verändert werden. Die in diesem Kapitel vorgestellten Ansätze zur Linienführung gehen von einem statischen Layout1 aus, d.h. das Layout ändert sich nur, wenn der Benutzer Veränderungen daran vornimmt. Ein dynamisches Layout, wie es bei den Adora-Modellen z.B. durch den ZoomAlgorithmus entsteht, ist bei diesen Ansätzen nicht vorgesehen. Auf mögliche Strategien zur Linienführung in einem dynamischen Layout geht Kapitel 4 ein. 1 Das Layout umfasst dabei nur die Elemente, die bei der Linienführung Hindernisse darstellen, nicht jedoch die Linien selbst. In einem Graph wird das Layout damit durch die Position und Grössen der Knoten definiert; beim Schaltungsentwurf durch die Positionen und Grössen der Schaltungselemente. 28 KAPITEL 3. BESTEHENDE ANSÄTZE DER LINIENFÜHRUNG 3.1 29 Automatisches Layouten von Graphen Anschaulich bestehen Graphen2 aus eine Menge von Punkten, die durch Linien miteinander verbunden sind, wobei die Linien Beziehungen zwischen den Punkten repräsentieren. Die Punkte werden dabei als Knoten, die Linien als Kanten bezeichnet. Die Anwendungsmöglichkeiten von Graphen sind sehr vielfältig. So werden z.B. beim Entwurf von Datenbanken als Gegenstands-Beziehungs-Modellen oder zur Beschreibung sozialer Netzwerke Graphen eingesetzt. Dementsprechend hat sich die Visualisierung von Graphen als Untergebiet der Informatik und der Mathematik etabliert. Beim automatischen Layouten von Graphen wird das Layout (d.h. die Positionierung der Knoten) in erster Linie durch die Beziehungen zwischen den Knoten (und damit den Kanten) bestimmt. Die Knoten werden so platziert, dass es zu keinen oder möglichst wenig Überschneidungen zwischen Knoten und Kanten kommt. Im Gegensatz dazu wird das Layout von Adora-Modellen durch den Benutzer bestimmt und die Linienführung muss nachträglich auf diesem vorgegebenen Layout operieren. Daneben wird ein Adora-Modell inkrementell erstellt, d.h. die Knoten und Linien werden nach und nach dem Modell hinzugefügt. Damit ein automatischer Graphenlayouter das Layout eines Graphen berechnen kann, müssen alle Knoten und Kanten bekannt sein, d.h. der Erstellung des Graph muss vor der Anwendung des Layouters abgeschlossen sein. Um das Layout eines Graphen automatisch (d.h. durch einen Algorithmus) festzulegen, werden Kriterien benötigt, um die Qualität eines Layouts zu beurteilen. Je nach Anwendungsbereich unterscheiden sich auch diese Kriterien, da beim Layout eines Graphen nicht nur dessen strukturelle Eigenschaften, sondern auch zusätzliches Wissen über die Semantik des Graphen eine wichtige Rolle spielt. So werden z.B. bei einem Stammbaum die Knoten in der Regel nach Geburtsdatum der betreffenden Personen sortiert von oben nach unten oder von links nach rechts angeordnet. Da Graphenlayouts in den meisten Fällen zur Visualisierung von Informationen und damit für menschliche Betrachter erstellt werden, werden die Kriterien zur Beurteilung der Qualität des Layouts als ästhetische Kriterien bezeichnet. Diese Kriterien sind aber sowohl von der Anwendung als auch vom Betrachter abhängig und deshalb oft subjektiver Natur. Die folgende Aufzählung enthält eine Auswahl aus den am häufigsten genannten ästhetische Kriterien (vgl. dazu z.B. [Pur98]). • Minimierung von Linienüberschneidungen. Kommt es zu vielen Linienüberschneidungen, so wird es für einen Betrachter mühsam herauszufinden, welche Knoten miteinder verbunden sind. Kann ein Graph ohne Linienüberschneidungen gezeichnet werden, so wird er als planar bezeichnet. • Minimierung der Knicke in den Linien. Die Anzahl der Knicke oder Hilfspunkte spielt v.a. bei der orthogonalen Linineführung eine wichtige Rolle. Wird eine Linie mit Hilfe einer grossen Anzahl von Hilfspunkten geführt, so wird es für den Betrachter schwieriger, der Linie zu folgen. • Minimierung der Ausdehnung. Ein Layout, bei dem die Knoten gleichmässig über den zur Verfügung stehenden Raum verteilt sind, wird in der Regel als angenehmer empfunden als ein Layout, bei dem sich grosse Lücken zwischen den Knoten befinden. 2 Im Folgenden wird der Begriff Graph als Oberbegriff benutzt. Es wird also nicht weiter zwischen einfachen Graphen und spezielleren Graphen wie z.B. Multigraphen unterschieden. KAPITEL 3. BESTEHENDE ANSÄTZE DER LINIENFÜHRUNG 30 • Symmetrien veranschaulichen. Sind in den zu visualisierenden Daten Symmetrien enthalten, so sollten diese durch das Layout sichtbar gemacht werden. • Gruppen zusammenfassen. Weist die Struktur der Daten auf eine Aufteilung in verschiedene Gruppen hin, so sollten die Knoten so platziert werden, dass diese Gruppenstrukturen sichtbar werden. Die ersten drei Kriterien beziehen sich nur auf das Aussehen des visualisierten Graphen, während die letzten beiden Kriterien zusätzliche in den Daten enthaltenen Informationen sichtbar machen sollen. Mit den in Abschnitt 2.1.4 beschriebenen Experimenten versuchte Purchase [Pur98] die Bedeutung der verschiedenen ästhetische Kriterien für die Lesbarkeit und Verständlichkeit von Graphen zu klären. Dabei zeigte sich, dass in erster Linie eine hohe Anzahl von Linienüberschneidungen und Knicken in den Linien die Lesbarkeit erschwert. Einige der genannten Kriterien können nicht effizient (d.h. mit akzeptabler Laufzeit des Algorithmus) optimiert werden, wodurch oftmals auf Heuristiken zurückgegriffen werden muss. Zusätzlich kann es zu Konflikten zwischen den verschiedenen Kriterien kommen. 3.1.1 Graphenlayouter Für das automatische Layouten von Graphen wurden im Verlauf der Zeit eine grosse Anzahl von Algorithmen entwickelt, wobei die oben genannten Kriterien jeweils unterschiedlich stark gewichtet werden. Die Algorithmen sind oftmals auf einen bestimmten Anwendungsbereich ausgerichtet, da für eine ansprechendes Layout in vielen Fällen zusätzliche Informationen über den Anwendungsbereich benötigt werden. Eine ganze Gruppe von Algorithmen zum automatischen Layouten von Graphen beruht z.B. auf dem kräftebasierten Ansatz [Ead84]. Dabei bilden die Graphen ein System von interagierenden physikalischen Objekten, das von verschiedenen Kräften bestimmt wird. Als physikalische Analogie verhalten sich die Knoten eines Graphen wie Kugeln, die sich gegenseitig abstossen. Diese Kugeln werden durch Federn miteinander verbunden, d.h. die Kanten des Graphen werden durch Federn ersetzt. Die Federn üben, je nachdem ob sie gestreckt oder gestaucht werden, unterschiedliche Kräfte auf das physikalische System aus. Der kräftebasierte Algorithmus versucht nun ein Gleichgewicht aller im System wirkenden Kräfte herzustellen und das System damit in einen stabilen Zustand zu überführen. Das ganze aus Kugeln bestehende System wird also einfach “losgelassen”, wodurch sich überdehnte Federn zusammenziehen und gestauchte Federn ausdehnen. Das Vorgehen führt somit dazu, dass die Knoten gleichmässig verteilt werden und adjazente3 Knoten nahe beieinander liegen. Für die grosse Akzeptanz des kräftebasierten Ansatzes sind dabei in erster Linie die folgenden Eigenschaften verantwortlich: Aufgrund seiner physikalischen Analogie ist er sehr intuitiv und damit in seinen Grundlagen leicht verständlich. In seiner einfachen Form lässt er sich auch relativ leicht implementieren und liefert in vielen Fällen gute Ergebnisse. Die Linien werden beim kräftebasierten Ansatz direkt vom Start- zum Endknoten geführt. Dabei stellen Überschneidungen zwischen Kanten und Knoten aus zwei Gründen kein grosses Problem dar. Erstens werden die Knoten so angeordnet, dass adjazente Knoten nahe beieinander liegen und damit treten lange Kanten nur selten auf. Und zweitens haben die Knoten in 3 Knoten werden in einem Graphen als adjazent bezeichnet, wenn sie durch eine Kante miteinander verbunden sind. KAPITEL 3. BESTEHENDE ANSÄTZE DER LINIENFÜHRUNG 31 der Regel gar keine oder eine vernachlässigbare Ausdehnung, wodurch sich durch eine kleine Verschiebung eines Knotens eine Überschneidung leicht auflösen lässt. Bezüglich der Visualisierung der Knoten gleichen Adora-Modelle UML-Klassendiagrammen, da die Knoten sowohl in Adora-Modellen als auch in UML-Klassenmodellen eine relative grosse Ausdehnung haben. Der Ansatz von Eiglsperger [Eig03] z.B. platziert die Knoten in einem UML-Klassendiagramm so, dass es zu möglichst wenigen Überschneidungen zwischen Knoten und Linien kommt, und führt die Linien zur Repräsentation der Beziehungen orthogonal zwischen den Knoten hindurch. Die Platzierung der Knoten und die Linienführung bilden dabei wieder eine Einheit, d.h. die Knoten werden so platziert, dass möglichst wenig Linienüberscheidungen auftreten. Aufbauend auf diesem Ansatz ermöglicht der in yFiles [Wie01] implementierte Graphenlayouter auch eine automatische orthogonale Linienführung in einem durch den Benutzer vorgegebenen Layout, d.h. die Erstellung des Layouts (d.h. die Platzierung der Knoten) und die Linienführung werden getrennt voneinander durchgeführt. Der zu Grunde liegende Algorithmus versucht dabei jeweils die Linienführung global, d.h. unter Einbezug aller existierenden Linien, zu optimieren. Dadurch kann das Hinzufügen einer einzelnen neuen Linie Veränderungen an einem grossen Teil der bestehenden Linien verursachen. Abbildung 3.1 illustriert den Vorgang, bei dem das Hinzufügen der Linie zwischen den Knoten C und D zu einer komplett neuen Führung der bestehenden Linie zwischen den Knoten A und E führt. Abbildung 3.1: Verlegung von bestehenden Linien durch yFiles 3.1.2 Layouten von dynamischen Graphen Viele Szenarien beim Graphenlayout sind in dem Sinne dynamisch, dass sie ein wiederholtes Layouten des Graphen nach Änderungen an dessen Struktur oder den Layouteigenschaften erfordern. Die einfachste Möglichkeit zur Behandlung dieser Dynamik besteht darin, jede Modifikation als komplett eigenständiges Problem zu betrachten und deshalb auch losgelöst vom bestehenden Layout zu behandeln, d.h. das Layout des Graphen wird einfach komplett neu berechnet. Ein solches Vorgehen hat jedoch zwei bedeutende Nachteile: Erstens ist es ineffizient, aufgrund einer kleinen lokalen Änderung das gesamte Layout neu zu berechnen. Und zweitens zerstört ein solches Vorgehen die in Abschnitt 2.2.1 beschriebene Mental Map KAPITEL 3. BESTEHENDE ANSÄTZE DER LINIENFÜHRUNG 32 des Benutzers. Aus diesem Grund haben sich eine Reihe von Autoren mit dem dynamischen Zeichnen von Graphen beschäftigt. Die Dynamik kommt dabei durch vom Benutzer vorgenommene Änderungen (z.B. dem Hinzufügen oder Entfernen von Knoten) zu Stande, und beschränkt sich damit auf einen kleinen Teilbereich des Graphen. Um die Mental Map des Benutzers zu erhalten existieren zwei Möglichkeiten: 1. Unterstützung des Benutzers, indem die Änderungen animiert oder hervorgehoben werden, damit sie leicht erkannt werden können und der Übergang zum neuen Layout sanft erfolgt. 2. Die Änderungen am Layout minimieren, um den Aufwand zur Erkennung von Ähnlichkeiten möglichst gering zu halten. Um das Layout möglichst schonend zu verändern kommen dabei zwei Vorgehensweisen in Frage: die Änderungen beschränken sich nur auf einen Teil der Knoten und Kanten oder das Ausmass der Änderung wird mit Hilfe eines Distanzmass gemessen und dann minimiert. Als Distanzmass kommt dabei z.B. die Summe der euklidischen Distanzen (z.B. [Bri98]), um die jeder Knoten durch die Änderung verschoben worden ist. Die dynamischen Graphen kommen dem dynamischen Layout von Adora-Modellen schon näher als die statischen Graphen, bei denen das Layout nach jeder Änderung komplett neu berechnet wird. Im Vergleich zum statischen Graphenlayout geniesst das Problem des dynamischen Layouts jedoch nur geringe Aufmerksamkeit. 3.1.3 Anwendbarkeit auf Adora-Modelle Im Bereich des automatischen Graphenlayouts wird die Linienführung fast ausnahmslos als integraler Teil des Layoutprozesses betrachtet. Die Linienführung wird dabei in erster Linie durch eine geschickte Positionierung der Knoten optimiert. Im Gegensatz dazu wird in einem Adora-Modell das Layout durch den Benutzer vorgegeben und die Linienführung hat sich im dadurch vorgegebenen Rahmen zu bewegen. Die Algorithmen aus dem Bereich des automatischen Layoutens von Graphen eignen sich deshalb nicht zur Linienführung in Adora-Modellen. Die automatischen Graphenlayouter operieren normalerweise auch auf einem statischen Layout, d.h. das Layout des Graphen wird einmal berechnet und ändert sich danach nicht mehr. Wird auf Änderungen Rücksicht genommen und das Layout nur schonend verändert, so müssen sich die Änderungen auf einen kleinen Teil des Graphen beschränken. Der ZoomAlgorithmus verändert demgegenüber praktisch das gesamte Layout eines Adora-Modells und die Dynamik in einem Adora-Modell hat damit ein ganz anderes Ausmass als sie im Bereich der automatischen Graphenlayouter behandelt wird. Da der gesamte Layoutprozess automatisch abläuft, hat der Benutzer normalerweise auch gar keinen Einfluss darauf. Selbst bei Algorithmen, die das Layout (d.h. die Positionen und Grössen der Knoten) nicht antasten und nur die Linien zwischen den Knoten hindurchführen, hat der Benutzer in den meisten Fällen keine Möglichkeit der Einflussnahme. So kann der Benutzer z.B. beim beschriebenen yFiles [Wie01] die Linienführung nur dadurch beeinflussen, dass er den Start- oder Endknoten verschiebt, an der Linie selbst sind keine Änderungen möglich. KAPITEL 3. BESTEHENDE ANSÄTZE DER LINIENFÜHRUNG 3.2 33 Schaltungsentwurf Auch elektronische Schaltungen bilden mit den elektronischen Elementen als Knoten und den elektrischen Leitungen als Kanten einen Graphen. Trotzdem hat sich das Gebiet des Entwurfes von Schaltung unabhängig vom Gebiet der Graphenlayouter entwickelt. Dies hat mehrere Gründe: Im Gegensatz zum Layout von Graphen hat das Layout von Platinen oder Schaltungen nicht den ästhetischen Kriterien eines menschlichen Betrachters, sondern technischen Kriterien, wie z.B. der Verhinderung von Überschneidungen von Leitungen oder maximal erlaubter Länge von Leitungen, zu genügen. Im Weiteren sind im Bereich des Entwurfs von Schaltungen das Layouten (d.h. das Platzieren der elektronischen Elementen) und die Linienführung4 zwei voneinander getrennte Arbeitsschritte, die nacheinander durchgeführt werden. Im Bereich hochintegrierter Schaltung (VLSI: Very Large Scale Integration) ist die Anzahl der Knoten und Kanten mit mehreren Millionen zusätzlich sehr hoch. Aufgrund dieser Unterschiede wird der Bereich des Schaltungsentwurfs hier auch getrennt von den automatischen Graphenlayoutern betrachtet. Im Bereich der elektrischen und elektronischen Schaltungen hat sich für die Linienführung der Stil der orthogonalen Linienführung durchgesetzt. Nur im Bereich von analogen Schaltungen werden die Leitungen teilweise auch schräg geführt. Da Überschneidungen von Leitungen in jedem Fall verhindert werden müssen, werden die Leitungen nicht nur auf einer Ebene, sondern in mehreren übereinanderliegenden Schichten geführt. Die Linienführung läuft damit nicht mehr nur im zwei-, sondern im dreidimensionalen Raum ab. Die folgende Diskussion beschränkt sich jedoch auf die Anwendung im zweidimensionalen Raum. Abbildung 3.2: Gitterstruktur Für die Linienführung beim Schaltungsentwurf wurden verschiedene Techniken entwickelt. Der grösste Teil davon arbeitet dabei mit einer aus uniformen Zellen bestehenden Gitterstruktur. Abbildung 3.2 zeigt ein Beispiel einer solchen Gitterstruktur. Dabei sollen die bei4 Das Führen der Leitungen wird im Bereich des Schaltungsentwurfs als Routing bezeichnet. Im Folgenden wird dafür jedoch der Begriff der Linienführung beibehalten. KAPITEL 3. BESTEHENDE ANSÄTZE DER LINIENFÜHRUNG 34 den mit S und E bezeichneten Zellen durch eine Linie miteinander verbunden werden, wobei die dunkelgrau hinterlegten Zellen Hindernisse darstellen. Weil sich die Linie wie in einem Labyrinth zwischen Hindernisse hindurchbewegen muss, wird diese Technik auch als Maze Routing bezeichnet. 3.2.1 Algorithmus von Lee Der bedeutenste Algorithmus, um einen Pfad durch eine uniforme Gitterstruktur zu finden, ist der Algorithmus von Lee [Lee61]. Es handelt sich dabei um eine Breitensuche, die garantiert den kürzest möglichen Pfad liefert. Der Algorithmus setzt sich aus zwei Phasen zusammen. Als Erstes werden vom Startpunkt aus in einer wellenförmigen Bewegung die Zellen mit einem Kostenwert versehen, bis dabei der Endpunkt erreicht wird. Danach wird vom Endpunkt aus anhand der Kostenwerte der Zellen der kürzeste Weg zum Startpunkt zurückverfolgt. Abbildung 3.3 illustriert die ersten und letzten drei Schritte der ersten Phase. Dabei sollen die beiden hellgrau hinterlegten Zellen miteinander verbunden werden, wobei die dunkelgrauen Zellen Hindernisse darstellen. Beim Schritt k werden dabei jeweils alle Zellen mit dem Wert k von der Startzelle mit der Distanz k belegt. Abbildung 3.3: Kosten berechnen Der Algorithmus arbeitet dabei mit einer Queue-Datenstruktur, die nach dem First-In-FirstOut Prinzip organisiert ist. Zellen werden also in der Reihenfolge aus der Queue entnommen, in der sie darin abgelegt worden sind. In Schritt 0 wird die Startzelle mit der ManhattenDistanz 0 belegt und in der Queue abgelegt. Danach wird diese Zelle gleich wieder aus der KAPITEL 3. BESTEHENDE ANSÄTZE DER LINIENFÜHRUNG 35 Queue entnommen und alle Zellen in ihrer von Neumann-Nachbarschaft5 werden mit einem um eins erhöten Distanzwert belegt und in der Queue abgelegt. Aus der Queue wird dann wiederum die nächste Zelle entnommen und die benachbarten Zellen, sofern sie noch keinen Distanzwert besitzen, werden analog verarbeitet. Trifft der Algorithmus während dieses Vorgehens auf die Endzelle oder befinden sich keine Zellen mehr in der Queue, so hat der Algorithmus seine Arbeit beendet. Im ersten Fall hat er dabei einen Pfad gefunden, im zweiten Fall existiert kein Pfad zwischen der Start- und der Endzelle. Dadurch findet der Algorithmus von Lee in jedem Fall, in dem ein Pfad existiert, diesen Pfad. Die zweite Phase besteht nun darin, den in der ersten Phase gefundenen Pfad aus der Gitterstruktur herauszulesen. Der Algorithmus beginn dabei bei der Endzelle und springt jeweils in die benachbarte Zelle, die einen um eins geringeren Distanzwert als die aktuelle Zelle aufweist. Abbildung 3.4 veranschaulicht dieses Vorgehen anhand des Beispieles aus Abbildung 3.3 auf Seite 34. Abbildung 3.4: Pfad zurückverfolgen Dabei ist zu beachten, dass die Auswahl der nächsten Zelle beim Zurückverfolgen des Pfades nicht eindeutig ist, d.h. es können mehrere gleichwertige Zellen existieren. So kommen in Abbildung 3.4 von der Endzelle aus sowohl der linke als auch der obere Nachbar für den Pfad in Frage. Auch für die nachfolgenden Zellen im Pfad können jeweils mehrere benachbarte Zellen bezüglich ihres Distanzwertes gleichwertig sein. Laufzeit- und Speicherplatzkomplexität Eine hohe Laufzeit- und Speicherplatzkomplexität ist der Preis, der für die Garantie, den kürzest möglichen Pfad zu finden, zu bezahlen ist. Besteht die Gitterstruktur aus b × h Zellen, so hat der Algorithmus zur Berechnung der Distanzwerte eine Laufzeit- und Speicherplatzkomplexität der Ordnung O(bh). Das folgende Beispiel veranschaulicht diese Dimensionen: Ist eine Gitterstruktur 2000 Zellen hoch und 2000 Zellen breit, so besteht sie gesamthaft aus 4’000’000 Zellen. Wird das Gitter z.B. durch ein aus 32-bit Zahlen bestehendes zweidimensionales Array repräsentiert, so belegte die gesamte Gitterstruktur bereits 16 Megabyte Speicher. Das Problem der hohen Laufzeitkomplexität lässt sich auch anhand eines kleinen Beispiels nachvollziehen. Das Gitter in Abbildung 3.5 besteht gesamthaft aus 225 Zellen, wovon 56 5 Die von Neumann-Nachbarschaft umfasst die vier Nachbarn, die sich links, rechts, oberhalb und unterhalb einer Zelle befinden. KAPITEL 3. BESTEHENDE ANSÄTZE DER LINIENFÜHRUNG 36 durch Hindernisse belegt sind. Im Gitter sind somit 169 Zellen vorhanden, durch die ein Pfad hindurchführen kann. Um einen Pfad zwischen den beiden mit S und E bezeichneten Zellen zu finden, muss der Algorithmus in 14 Schritten für 144 Zellen einen Distanzwert berechnen. Somit werden in diesem Fall mehr als 85% aller freien Zellen durch den Algorithmus bearbeitet, obwohl der Start- und Endpunkt relativ nahe beieinander liegen. Die hohe Anzahl an Zellen kommt dabei durch die Breitensuche zu Stande, bei der nicht gezielt in eine Richtung nach einem Pfad gesucht wird, sondern blind in alle Richtungen. Nur durch diese Breitensuche ist der Algorithmus von Lee aber in der Lage, garantiert den kürzsten Pfad zu finden, falls mindestens ein Pfad existiert. Abbildung 3.5: Berechnete Distanzwerte Um die Laufzeit und den Speicherplatzbedarf von Lee’s Algorithmus zu reduzieren wurden eine ganze Reihe von Techniken vorgeschlagen. So kombiniert z.B. der Algorithmus von Soukup [Sou78] die Breitensuche mit einer Tiefensuche. Dabei wird immer in Richtung des Ziels gesucht, ohne dabei die Richtung zu ändern (Tiefensuche). Trifft der Algorithmus dabei auf ein Hinderniss, so wird analog zum Algorithmus von Lee mit einer Breitensuche um das Hindernis herumgesucht. Dieses Vorgehen kann jedoch zu einer suboptimalen Lösung führen, d.h. der Algorithmus liefert nicht in jedem Fall den kürzesten Pfad. Das grundsätzliche Problem der hohen Anzahl von Zellen, aus denen sich die Gitterstruktur zusammensetzt, vermag jedoch keine der vorgeschlagenen Techniken zu lösen. Da die mit dem Algorithmus von Lee berechneten Distanzwerte der Zellen die Kosten angeben, mit denen die Startzelle erreicht werden kann, lässt sich die Linienführung durch das Einführen von zusätzlichen Kosten beeinflussen. So können z.B. die Zellen in Regionen, durch die der Pfad nicht hindurchführen sollte, zusätzlich künstlich verteuert werden. Damit können KAPITEL 3. BESTEHENDE ANSÄTZE DER LINIENFÜHRUNG 37 z.B. Überschneidungen von Linien verhindert werden. 3.2.2 Line Probing Einen etwas anderen Ansatz der Linienführung im Bereich des Schaltungsentwurfs stellt das Line Probing [Mik68] dar. Die grundlegende Idee besteht dabei darin, jeweils durch den Startund den Endpunkt sowohl eine vertikale als auch eine horizontale Linien6 zu führen, wobei diese Linien auf den Linien einer uniformen Gitterstruktur verlaufen. Schneidet sich eine der Linien, die durch den Startpunkt führen, mit einer der Linien durch den Endpunkt, so wurde ein Pfad gefunden. Abbildung 3.6 illustriert das Vorgehen beim Line Probing: Abbildung 3.6: Vorgehen beim Line Probing Existiert kein Schnittpunkt zwischen den Linien, so werden an den Fluchtpunkten neue Linien erzeugt. Als Fluchtpunkte dienen dabei alle Schnittpunkte des Gitters mit den bereits bestehenden Linien. Die Fluchtpunkte sind in Abbildung 3.7 durch Kreise dargestellt. Die vier ursprünglichen Linien, aus denen die Fluchtpunkte hervorgegangen sind, sind in der Abbildung stärker hervorgehoben. Abbildung 3.7: Fluchtpunkte beim Line Probing 6 Streng geometrisch handelt es sich dabei um eine Strecke, da sie einen Start- und Endpunkt besitzt. KAPITEL 3. BESTEHENDE ANSÄTZE DER LINIENFÜHRUNG 38 Die horizontalen und vertikalen Linien werden dabei sowohl für den Start- als auch den Endpunkt in getrennten Listen abgelegt. Wird nun z.B. an einem vom Startpunkt ausgehenden Fluchtpunkt eine horizontale Linie erzeugt, so wird sie mit allen Linien in der Liste, in der die vom Endpunkt ausgehend erzeugten vertikalen Linien enthalten sind, auf einen Schnittpunkt überprüft. Wird auf diese Weise ein Schnittpunkt entdeckt, so wurde ein Pfad gefunden. Dieser Pfad entspricht jedoch nicht immer der optimalen (d.h. kürzesten) Lösung. Wie der Algorithmus von Lee hat auch das Line Probing eine hohe Laufzeit (der Ordnung O(l), wobei l die Anzahl der Linien angibt), da je nach Grösse und Auflösung des zu Grunde liegenden Gitters eine sehr grosse Anzahl von Linien nötig wird. 3.2.3 Weitere Ansätze Neben den beiden beschriebenen Techniken zur Linienführung beim Schaltungsentwurf existiert noch eine ganze Reihe weiterer Ansätze. So operiert z.B. eine Gruppe von Algorithmen auf einem Graphen, der ein Abbild der Gitterstruktur darstellt. Die Zellen bilden dabei die Knoten und von Neumann-Nachbarn werden durch eine Kante miteinander verbunden. Innerhalb dieses Graphen wird dann z.B. mit dem Algorithmus von Dijkstra [Dij59] der kürzeste Pfad gesucht. Abbildung 3.8 zeigt ein Beispiel eines solchen Gitter-Graphen. Abbildung 3.8: Beispiel eines Gitter-Graphen Die Hindernisse aus Abbildung 3.8a werden dabei im Gitter-Graphen von Abbildung 3.8b als schwarze Punkte dargestellt, die freien Zellen als nicht ausgefüllte Kreise. Die grau markierten Knoten in Abbildung 3.8b markieren einen möglichen Pfad um die beiden Zellen S und E aus Abbildung 3.8a zu verbinden. 3.2.4 Anwendbarkeit auf Adora-Modelle Da im Bereich des Schaltungsentwurfs die Linienführung erst nach der Positionierung der Schaltungeselemente durchgeführt wird und damit keinen Einfluss auf das Layout (d.h. die Position der Schaltungselemente) nehmen kann, weist das Problem grosse Änlichkeiten mit dem Problem der Linienführung in einem Adora-Modell auf. Ebenso haben in beiden Fällen die Knoten, die als Hindernisse auftreten können, eine gewisse Ausdehnung, die nicht, wie im Falle der Graphenlayouter, einfach vernachlässigt werden kann. KAPITEL 3. BESTEHENDE ANSÄTZE DER LINIENFÜHRUNG 39 Die beiden Probleme unterscheiden sich jedoch in grundlegenden an sie gestellten Anforderungen. Die Linienführung in einer Schaltung hat nur technischen Kriterien, wie z.B. der Vermeidung von Überschneidungen oder der maximal zulässigen Länge der Linien bzw. Leitungen, zu genügen. Bei einam Adora-Modell stehen dem gegenüber ästhetische Kriterien im Vordergrund. Im Gegensatz zu Adora-Modellen, bei denen es häufig zu Veränderungen am Layout kommt, die eine neue Linienführung erfordern, ist die Linienführung beim Entwurf einer Schaltung normalerweise ein einmaliger Vorgang, der nach dem Platzieren der Elemente und der Bestimmung der benötigten Verbindungen durchgeführt wird. Aus diesem Grund stellen die hohen Laufzeiten der Algorithmus in der Regel auch kein allzu grosses Problem dar. Die Arbeit an einem Adora-Modell ist jedoch in erster Linie eine interaktive Tätigkeit, wodurch Algorithmen mit einer derart hohen Laufzeit nicht in Frage kommen. Dies ist auch der Grund, warum Berner [Ber02] den Einsatz solcher “echter” Routing-Algorithmen für Adora-Modelle als nicht machbar erachtet. Der in Abschnitt 4.3 vorgestellte Ansatz ermöglicht jedoch die Anwendung einer Variation des Algorithmus von Lee auf Adora-Modelle ohne die beschriebenen Laufzeitprobleme. Abbildung 3.9: Uniforme Gitterstruktur bei einem Adora-Modell Die hohe Laufzeit kommt durch die uniforme Gitterstruktur (d.h. die gesamte Platine oder Schaltung wird in gleichgrosse quadratische Zellen unterteilt) zu Stande, auf der die meisten Algorithmen zur Linienführung im Bereich des Schaltungsentwurfs arbeiten. Die Zellengrössen werden dabei so gewählt, dass eine Leitung horizontal oder vertikal durch die Zelle hindurchgeführt werden kann. Durch diese kleine Ausdehnung einer Zelle setzt sich das Gitter aus sehr vielen Zellen zusammen. Beim Platinenlayout und v.a. beim Entwurf im VLSI Bereich wird versucht die gesamte Ausdehnung der Schaltung möglichst gering zu halten, wodurch sich die Grösse des Gitters wieder reduziert. Im Gegensatz dazu können zwischen den Knoten in einem Adora-Modell grosse Zwischenräume bestehen. Die Zellengrösse des Gitters muss sich aber an der geringsten Distanz zwischen zwei Knoten orientieren. So darf die Zellengrösse des Gitters in Abbildung 3.9 nicht grösser sein als die Distanz zwischen den Knoten A und C, da sonst keine Linien zwischen den beiden Knoten hindurchgeführt werden können. Die KAPITEL 3. BESTEHENDE ANSÄTZE DER LINIENFÜHRUNG 40 Zellengrösse in einem Adora-Modell muss sich daher im Bereich weniger Pixel bewegen. Da die Knoten im Modell oftmals eine grosse Ausdehnung aufweisen und damit das gesamte Modell eine grosse Fläche belegt, wird die Anzahl der Zellen extrem gross. Ein Adora-Modell verschärft damit das Problem der hohen Anzahl von Zellen in der Gitterstruktur in der Regel noch. 3.2.5 Routing in Kommunikationsnetzwerken Der Begriff Routing tritt in der Informatik am häufigsten im Zusammenhang mit Kommunikationsnetzwerken auf. Ein Routing-Algorithmus ist dabei dafür verantwortlich, Pakete über Zwischenstationen von der Quell- zur Zielstation durch das Netzwerk zu führen. Das Routing in diesem Zusammenhang unterscheidet sich damit vom Routing im Bereich des Schaltungsentwurfs und der Adora-Modelle dadurch, dass es sich nicht in erster Linie mit Hindernissen, sondern mit Verbindungen unterschiedlicher Qualität zu beschäftigen hat. Ein grosser Teil der Routing-Algorithmen im Bereich der Netzwerke operiert dabei auf einem Graphen, in dem die an das Netzwerk angeschlossenen Maschinen die Knoten bilden und die Kanten die Verbindungen zwischen diesen Maschinen repräsentieren. Die Kanten haben dabei unterschiedliche Gewichte, mit denen die Qualität der Verbindung beschrieben wird. In diesem Graphen wird dann z.B. mit dem Algorithmus von Dijkstra [Dij59] der kürzeste Pfad gesucht. Die Länge einer Kante ergibt sich dabei durch das ihr zugewiesene Gewicht. Ein Beispiel eines solchen Algorithmus ist der für das Routing im Internet eigesetzte OSPF-Algorithmus (Open Shortest Path First [Moy98]). Das Routing in einem Kommunikationsnetzwerk weist damit Änlichkeiten mit dem in Abschnitt 3.2.3 beschriebenen Ansatz der Linienführung mit Hilfe eines Gitter-Graphen auf. Da es sich jedoch stark vom Problem, das im Zusammenhang mit Adora-Modellen auftritt, unterscheidet, wird das Routing, wie es in Kommunikationsnetzwerken auftritt, hier nur der Vollständigkeit halber aufgeführt und im Rahmen dieser Arbeit nicht weiter behandelt. Kapitel 4 Linienführung in einem dynamischen Layout Die im vorherigen Kapitel vorgestellten Ansätze zur Linienführung operieren auf einem statischen Layout. Die Visualisierung von Adora-Modellen wiest jedoch ein dynamisches Layout auf, da je nach Abstraktionsebene und eingeblendeter Aspekte unterschiedliche Darstellungen aus dem integrierten Gesamtmodell generiert werden. Neben dem Führen von Linien durch ein statisches Layout, muss der Ansatz für die Linienführung also auch Vorgehensweisen zur Anpassung der Linien bei Veränderungen des Layouts, wie sie z.B. bei der Anwendung des Zoom-Algorithmus auftreten, beinhalten. Bei dieser Anpassung der Linien muss zusätzlich die Sekundärnotation der Linie so weit wie möglich erhalten bleiben. Das aktuelle Kapitel geht auf eine Reihe von Ansätzen ein, die für die Linienführung in einem dynamischen Layout in Frage kommen. Dabei werden jedoch nur Strategien behandelt, die keine Änderungen am Layout, d.h. an der Position und Grösse der Knoten, vornehmen. Die verschiedenen Ansätze operieren damit sowohl beim Hinzufügen neuer Linien oder Knoten als auch bei der Anpassung der Linien nach einer Veränderung des Layouts auf einem vorgegebenen und nicht veränderbarem Layout. 4.1 Moderate Änderungen der direkten Linienführung Berner [Ber02] schlägt vor, die Linienführung beim Auftreten von Überschneidungen zwischen einer Linie und einem Knoten möglichst schonend anzupassen, wobei die grobe Richtung der Linie beibehalten wird. Dabei wird die Linie zuerst direkt vom Start- zum Endpunkt geführt und danach werden Schritt für Schritt Überschneidungen mit Knoten aufgelöst. Das Ziel bleibt dabei immer eine direkte Linienführung und die Anpassungen sind nur temporärer Natur. Die Strategie lässt sich damit auch nur bei einer direkten Linienführung anwenden. 4.1.1 Das Linienproblem Als Linienproblem bezeichnet Berner Überschneidungen zwischen Linien und Knoten, die bei der Anwendung des Zoom-Algorithmus durch die Veränderung des Layouts entstehen können. Damit beschränkt sich Berner auf die Probleme, die durch das dynamische Layout 41 KAPITEL 4. LINIENFÜHRUNG IN EINEM DYNAMISCHEN LAYOUT 42 der Adora-Modelle auftreten, und geht nicht auf Überschneidungen ein, die bei der Erstellung des Modells (d.h. beim Hinzufügen von Linien und Knoten) auftreten. Das Linienproblem umfasst dabei nur Überschneidungen zwischen Linien und Knoten und nicht Überschneidungen von Linien untereinander oder Überlappungen von Linienbeschriftungen. Nur ein echter Routing-Algorithmus (z.B. der in Abschnitt 3.2.1 beschriebenen Algorithmus von Lee) ist gemäss Berner in der Lage, das Problem der Überschneidungen von Linien zu lösen. Da diese Algorithmen aus dem Bereich des Platinenlayouts oder dem Design integrierter Schaltungen eine sehr hohe Zeitkomplexität aufweisen, kommen sie gemäss Berner nicht für eine interaktive Nutzung, wie sie bei Adora-Modellen auftritt, in Frage. Zusätzlich werden bei diesen Algorithmen oftmals bestehende Linien komplett neu geführt, um Überschneidungen zu verhindern, was bei einem Adora-Modell die Sekundärnotation und damit die Mental Map des Benutzers zerstören würde. Für Berner kommen echte Routing-Algorithmen deshalb nicht in Frage und das Problem lässt sich nur durch moderate Änderungen der direkten Linienführung1 lösen. Diesen Ansatz bezeichnet Berner denn auch als Poor-Man’s-Routing, um sie vom Einsatz eines echten Routing-Algorithmus abzugrenzen. Abbildung 4.1 veranschaulicht das von Berner beschriebene Linienproblem, das beim Verfeinern des Knotens C auftritt. Abbildung 4.1: Linienproblem Wird die Linie zwischen Knoten B und D jedoch hinzugefügt, solange Knoten C verfeinert ist, so tritt die Überschneidung bereits beim Hinzufügen der Linie auf. Da auch in diesem Fall die Linie angepasst werden muss, wird der Begriff des Linienproblems für die folgende Diskussion um diese Situation erweitert. 4.1.2 Vorgehen Zur Lösung des Linienproblems kommen gemäss Berner zwei verschiedene Möglichkeiten in Frage: Zum einen das Verschieben der Start- und Endpunkte auf dem Rand der beteiligten Knoten und zum anderen das Einfügen von Hilfspunkten in die Linie. Das Verschieben der Start- und Eckpunkte löst jedoch das Problem der Überschneidung in den meisten Fällen nicht und zerstört zusätzlich einen Teil der Sekundärnotation der Linie. So führt im Beispiel von Abbildung 4.1 diese Strategie nicht zum Erfolg, da die Knoten, auf deren Rand der Start1 Berner [Ber02] bezeichnet seinen Ansatz zur Lösung des Linienproblems als “moderate Änderung der Linienführung”. Dieser Begriff wird deshalb auch in dieser Arbeit weiterverwendet. KAPITEL 4. LINIENFÜHRUNG IN EINEM DYNAMISCHEN LAYOUT 43 bzw. Endpunkt liegt, zu klein sind, um die Punkte genügend weit zu verschieben, um die Überschneidung aufzulösen. Aus diesem Grund wird diese Strategie nicht weiter verfolgt. Durch das Einfügen von Hilfspunkten in die Linie wird, wie bereits in Abschnitt 2.1.1 kurz angesprochen, die Linie in mehrere Segmente unterteilt und damit um das Hindernis herumgeführt. Die Linien werden dabei immer mit so wenig Hilfspunkten wie möglich geführt, d.h. Hilfspunkte können wieder verschwinden, wenn sie für eine überschneidungsfreie Linienführung nicht mehr benötigt werden. Berner unterscheidet zwischen einer Einpunktstrategie, bei der ein einzelner Hilfspunkt ausreicht, und einer Mehrpunktstrategie, bei der mehrere Hilfspunkte eingefügt werden müssen. Da sich die beiden Strategien bezüglich des Vorgehens jedoch nicht stark unterscheiden, werden sie im Folgenden zusammen betrachtet. Abbildung 4.2 veranschaulicht anhand eines Beispiels das Vorgehen beim Einfügen von Hilfspunkten: Abbildung 4.2: Lösung des Linienproblems durch das Einfügen von Hilfspunkten Die Umsetzung der Strategie erfordert zwei Schritte: erstens die Bestimmung der Schnittpunkte zwischen der Linie und den Knoten und zweitens die Berechnung der Position der Hilfspunkte, die eingefügt werden müssen: 1. Alle Knoten werden auf Schnittpunkte mit dem nächsten Segment2 (zu Beginn entspricht dies dem ersten und einzigen Segment) überprüft. Jener Schnittpunkt, der die geringste Distanz zum Startpunkt aufweist, markiert dabei die erste Überschneidung (Schritt 1 in Abbildung 4.2). Wird keine Überschneidung entdeckt, so wird das nächste Segment überprüft. Entspricht das aktuelle Segment dem letzten Segment der Linie, so ist die Anpassung der Linienführung beendet. 2. Abhängig von der Position des Schnittpunktes auf dem Rand des Hindernisses und dem Winkel der Überschneidung, wird jener Eckpunkt des Hindernisses ausgewählt, über den die Linie am Hindernis verbeigeführt werden kann. In einem parametrisierbaren Abstand zu diesem Eckpunkt wird dann ein Hilfspunkt in die Linie eingefügt. Dabei ist zusätzlich noch sicherzustellen, dass der Hilfspunkt nicht innerhalb eines Hindernisses zu 2 Ein Segment (oder auch Liniensegment) bezeichnet in diesem Zusammenhang den Teil einer Linie, der durch zwei Hilfspunkte begrenzt wird. Ein Segment entspricht damit einer Strecke, wie sie in der Geometrie definiert ist. Befinden sich keine Hilfspunkte in der Linie so besteht die Linie aus einem einzigen Segment, das vom Start- zum Endpunkt reicht. KAPITEL 4. LINIENFÜHRUNG IN EINEM DYNAMISCHEN LAYOUT 44 liegen kommt (Schritt 2 in Abbildung 4.2). Danach wird das Vorgehen rekursiv auf das Segment vor und nach dem Hilfspunkt angewandt (Schritte 3 und 4 in Abbildung 4.2). 4.1.3 Beurteilung Vor allem bei einfacheren Layouts (wie z.B. dem in Abbildung 4.2 auf Seite 43) liefert der Ansatz der moderaten Änderungen der direkten Linienführung gute Resultate. Dabei kommt vor allem der in Abschnitt 2.1.1 beschriebene Vorteile der direkten Linienführung, dass sich die Linien stark von den Hindernissen abheben, zum Tragen. Bei einem einfachen Layout spielt es für den Benutzer auch keine Rolle (d.h. seine Mental Map wird nicht zerstört), wenn Hilfspunkte je nach aktuellem Layout hinzukommen oder verschwinden, solange die Linie immer ungefähr gleich verläuft. Der Benutzer hat jedoch auch nur einen sehr begrenzten Einfluss auf die Linienführung. Da die Linien grundsätzlich immer direkt vom Start- zum Endpunkt geführt werden und Hilfspunkte je nach Layout hinzugefügt und wieder entfernt werden, kann der Benutzer nur gerade auf die Position von Start- und Endpunkt Einfluss nehmen. Die Sekundärnoation einer Linie besteht deshalb nur aus den Positionen des Startund Endpunktes. Da es sich bei diesem Vorgehen nicht um einen echten Routing-Algorithmus handelt, können bei komplexeren Layouts Probleme auftauchen. Diese entstehen in erster Linie dadurch, dass die grobe Richtung der Linie beibehalten wird und die Linie Schritt für Schritt angepasst wird, wodurch eine globale (d.h. auf die ganze Linie bezogene Optimierung) nicht möglich ist. So ist z.B. bei jeder Überschneidung mit einem Knoten aufgrund lokaler Informationen (z.B. der Position des Schnittpunkts) zu entscheiden, wo der Hilfspunkt platziert wird und somit auf welcher Seite die Linie am Hindernis vorbeigeführt wird. Zusätzlich scheitert der Ansatz der moderaten Anpassungen in Fällen, in denen die Linie in eine Sackgasse verläuft, da in diesem Fall bereits in vorhergehenden Schritten eine radikale Änderung nötig gewesen wäre. Abbildung 4.3 veranschaulicht diese zwei Probleme: Im Beispiel auf der linken Seite wäre eine kürzere Linienführung mit weniger Hilfspunkten möglich. Aufgrund der Position des ersten Schnittpunktes wird mit Hilfe der beschränkten lokalen Informationen (z.B. der Distanz zu den verschiedenen Eckpunkten des Hindernisses) die Position des ersten Hilfspunktes ausgewählt, die sich im Nachhinein (aus globaler Perspektive) als nicht optimal erweist. Das Beispiel auf der rechten Seite verunmöglicht eine moderate Anpassung der Line, da eine Richtungsänderung nötig wäre, um die Linie um die Hindernisse herumzuführen. Abbildung 4.3: Grenzen der moderaten Anpassung der Linienführung KAPITEL 4. LINIENFÜHRUNG IN EINEM DYNAMISCHEN LAYOUT 45 Der Ansatz der moderaten Änderung der direkten Linienführung lässt sich in seinen Grundzügen leicht realisieren. Die grösste Schwierigkeit liegt in der Bestimmung der Positionen der Hilfspunkte. Werden die Hilfspunkte in einem festen oder parametrisierbarem Abstand vom Hindernis eingefügt, so können sie innerhalb eines weiteren Knotens zu liegen kommen. Vor dem Einfügen eines Hilfspunktes muss deshalb die Umgebung des Bereichs, in den der Hilfspunkt eingefügt werden soll, untersucht werden. Dabei ist es normalerweise unvermeidlich, das gesamte Modell nach einem Knoten zu durchsuchen, der an dieser Position liegt. Zusätzlich erhöhen die vielen möglichen Spezialfälle (u.a. die beiden in Abbildung 4.3) die Komplexität der Realisierung sehr stark. Zusammenfassend lässt sich deshalb sagen, dass sich die Strategie für die einfacheren Fälle in kurzer Zeit und ohne grosse Probleme realisieren lässt. Eine Realisierung, die eine universelle Anwendbarkeit garantiert (d.h. für jedes Layout eine brauchbare Lösung liefert), ist jedoch nicht möglich. Neben der fehlenden universellen Anwendbarkeit stellt die Laufzeit des Algorithmus bei einer grossen Anzahl von Hindernissen ein Problem dar, vor allem wenn bei einem Zoom-Schritt (oder einer anderen Layout-Operation, die einen grossen Teil des Layouts verändert) viele Linien angepasst werden müssen. Um Überschneidungen zwischen einer Linie und einem Knoten zu erkennen, muss jeder Knoten, der aufgrund der Hierarchie für eine Überschneidung in Frage kommt, darauf hin überprüft werden. Durch das rekursive Vorgehen, bei dem nach dem Einfügen eines Hilfspunktes beide dadurch entstandene Segmente wiederum auf Überschneidungen untersucht werden müssen, nimmt die Laufzeit mit der Anzahl der Segmente exponentiell zu. Dieses Problem lässt sich anhand von Abbildung 4.2 auf Seite 43 illustrieren. Da die Linie vom Knoten A zum Knoten D führt, kommen als Hindernisse die Knoten B und C in Frage. Aufgrund ihrer hierarchischen Struktur kann es zu keinen Überschneidungen mit Knoten, die sich z.B. innerhalb von B befinden, kommen. Alle Knoten, mit denen es zu einer Überschneidung mit der Linie kommen kann, müssen nun jedesmal darauf hin überprüft werden. In Schritt 1 in Abbildung 4.2 müssen also Knoten B und C überprüft werden. Bei Schritt 2 müssen nun beide in Schritt 1 entstandenen Segmente (vor und nach dem in Schritt 1 eingefügten Hilfspunkt) wiederum mit den beiden Knoten B und C auf Überschneidungen überprüft werden. Im vorliegenden Fall stellt dies kein Problem dar, da nur eine Linie angepasst werden muss und nur zwei Hindernisse existieren. Sind jedoch eine grosse Anzahl von Hindernissen vorhanden und müssen viele Linien angepasst werden, so wird die Laufzeit zu einem Problem. Das Vorgehen leidet damit unter einem Problem, das bei vielen geometrischen Algorithmen auftaucht, dass nämlich nicht bekannt ist, welche Knoten für eine Überschneidung in Frage kommen können und deshalb immer alle überprüft werden müssen. 4.2 Anwendung des Zoom-Algorithmus auf die Hilfspunkte Bei der Vergröberung oder Verfeinerung eines Knotens werden - wie in Abschnitt 1.4 beschrieben - die benachbarten Knoten mit Hilfe eines Zoom-Algorithmus verschoben. Ein weiterer Ansatz für die Anpassung der Linien bei Layoutveränderungen beruht deshalb auf der Idee, die Positionen der Hilfspunkte in den Linien ebenfalls durch den Zoom-Algorithmus (oder allgemeiner durch den Algorithmus, der das Layout verändert) neu zu berechnen. Dieser Ansatz erfüllt damit jedoch nur einen Teil der in Abschnitt 2.4 an einen Linienführungsalgorithmus gestellten Anforderungen: Das Problem der erstmaligen Linienführung beim Hinzufügen einer neuen Linie wird durch diesen Ansatz nicht gelöst und erfordert deshalb einen zusätzlichen KAPITEL 4. LINIENFÜHRUNG IN EINEM DYNAMISCHEN LAYOUT 46 Algorithmus. So wäre es z.B. möglich, den in Abschnitt 4.1 beschriebenen Ansatz zur moderaten Änderung der direkten Linienführung dafür einzusetzen. Damit werden beim Hinzufügen einer Linie Überschneidungen mit Konten verhindert, indem die Linie, wie in Abschnitt 4.1.2 beschrieben, schonend angepasst wird. Kommt es dann zu einer Veränderung des Layouts, so ist die Layout-Operation (in diesem Fall der Zoom-Algorithmus) neben der Neupositionierung der Knoten auch für die Anpassung der Linien verantwortlich. 4.2.1 Vorgehen Hilfspunkte in den Linien werden bei diesem Ansatz gleich wie die Knoten des Modells behandelt. Sie werden also - wie in Abschnitt 1.4 erläutert - mit Hilfe von Verschiebevektoren an ihre neue Position verschoben. Abbildung 4.4 veranschaulicht das Vorgehen bei einer Veränderung des Layouts, die durch die Verfeinerung von Knoten A nötig wird. Für die Berechnung der Verschiebevektoren kommt dabei der Algorithmus von Berner [Ber02] zum Einsatz. Für den Hilfspunkt H in der Linie wird dabei analog zu den Knoten B, C und D ein Verschiebevektor berechnet und der Hilfspunkt durch diesen an die Position H’ verschoben. Dadurch kann eine Überschneidung zwischen der Linie und Knoten C, der nach seiner Verschiebung C’ entspricht, verhindert werden. Abbildung 4.4: Verschieben eines Hilfspunktes durch den Zoom-Algorithmus 4.2.2 Beurteilung Die Umrechnung der Position der Hilfspunkte mit Hilfe des Zoom-Algorithmus scheint auf den ersten Blick die plausibelste Strategie zur Anpassung der Linienführung nach einem ZoomSchritt zu sein, da sich die Linienführung an den Positionen der Knoten orientieren muss. Im Weiteren lässt sich dadurch die Sekundärnotation der Linien analog zur Sekundärnotation des Layouts durch den Zoom-Algorithmus erhalten. Das Problem bei diesem Ansatz ist aber, dass der Algorithmus, der für die Layout-Operation verantwortlich ist, garantieren muss, dass es zu keinen Überschneidungen zwischen Knoten und Linien kommt. KAPITEL 4. LINIENFÜHRUNG IN EINEM DYNAMISCHEN LAYOUT 47 Bei der Verschiebung der Hilfspunkte bei einem Zoom-Schritt durch den Algorithmus von Berner können in gewissen Situationen nach der Verschiebung neue Überschneidungen auftreten. Abbildung 4.5 veranschaulicht eine solche Situation. Wird der Hilfspunkt H bei der Verfeinerung von Knoten A analog zu den Knoten B, C und D verschoben, so genügt diese Verschiebung nicht, um eine Überscheidung zwischen der Linie und dem nun verfeinerten Knoten A’ zu verhindern. Abbildung 4.5: Problem bei der Anwendung des Zoom-Algorithmus auf die Hilfspunkte Da der Algorithmus von Berner Okklusionen zwischen Knoten nicht in jedem Fall verhindern kann, wurde er, wie in Abschnitt 1.4 beschrieben, von Marty [Mar02] erweitert. Abbildung 4.6 illustriert die Verschiebung der Knoten B, C und D sowie des Hilfspunktes H durch den von Marty erweiterten Algorithmus von Berner bei der Verfeinerung des Knotens A. Abbildung 4.6: Anwendung des von Marty erweiterten Algorithmus von Berner Um in diesem Fall die Überschneidungen zwischen der Linie und Knoten A’ aufzulösen ist eine umfassende Anpasung der Linie notwendig, da diese nun zwischen A’ und C’ hindurchgeführt werden muss. Ein solch umfangreiche Anpassung der Linie kommt jedoch bereits einer komplett neuen Linienführung gleich, wodurch das Verschieben der Hilfspunkte durch den Zoom-Algorithmus überhaupt keinen Sinn mehr hat. Noch schwieriger wird die Situation im Falle einer orthogonalen Linienführung, da dabei zwei aufeinanderfolgende Hilfspunkte in einer Linie immer entweder die gleiche horizontale oder vertikale Position haben müssen. Diese Forderung kann z.B. der Zoom-Algorithmus von Berner nicht erfüllen. KAPITEL 4. LINIENFÜHRUNG IN EINEM DYNAMISCHEN LAYOUT 48 Zusätzlich führt dieser Ansatz dazu, dass die Linienführung stark mit den Layout-Operationen gekoppelt wird, da sich die Algorithmen zur Realisierung der Layout-Operationen auch immer noch um die Linienführung kümmern müssen. Sollen zu einem späteren Zeitpunkt weitere Layout-Operationen oder andere Zoom-Algorithmen realisiert werden, so muss dabei immer auch eine überschneidungsfreie Linienführung sichergestellt werden. 4.2.3 Kopplung der Hilfspunkte an die Knoten Eine Abwandlung des Ansatzes, die Hilfspunkte in den Linien durch die Layout-Operation selbst zu verschieben, könnte darin bestehen, die Hilfspunkte an die Knoten zu koppeln und dann mit diesen zu verschieben.. So wäre es in Abbildung 4.6 auf Seite 47 z.B. möglich den Hilfspunkt H an Knoten C zu koppeln und ihn dann bei der Verfeinerung von A zusammen mit Knoten C (d.h. mit gleichbleibendem Abstand zwischen C und H) zu verschieben. Der Hilfspunkt H würde damit nach seiner Verschiebung ungefähr H’ entsprechen. Bei diesem Vorgehen tauchen jedoch, wie Abbildung 4.6 bereits klar macht, die gleichen Probleme wie bei der Anwendung des Zoom-Algorithmus (oder einer anderen Layout-Operation) auf die Hilfspunkte auf. 4.3 Echter Routing-Algorithmus: Kachelbasierte Linienführung Die beiden bisher vorgestellten Strategien zur Linienführung lassen zwei wesentliche Probleme in den Vordergrund treten: Erstens ist ein globaler Ansatz nötig um eine Linie auch in komplexeren Layouts möglichst optimal führen zu können. Dies ist nur mit Hilfe eines echten Routing-Algorithmus möglich und kann z.B. nicht durch eine schonende Anpassung einer direkten Linie an die Hindernisse erreicht werden. Zweitens gestaltet sich die Linienführung und auch die Anpassung einer bestehenden Linie nach einer Veränderung des Layouts schwierig, solange der dafür zur Verfügung stehende freie Raum nicht bekannt ist. So muss z.B. vor dem Einfügen eines Hilfspunktes jeder Knoten darauf überprüft werden, ob der Hilfspunkt in ihm zu liegen kommt und damit verschoben werden muss. Der im Folgenden vorgestellte Ansatz beruht auf einer Datenstruktur, die den freien Raum (d.h. den Raum zwischen den Knoten) explizit repräsentiert, und wendet zur Linienführung einen echten Routing-Algorithmus auf diese Struktur an. 4.3.1 Explizite Repräsentation des freien Raumes Um Überschneidungen zwischen Linien und Knoten zu verhindern, müssen die Linien durch den freien Raum, der sich zwischen den Knoten befindet, geführt werden. Bei der Visualisierung von Adora-Modellen ist jedoch immer nur der von den Knoten belegte Raum explizit durch die Position und Grösse der Knoten repräsentiert. Der freie Raum zwischen den Knoten muss für Operationen, die darauf angewiesen sind, jedesmal aufwendig rekonstruiert werden, indem die Liste der Knoten (zum Teil sogar mehrmals) durchlaufen wird. Ebenso müssen Nachbarschaftsbeziehungen zwischen den Knoten der Visualisierung jedesmal aufwendig berechnet werden. Da diese beiden Probleme auch im Bereich des Entwurfs von integrierten Schaltungen auftauchen, wurde in diesem Umfeld die sogenannte Corner Stitching Datenstruktur [Ous84] KAPITEL 4. LINIENFÜHRUNG IN EINEM DYNAMISCHEN LAYOUT 49 entwickelt, die sowohl den belegten als auch freien Raum explizit repräsentiert und die verschiedenen Nachbarschaftsbeziehungen enthält. Abbildung 4.7 veranschaulicht, wie vier Knoten in einer Corner Stitching Datenstruktur repräsentiert werden. Die Struktur setzt sich dabei aus zwei Arten von Kacheln zusammen: Belegte Kacheln repräsentieren die Knoten und der Raum dazwischen wird durch freie Kacheln repräsentiert. Abbildung 4.7: Corner Stitching Datenstruktur Die freien Kacheln werden dabei als maximale horizontale Streifen organisiert, was bedeutet, dass sich links oder rechts einer freien Kachel niemals eine weitere freie, sondern immer nur eine belegte oder keine Kachel befinden kann. Direkt oberhalb oder unterhalb davon können sich jedoch ohne weiteres weitere freie Kacheln befinden. Dadurch ergibt sich für jede Anordnung von belegten Kacheln (Knoten) eine einzige Möglichkeit der Zerlegung des freien Raumes in freie Kacheln. Die Organisation der maximalen horizontalen Streifen ist dabei grundlegend für die Effizienz der Struktur und der darauf operierenden Algorithmen. Die belegten Kacheln unterscheiden sich dabei von den freien nur in der Tatsache, dass sie belegt sind, ansonsten werden die beiden Kachelarten genau gleich repräsentiert und behandelt. Die Kacheln werden durch eine Reihe von Zeigern, den sogenannten Corner Stitches, miteinander verbunden. Dabei besitzt jede Kachel an jeder ihrer vier Ecken je zwei Zeiger zu ihren Nachbarn, insgesamt also acht Zeiger, wie Abbildung 4.8 illustriert. Die Zeiger werden dabei anhand ihrer Position mit den in der Abbildung gezeigten Namen benannt. Abbildung 4.8: Repräsentation der Nachbarschaftsbeziehungen zwischen den Kacheln KAPITEL 4. LINIENFÜHRUNG IN EINEM DYNAMISCHEN LAYOUT 50 Die Operationen auf der Corner Stitching Struktur zeichnen sich dadurch aus, dass sie alle immer nur auf Informationen aus ihrer lokalen Umgebung angewiesen sind, wodurch sich die Grösse des gesamten Modells nicht negativ auf Laufzeit der Algorithmen auswirkt. Die Algorithmen haben dadurch in den meisten Fällen auch eine zur Anzahl der involvierten Kacheln lineare Laufzeit. Für die Linienführung von grösster Bedeutung sind dabei die folgenden Algorithmen, auf deren Realisierung in Kapitel 5 eingegangen wird: • Finden der Kachel an einer bestimmten Position Eine häufig benötigte Operation ist das Auffinden einer Kachel an einer bestimmten Position (angegeben durch deren Koordinaten). Dies ist sowohl für belegte Kacheln (d.h. das Auffinden eines Knoten an einer bestimmten Position) als auch für freie Kacheln möglich. Ein Beispiel einer solchen Operation könnte das Bestimmen des Knotens sein, auf den der Mauszeiger momentan zeigt. • Einfügen eines Knoten Um die Corner Stitching Datenstruktur zu erstellen, werden die betroffenen Knoten (und damit belegte Kacheln) nacheinander in die Struktur eingefügt. Da der Algorithmus beim Einfügen nur auf lokale Informationen aus der direkten Umgebung angewiesen ist, kann die Datenstruktur sehr schnell aufgebaut werden. • Direkte Nachbarn finden Mit Hilfe der Corner Stitches können alle Nachbarn einer Kachel auf einer oder allen Seiten sehr schnell bestimmt werden. Dies ist erforderlich um sich bei der Linienführung von Kachel zu Kachel durch das Modell zu bewegen. Die Corner Stitching Datenstruktur ermöglicht auch die leichte Realisierung einer Reihe weiterer Algorithmen. Darunter z.B. einer Bereichssuche (d.h. das Auffinden aller Knoten innerhalb eines bestimmten Bereichs) oder der sogenannte Schneepflug, der beim Verschieben eines Knotens auch alle Knoten, die dieser Verschiebung im Wege stehen, entsprechend verschiebt. Mit dem Schneepflug ist es z.B. möglich den Platz, der dem Modell oder der Schaltung zur Verfügung steht, zu verkleinern und dabei die Beziehungen der Kachlen untereinander zu erhalten. Da diese Algorithmen für die Linienführung jedoch nicht von Bedeutung sind, werden sie nicht vertieft behandelt. Der Grund für die Entwicklung der Corner Stitching Datenstruktur bestand darin, eine Technik zu entwickeln, die eine effiziente Speicherung aller Schaltungselemente ermöglicht. Da sich integrierte Schaltungen aus mehreren Millionen Elementen zusammensetzen können [Ous85], ist es für Werkzeuge in diesem Bereich unmöglich immer alle Elemente im Speicher zu halten. Mit Hilfe der Corner Stitches ist es kein Problem, alle Elemente z.B. in einer Datenbank zu bestimmen, die im Moment auf dem Bildschirm angezeigt werden sollen, ohne dabei jedesmal alle Elemente zu durchlaufen. Bei der Anwendung der Corner Stitching Struktur auf Adora-Modelle stellt jedoch nicht eine grosse Anzahl von Elementen, sondern fehlende Nachbarschaftsbeziehungen und fehlendes Wissen über den freien Raum im Modell das Hauptproblem dar. KAPITEL 4. LINIENFÜHRUNG IN EINEM DYNAMISCHEN LAYOUT 4.3.2 51 Entkopplung der eigentlichen Linienführung vom Finden eines geeigneten Pfades Da durch die Corner Stitching Datenstruktur der freie Raum zwischen den Knoten explizit durch Rechtecke repräsentiert wird, lässt sich das Problem der Linienführung in zwei getrennte Aufgaben aufteilen. Der erste Schritt besteht darin, einen aus freien Kacheln bestehenden Pfad zu finen, der den Start- und Endpunkt der Linie verbindet und damit den Bereich, in dem die Linie verlaufen kann, vorgibt. Dieser Vorgang wird im Bereich der integrierten Schaltungen als Channel Finding bezeichnet. In Abbildung 4.9 sind die freien Kacheln, aus denen sich der Pfad zur Verbindung3 der Punkte A und B zusammensetzt, grau hinterlegt dargestellt. Da dieser Algorithmus auf den Kacheln der Corner Stitching Struktur operiert, wird der Ansatz im Folgenden als kachelbasierte Linienführung bezeichnet. Abbildung 4.9: Pfad aus freien Kacheln Wie genau (z.B. möglichst direkt oder orthogonal) die Linie innerhalb dieses Bereiches geführt wird, bleibt einem zweiten Algorithmus überlassen. Dadurch kann die Komplexität der Realisierung dieses zweiten Algorithmus bedeutend reduziert werden und er kann leicht ausgetauscht werden. Finden eines geeigneten Pfades Für das Finden eines geeigneten Pfades bestehend aus freien Kacheln kommt dabei ein Algorithmus, der in den Grundzügen dem Ansatz von Dion und Mornier [Dio95] folgt, zum Einsatz. Die grundlegende Idee besteht wie beim Algorithmus von Lee (vgl. dazu Abschnitt 3.2.1) darin, vom Startpunkt aus jeweils alle benachbarten Zellen bzw. Kacheln wellenförmig mit einem Kostenwert zu belegen und dann in einem zweiten Schritt anhand dieser Kostenwerte den kürzesten Pfad zu bestimmen. Im Gegensatz zum Algorithmus von Lee, der auf einem Gitter mit uniformen (d.h. gleich grossen quadratischen) Zellen operiert, haben die freien Kacheln der Corner Stitching Struktur unterschiedliche Grössen und damit auch nicht immer die gleiche Anzahl an Nachbarn. 3 Im Folgenden wird davon ausgegangen, dass die Positionen von Start- und Endpunkt der Linien als Teil der Sekundärnotation durch den Benutzer fest vorgegeben sind. KAPITEL 4. LINIENFÜHRUNG IN EINEM DYNAMISCHEN LAYOUT 52 Abbildung 4.10 illustriert den Unterschied zwischen einer uniformen Gitterstruktur, wie sie beim Algorithmus von Lee zum Einsatz kommt, und der auf Kacheln basierenden Corner Stitching Struktur. Dadurch dass bei einer uniformen Gitterstruktur alle Zellen die gleiche Grösse haben, besteht die von Neumann-Nachbarschaft (ausser am Rand der Struktur) immer aus vier Zellen. Bei der Kachel-basierten Struktur fällt die Nachbarschaft einer Kachel je nach ihrer Grösse und der Grösse der Nachbarn unterschiedlich aus. Die unterschiedlichen Nachbarschaftsbeziehungen werden in Abbildung 4.10 durch Pfeile dargestellt. Dabei handelt es sich im Falle der Corner Stitching Struktur (Abbildung 4.10b) nicht um die Corner Stitches, die die Kacheln zusammenhalten, sondern bloss um eine Darstelltung aller Nachbarn der Kachel. Abbildung 4.10: Uniforme Zellen / Kacheln der Corner Stitching Struktur Dadurch lässt sich eine der grundlegenden Ideen des Algorithmus von Lee, die vier Nachbarn einer Zelle ausgehend von der Zelle, die den Startpunkt enthält, jeweils mit dem Wert der Manhattan-Distanz4 zur Startzelle zu belegen, nicht direkt anwenden, da durch die unterschiedliche Anzahl von Nachbarn bei der Corner Stitching Struktur mehrere Werte für eine einzelne Kachel möglich sind. Dieses Problem lässt sich ebenfalls durch Abbildung 4.10b veranschaulichen: Je nachdem, ob der Wert für Kachel E aus den Werten von Kacheln C, D oder F berechnet wird, kommt ein anderer Wert zustande. Bei einer uniformen Gitterstruktur kann dieses Problem, wie sich leicht nachvollziehen lässt, nicht auftreten. Da sich bei der Corner Stitching Struktur nicht für jede Kachel ein eindeutiger Wert berechnen lässt, ist ein anderer Ansatz nötig. Dion und Mornier [Dio95] schlagen deshalb vor, die für die Linienführung benötigten Distanzwerte5 zwischen den Kacheln nicht in der Struktur selbst, sondern für jeden möglichen Pfad separat abzulegen. Als erstes stellt sich dabei jedoch die Frage, wie diese Distanzwerte berechnet werden können. Wie beim Algorithmus von Lee werden jeweils die Distanzwerte ausgehend von einer Kachel für alle deren Nachbarn berechnet. In Abbildung 4.11 soll vom Startpunkt S aus ein Pfad berechnet werden, wobei die Position des Endpunktes in diesem Zusammenhang noch keine Rolle spielt und dieser deshalb in der Abbildung auch nicht erscheint. Die Startkachel ist in 4 Der Begriff der Manhattan-Distanz ist vom Bild rechteckig angelegter Strassenzügen in amerikanischen Grossstädten abgeleitet. Die Manhattan-Distanz misst dabei nicht die Distanz, die durch die Luftlinie zwischen zwei Punkten angegeben wird (Euklidische Distanz), sondern die Distanz, die durch das Entlanggehen an den Strassenzügen zurückgelegt wird. Dafür werden auch die Begriffe der City-Block-Distanz oder TaxifahrerDistanz verwendet. Im zweidimensionalen Raum definiert sich die Manhattan-Distanz zwischen zwei Punkten P und Q folgendermassen: M (P, Q) = |xP − xQ | + |yP − yQ | 5 Unter Distanz oder Distanzwert ist im Folgenden immer die Manhattan-Distanz bzw. deren Wert zu verstehen. KAPITEL 4. LINIENFÜHRUNG IN EINEM DYNAMISCHEN LAYOUT 53 diesem Fall Kachel A, da die Linie nur in dieser freien Kachel beginnen kann. Vom Startpunkt aus werden jetzt die Distanzwerte zu den Nachbarn B, C und D und damit die Kosten für eine Linie vom Startpunkt S durch Kachel A zu diesen Nachbarnkacheln berechnet. Da die Kacheln der Corner Stitching Struktur unterschiedliche Grössen haben, kann der Distanzwert nicht, wie beim Algorithmus von Lee für die ganze Zelle, sondern nur für einen bestimmten Punkt innerhalb der Kachel gelten. Der Punkt, an dem der Distanzwert für eine Kachel berechnet wird, wird im Folgenden als Kostenpunkt bezeichnet. Die Kostenpunkte für die Kacheln D, B und C sind in Abbildung 4.11 mit K1, K2 und K3 bezeichnet. Die Position der Kostenpunkte leitet sich dabei aus der Position des Startpunktes S ab. Die von S ausgehenden Pfeile6 in Abbildung 4.11 zeigen die kürzesten Wege, über die die Nachbarkacheln B, C und D von S aus erreicht werden können. Die Kostenpunkte K1, K2 und K3 entsprechen dabei den Punkten, bei denen diese Pfeile auf die Kacheln treffen. Der Kostenpunkt einer benachbarten Kachel entspricht damit dem Punkt innerhalb dieser Kachel, der gegenüber dem Kostenpunkt der aktuellen Kachel (S für Kachel A) die geringste euklidische Distanz aufweist. Für diese Kostenpunkte in den benachbarten Kacheln wird nun die Manhattan-Distanz zwischen dem Kostenpunkt dieser Nachbarnkacheln und dem Kostenpunkt der aktuellen Kachel berechnet. In Abbildung 4.11 werden also drei Distanzwerte berechnet: Die ManhattanDistanz zwischen S und K1, S und K2 sowie S und K3. Abbildung 4.11: Berechnung der Distanzwerte Diese Distanzwerte werden in einem Pfad abgelegt. Dabei handelt es sich um eine Datenstruktur die folgende Elemente enthält: • Einen Zeiger auf die Endkachel, mit der der Pfad endet. • Einen Zeiger auf den Elternpfad. Im Pfad selbst sind immer nur die Informationen für den letzten Teil des Pfades enthalten, d.h. den Pfad von der letzten Kachel bzw. deren Kostenpunkt zur aktuellen Kachel (der Endkachel). Wird jeweils den Zeigern auf den Elternpfad gefolgt, so lässt sich der gesamte Pfad bis zum Startpunkt rekonstruieren. • Die Position des Kostenpunktes innerhalb der Endkachel, an der der Distanzwert berechnet wurde. 6 Diese Pfeile haben nichts mit der späteren Linienführung zu tun, sondern sollen nur veranschaulichen, wie die Kostenpunkte berechnet werden. KAPITEL 4. LINIENFÜHRUNG IN EINEM DYNAMISCHEN LAYOUT 54 • Die Manhattan-Distanz vom Kostenpunkt über die Kostenpunkte aller Elternpfade zum Startpunkt. Der Distanzwert berechnet sich damit durch die Summe des Distanzwertes des Elternpfades und der Manhattan-Distanz zwischen dem Kostenpunkt des Elternpfades und dem aktuellen Kostenpunkt. Abbildung 4.12: Beziehung zwischen Pfaden und ihren Elternpfaden Anhand von Abbildung 4.12 soll die Beziehung zwischen Pfaden und ihren Elternpfaden verdeutlicht werden. Dabei soll eine Linie vom Startpunkt S zum Endpunkt E geführt werden. Der erste Pfad enthält dabei Kachel A als Endkachel, den Startpunkt S als Kostenpunkt und damit einen Distanzwert von 0, da der Kostenpunkt der ersten Kachel dem Startpunkt der Linie entspricht. Von Kachel A aus sind nun drei weitere Pfade möglich, nämlich zu den Kacheln B, C und D. Diese neuen Pfade erhalten den ersten Pfad als Elternpfad, die Punkte K1, K2 oder K3 als Kostenpunkt und die jeweiligen Distanzen zwischen K1, K2 oder K3 und S (dem Kostenpunkt des Elternpfades) als Distanzwerte. Mit den Endkacheln B, C und D wird danach analog zu Kachel A verfahren. Ein Pfad wird nicht weiter verfolgt, wenn er auf eine Kachel trifft, die er bereits enthält. Die verschiedenen Pfade bilden dadurch eine Baumstruktur, wodurch sich trotz der grossen Anzahl an Pfaden der benötigte Speicherplatz in Grenzen hält. Diese Baumstruktur für Abbildung 4.12 ist in Abbildung 4.13 abgebildet. Abbildung 4.13: Pfadstruktur KAPITEL 4. LINIENFÜHRUNG IN EINEM DYNAMISCHEN LAYOUT 55 Alle Pfade werden entsprechend ihres Distanzwertes sortiert in einer Heap-Datenstruktur [Wil64] gehalten, wodurch die Abfrage des nächsten Pfades aus dem Heap jeweils den Pfad mit dem geringsten Distanzwert liefert. Nachdem alle Pfade zu den Nachbarn einer Kachel berechnet und in den Heap eingefügt wurden, wird der Pfad mit dem niedrigsten Distanzwert aus dem Heap entnommen und dessen Nachbarn verarbeitet. Wird ein Pfad, dessen Endkachel der Endkachel der Linie (d.h. der freien Kachel die den Endpunkt enthält) entspricht, aus dem Heap entnommen, so wird der Vorgang abgebrochen, da damit ein Pfad vom Startzum Endpunkt gefunden wurde. Da der Pfad den gesamten Weg vom Start- zum Endpunkt enthält, entfällt auch das Zurückverfolgen, wie es beim Algorithmus von Lee nötig ist. Da für alle Nachbarn einer Kachel jeweils ein neuer Pfad erzeugt wird, explodiert die Anzahl der Pfade kombinatorisch mit der Anzahl Kacheln. Diese explosionsartige Zunahme der Pfade stellt jedoch aus folgenden Gründen kein Problem dar: Erstens hält sich die Anzahl der Kacheln im gesamten Modell dank der Corner Stitching Struktur in Grenzen7 . Zweitens werden Pfade nicht weiterverfolgt, wenn sie auf eine Kachel treffen, die sie bereits enthalten. Und Drittens werden durch die Sortierung der Pfade im Heap entartete Pfade (d.h. Pfade mit einem sehr hohen Distanzwert) nicht mehr aus dem Heap entnommen und damit auch nicht weiterverfolgt. Die Anzahl der Pfade liesse sich noch weiter reduzieren, indem neben der Distanz zum Startpunkt auch die Distanz zum Endpunkt der Linie in den Distanzwert des Pfades einfliesst. Damit wird der Distanzwert geringer, je näher zum Ziel der Pfad kommt. Da der Pfad mit dem geringsten Distanzwert zuerst aus dem Heap entnommen wird, werden als erstes die Pfade weiterverfolgt, die bereits in der Nähe des Ziels angekommen sind. Das Finden eines geeigneten Pfades geht dabei von einer Breiten- zu einer Tiefensuche über. Bei diesem Vorgehen ist es jedoch nicht mehr möglich, alle bezüglich der Distanz optimalen Pfade zu finden, wie dies im nächsten Abschnitt beschrieben wird. Da die Distanzwerte durch die Manhattan-Distanz zwischen den verschiedenen Kostenpunkten berechnet werden, ist es möglich, dass mehrere Pfade die gleiche (kürzeste) Länge aufweisen und damit für die Linienführung in Frage kommen. Abbildung 4.14 zeigt ein solches Beispiel in dem zwei Pfade beim Endpunkt E die gleiche Distanz zum Startpunkt S aufweisen. Abbildung 4.14: Mehrere gleich lange Pfade 7 Bei n Knoten in einem Modell besteht die Corner Stitching Struktur aus maximal 4n + 1 Kacheln. [Ous84] KAPITEL 4. LINIENFÜHRUNG IN EINEM DYNAMISCHEN LAYOUT 56 Der beschriebene Algorithmus ist in der Lage alle optimalen (d.h. kürzesten) Lösungen zu liefern. In Abbildung 4.14 wird zuerst der mit den Kostenpunkten A bezeichnete Pfad verfolgt, da dessen Distanzwerte geringer sind als die des zweiten Weges. Wird jedoch der letzte Abschnitt des Pfades (d.h. der Teil zwischen A2 und E) berechnet, so entspricht der Distanzwert der gesamten Manhattan-Distanz zwischen S und E. Der Algorithmus bricht jedoch in diesem Fall nicht ab, obwohl der Pfad die Endkachel der Linie als Endkachel enthält, sondern legt den Pfad im Heap ab. Nun ist aber die Manhattan-Distanz zwischen S und B1 geringer als die Manhattan-Distanz zwischen S und E und der zweite Pfad wird berechnet. Erst wenn auch dieser Pfad den Endpunkt erreicht hat, wird einer der beiden kompletten Pfade aus dem Heap entnommen und danach der Vorgang abgebrochen. Die übrigen Lösungen liegen dann alle an der Spitze des Heaps und können leicht entnommen werden. Somit ist der Algorithmus in der Lage alle bezüglich der Distanz optimalen Lösungen zu liefern, wobei es dem eigentlichen Linienführungsalgorithmus überlassen bleibt, anhand eigener Kriterien eine davon für die Linienführung auszuwählen. Linienführung Für die eigentliche Linienführung innerhalb des aus freien Kacheln bestehenden Pfades, sind verschieden Ansätze denkbar. Abbildung 4.15 zeigt drei davon. Da bekannt ist, wo der Pfad durchführt und wieviel freier Raum für die Linie zur Verfügung steht, weisen Realisierungen der dazu benötigten Algorithmen keine hohe Komplexität auf. Abschnitt 5.3 geht auf eine mögliche Realisierungen ein. Abbildung 4.15: Verschiedene Möglichkeiten der Linienführung in einem Pfad 4.3.3 Sekundärnotation Die Corner Stitching Datenstruktur lässt sich neben der Linienführung auch für die Erhaltung der Sekundärnotation einer Linie nutzen. Die Sekundärnotation einer Linie ist, wie in Abschnitt 2.3.1 beschrieben, von der Position der Knoten, zwischen denen die Linie hindurchführt, abhängig. Da dank der Corner Stitching Struktur für alle freien Kacheln, durch die eine Linie hindurchfüren muss, jeweils die benachbarten Knoten bzw. belegten Kacheln bekannt sind, lässt sich die Struktur zur Erhaltung der Sekundärnotation nutzen. Abbildung 4.16 illustriert das Vorgehen hierzu anhand einer orthogonalen Linienführung. Es ist jedoch ebenso auf die anderen Ansätze anwendbar, sofern diese Änderungen durch den Benutzer und damit eine Sekundärnotation vorsehen. KAPITEL 4. LINIENFÜHRUNG IN EINEM DYNAMISCHEN LAYOUT 57 Abbildung 4.16: Erhaltung der Sekundärnotation durch die Corner Stitching Struktur Durch die expliziten Nachbarschaftsbeziehungen lässt sich in Abbildung 4.16a leicht das Rechteck berechnen, das den Bereich zwischen den Knoten A und B angibt, in dem sich das entsprechende vertikale Segment der Linie befinden muss. Dieses in Abbildung 4.16a dunkelgrau hinterlegte Rechteck kann dabei für verschieden Zwecke genutzt werden: • Das Rechteck gibt an, wieweit der Benutzer das entsprechende Liniensegment verschieben und damit die Sekundärnotation definieren kann. • Die relative horizontale Position der Linie innerhalb des Rechtecks definiert die Sekundärnotation, die auch bei Veränderungen des Layouts erhalten bleiben muss. Wird wie in Abbildung 4.16b das Layout durch die Vergröberung von Knoten B verändert, so kann die relative horizontale Position des Liniensegments aus Abbildung 4.16a innerhalb dieses Rechtecks beibehalten werden. Dazu wird die Linie erst komplett neu geführt und dann entsprechend der Sekundärnotation (d.h. der relativen Position innerhalb des Rechtecks) angepasst. Das Vorgehen muss dabei auf alle horizontalen und vertikalen Segmente einer Linie angewandt werden. • Das Rechteck lässt sich zusätzlich auch noch für die Auflösung von Linienüberlappungen nutzen, da es angibt wie weit eine Linie für eine solche Auflösung maximal verschoben werden kann. Auf das Vorghen hierzu geht der nächste Abschnitt detaillierter ein. Grundsätzlich wäre mit dem kachelbasierten Ansatz auch eine grössere Einflussnahme durch den Benutzer möglich, indem dieser z.B. freie Kacheln angeben könnte, durch welche die Linie dann hindurchgeführt wird, oder die Linie sogar frei durch den freien Raum hindurchführen. Bleibt die Corner Stitching Struktur nach einer Veränderung des Layouts durch eine LayoutOperation weitgehend erhalten (d.h. es ändern sich in erster Linie die Grössen der Kacheln), so könnte nach der Layoutänderung die Linie an die veränderten Kacheln angepasst werden, ohne sie komplett neu zu führen. Ein solcher Ansatz lässt sich jedoch für Adora-Modelle im Moment nicht umsetzten, da der Zoom-Algorithmus in bestimmten Situationen das Layout so stark verändert, das die bisherige Linienführung umöglich wird und ein komplett neuer Pfad durch das Modell hindurch gesucht werden muss. Muss die Linie komplett neu geführt werden, so geht die Sekundärnotation verloren, womit es keinen Sinn macht, dem Benutzer einen grossen Einfluss auf die Linienführung zu überlassen, wenn diese Änderungen bei der KAPITEL 4. LINIENFÜHRUNG IN EINEM DYNAMISCHEN LAYOUT 58 ersten Anwendung des Zoom-Algorithmus alle verloren gehen. Aus diesem Grund beruht der kachelbasierte Ansatz auf einer automatischen Linienführung. Mit Hilfe der Corner Stitching sind jedoch auch andere Ansätze möglich, sofern die Layout-Operationen die Erhaltung des Layouts in einem bestimmten Rahmen garantieren können. 4.3.4 Linienüberlappungen und -überscheidungen Werden die Linien um die Hindernisse herumgeführt ohne dabei auf bestehnde Linien Rücksicht zu nehmen, so kommt es zu Überschneidungen und Überlappungen zwischen verschiedenen Linien. Unter Überschneidungen sind dabei Situationen zu verstehen, bei der sich zwei Linien in einem Punkt kreuzen. Bei Überlappungen kommen die Linien in einem bestimmten Bereich aufeinander zu liegen. Überlappungen stellen dabei das grössere Problem dar, da die beiden Linien optisch nicht mehr voneinander unterschieden werden können. Im Folgenden soll deshalb in erster Linie die Auflösung von Überlappungen und nicht von Überschneidungen behandelt werden. Abbildung 4.17a illustriert eine solche Überlappung zweier Linien. Die Linien zwischen A und D und zwischen B und C kommen in einem bestimmten Bereich aufeinander zu liegen. Das Problem kann zwar bei allen Ansätzen der Linienführung auftreten, gewisse Ansätze, wie z.B. der orthogonale sind jedoch anfälliger dafür. Im Folgenden werden nur Vorgehensweisen betrachtet, die keine bestehenden Linien verlegen, sondern nur die neue Linie an bereits bestehende Linien anpassen. Werden beim Hinzufügen einer neuen Linie bestehende Linien verschoben, so leidet zum einen die Sekundärnotation darunter und zum anderen kann es zu einer Kettenreaktion kommen, wodurch eine grosse Anzahl der Linien verschoben werden muss. Um Überlappungen zu verhindern, kommen im Wesentlichen zwei Möglichkeiten in Frage. Abbildung 4.17: Möglichkeiten zur Auflösung von Linienüberscheidungen Bei der ersten Möglichkeit wird die Corner Stitching Datenstruktur um eine dritte Kachelart erweitert: die Linienkacheln. Diese stellen im Gegensatz zu den belegten Kacheln für die Linienführung keine unüberwindbaren Hindernisse dar, ihre Durchquerung wird jedoch erschwert, indem der Distanzwert mit einem konstanten Wert multipliziert wird. Dadurch werden solche Linienkacheln für die Linienführung weniger attraktiv, da sie höhere Kosten aufweisen. Durch dieses Vorgehen lassen sich sowohl Überlappungen von Linien als auch Überschneidungen zwischen Linien minimieren. Abbildung 4.17b veranschaulicht dieses Vorgehen. Bei einem solchen Vorgehen tauchen jedoch zwei wesentliche Probleme auf: erstens wird die Realisierung der Operationen auf der Corner Stitching Struktur bedeutend komplexer. So kommen, KAPITEL 4. LINIENFÜHRUNG IN EINEM DYNAMISCHEN LAYOUT 59 falls es, wie in Abbildung 4.17b, zu einer Kreuzung von Linien kommt, Linienkacheln innerhalb von anderen Linienkacheln zu liegen, was durch das Aufsplitten einer der Linienkacheln verhindert werden muss. Und zweitens kann die Linienführung für den Benutzer nur noch schwer nachvollziebar werden, da die Linien plötzlich und für den Benutzer ohne einsichtigen Grund komplett anders geführt werden. So werden, falls in Abbildung 4.17b noch weitere Linien zwischen A und D hinzugefügt werden, diese ab einer gewissen Anzahl um die Knoten B oder C herumgeführt, da der direkte Weg durch die bereits bestehenden Linien zu teuer wird. Dies minimiert zwar die Überschneidungen und Überlappungen der Linien ist jedoch für einen Benutzer ohne Kenntnis dieser Vorgänge kaum nachvollziebar. Dabei handelt es sich um ein generelles Problem aller globalen Ansätze der Linienführung (d.h. der Ansätze, die beim Hinzufügen von neuen Linien alle bestehenden Linien in die Linienführung miteinbeziehen). Die Linienführung verhält sich bei solchen Ansätzen nicht mehr stetig, d.h. kleinste Veränderungen am Layout oder einer Linie können einen bedeutenden und nicht nachvollziebaren Einfluss auf das Layout haben. Die zweite Möglichkeit besteht darin, die Corner Stitching Struktur nicht zu verändern und damit beim Finden eines geeigneten Pfades die übrigen Linien zu vernachlässigen. Erst bei der eigentlichen Linienführung (d.h. beim Hindurchführen der Linie durch den aus freien Kacheln bestehenden Pfad) werden Überlappungen nachträglich aufgelöst. Dazu ist es nötig, die Segmente der neuen Linie auf Überlappungen mit den Segmenten bestehender Linien zu überprüfen und im Fall einer Überlappung das entsprechende Segment der neuen Linie zu verschieben. Abbildung 4.17c illustriert dieses Vorgehen. Das dunkelgrau hinterlegte Rechteck gibt dabei den Bereich an, indem sich das Segment bewegen kann und entspricht dem Rechteck, das auch für die Erhaltung der Sekundärnotation zum Einsatz kommt. Bei diesem Vorgehen werden in erster Linie Linien verschoben, deren Segment in einem gewissen Bereich aufeinander liegen und es wird nicht die Anzahl der Schnittpunkte zwischen den Linien minimiert. Ab einer genügend hohen Anzahl von Linien, die durch einen engen Bereich hindurchführen, kommen die Linien auch wieder aufeinander zu liegen, was jedoch durch den Benutzer durch das Verschieben von Knoten und Linien verhindert werden kann. Diese Möglichkeit überlässt damit einen Teil der Verantwortung für das Verhindern von Linienüberschneidungen dem Benutzer und gesteht diesem damit auch einen grösseren Einfluss zu. 4.3.5 Beurteilung Bei der beschriebenen kachelbasierten Linienführung handelt es sich um einen echten RoutingAlgorithmus, d.h. der Algorithmus findet in jedem noch so komplizierten Layout den kürzesten Weg, sofern mindestens ein Weg existiert. Er ist deshalb bei der Anwendung nicht auf bestimmte Layouts oder Konstellationen beschränkt. Dadurch dass die verschiedenen Schritte für die Linienführung einzeln realisiert und getestet werden können, halten sich auch die Komplexität und damit der Aufwand der Realisierung in Grenzen. Adora-Modelle unterscheiden sich vom Entwurf integrierter Schaltungen durch eine kleinere Anzahl von Knoten. Diese Knoten sind in der Regel jedoch bedeutend grösser und haben die unterschiedlichsten Ausdehnungen. Die Corner Stitching Struktur kommt diesem Umstand entgegen, da ihre Komplexität von der Anzahl der Knoten und nicht von der Ausdehnung des Gesamtmodells abhängt. Bei einer uniforme Gitterstruktur, wie sie z.B. beim Algorithmus von Lee zum Einsatz kommt, darf die Zellengrösse und damit die Auflösung des Gitters die minimale Distanz zwischen zwei Knoten nicht unterschreiten, da sonst keine Linie mehr KAPITEL 4. LINIENFÜHRUNG IN EINEM DYNAMISCHEN LAYOUT 60 zwischen diesen Knoten hindurchgeführt werden kann. Dadurch explodiert bei einem grossen Modell die Anzahl der Zellen und die Algorithmen kommen für eine interaktive Nutzung nicht in Frage. Die Corner Stitching Struktur jedoch lässt sich sehr schnell erstellen und kann trotzdem mit einer sehr grossen Anzahl von Knoten umgehen. So sind im Bereich der integrierten Schaltungen mehrere Millionen Knoten keine Seltenheit [Ous85]. Weil sich die Anzahl der Kacheln in Grenzen hält, weisen auch die Algorithmen zur Linienführung Laufzeiten auf, die eine interaktive Nutzung ermöglichen. Zusätzlich zum Problem der Linienüberschneidungen stellt sich bei der Linienführung noch das Problem der Überlappungen von Linienbeschriftungen oder von Linienbeschriftungen und Knoten. Liegen der Beschriftungen verschiedener Linien übereinander, so sind sie nicht mehr lesbar. Die Linienbeschriftungen müssen deshalb so platziert werden, dass es zu keinen oder möglichst wenige Überlappungen kommt. Das Problem weist dabei Ähnlichkeiten zum Problem der Linienüberschneidungen auf, wodurch auch ähnliche Ansätze zur Lösung denkbar sind (vgl. dazu Abschnitt 4.3.4). Da durch die Corner Stitching Struktur für jedes Segment einer Linie bekannt oder leicht herauszufinden ist, wieviel freier Raum sich darum herum befindet, kann bei der Platzierung der Linienbeschriftungen auf diese Information zurückgegriffen werden. Gegenüber den anderen vorgestellten Ansätze weist der Ansatz der kachelbasierten Linienführung im Wesentlichen die folgenden Vorteile auf: • Der Ansatz bietet einen echten Routing-Algorithmus, der in jedem Fall einen Pfad findet, falls einer existiert. Eine solche universelle Anwendbarkeit können die anderen Ansätze nicht bieten. • Bei der kachelbasierten Linienführung wird das Finden eines geeigneten Pfades von der eigentlichen Linienführung entkoppelt. Dadurch sind verschiedene Arten der Linienführung (z.B. möglichst direkt oder orthogonal) auf dem gleichen Fundament aufbauend realisierbar. Eine neue Linienführung lässt sich dabei leicht realisieren, da der grösste Teil des Problems getrennt davon bereits gelöst ist. • Die Linienführung wird bei diesem Ansatz von den Layout-Operationen (wie z.B. dem Zoom-Algorithmus) entkoppelt. Die Linienführung ist dabei nicht von den LayoutOperationen abhängig und neue Layout-Operationen lassen sich ohne Änderungen an der Linienführung realisieren. • Die kachelbasierte Linienführung weist eine Laufzeit auf, die eine interaktive Nutzung in einem Werkzeug ermöglicht. • Neben der eigentlichen Linienführung ermöglicht der Ansatz auch Vorgehensweisen zur Erhaltung der Sekundärnotation einer Linie und z.B. auch zum Platzieren der Linienbeschriftungen. Im Weiteren wird deshalb nur dieser Ansatz der kachelbasierten Linienführung weiter verfolgt. Die anderen Ansätze werden aufgrund der grundsätzlichen Probleme, die sie mit sich bringen, nicht weiter verfolgt. KAPITEL 4. LINIENFÜHRUNG IN EINEM DYNAMISCHEN LAYOUT 4.3.6 61 Weitere Anwendungsmöglichkeiten für die Datenstruktur Die Corner Stitching Struktur kann nicht nur für die Linienführung sondern für alle Layoutoperationen, die auf Informationen über den freien Raum zwischen den Knoten oder über Nachbarschaftsbeziehungen im Layout angewiesen sind. So muss z.B. der Zoom-Algorithmus in der jetztigen Form Okklusionen zwischen Knoten zuerst entdecken und dann auflösen. Operiert der Zoom-Algorithmus jedoch auf einer Corner Stitching Struktur, so ist für jeden Knoten bereits zum Voraus klar, wie weit er verschoben werden kann, da der dafür benötigte freie Raum explizit in der Struktur repräsentiert ist. Kapitel 5 Realisierung des Linienführungsalgorithmus Wurden im vorhergehenden Kapitel die grundlegende Idee hinter der Kachel-basierten Linienführung und das Vorgehen dazu eingeführt, so bieten die folgenden Abschnitte einen detaillierteren Einblick in die dazu benötigen Algorithmen. Darunter fallen sowohl solche zur Erstellung und Verwaltung der Corner Stitching Datenstruktur als auch die eigentlichen Linienführungsalgorithmen. 5.1 Datenstruktur: Corner Stitching Da die Corner Stitching Struktur für alle folgenden Algorithmen von grundlegender Bedeutung ist, wird zuerst auf diese Datenstruktur eingegangen. Die Ausführungen folgen dabei in weiten Teilen der Orginalpublikation von Ousterhout [Ous84]. Da die Datenstruktur mit den Corner Stitches, wie in in Abschnitt 4.3.1 dargelegt, einen einfachen und leicht verständlichen Aufbau besitzt, werden im Folgenden in erster Linie die darauf operierenden Algorithmen erläutert. 5.1.1 Kachel an bestimmter Position lokalisieren Eine der häufigsten geometrischen Operationen auf einem Adora-Modell ist das Lokalisieren des Knotens der sich an einer bestimmten Position (angegeben durch deren Koordinaten) befindet. Diese Operation muss z.B. bei jeder Bewegung des Mauszeigers durchgeführt werden, um zu bestimmen in welchem Knoten sich dieser im Augenblick befindet. Normalerweise werden dazu alle Knoten einer Liste sequentiell durchlaufen und jeweils darauf überprüft, ob sich die Koordination des gesuchten Punktes innerhalb des Knotens befinden. Hält sich die Anzahl der Knoten in Grenzen, so stellt dieses Vorgehen trotz seiner Ineffizienz kein Problem dar. Die Corner Stitching Struktur ermöglicht jedoch die Anwendung eines ausgereifteren Algorithmus, der für jeden beliebigen Punkt die Kachel liefert, in der dieser Punkt enthalten ist. Dabei kann es sich sowohl um eine belegte Kachel (d.h. einen Knoten) als auch eine freie 62 KAPITEL 5. REALISIERUNG DES LINIENFÜHRUNGSALGORITHMUS 63 Kachel handeln. Der Algorithmus kann dabei von jeder beliebigen Kachel aus mit seiner Arbeit beginnen. Bei der Anwendung auf die Adora-Modelle startet der Algorithmus jedoch normalerweise aus der (freien oder belegten) Kachel, die sich in der linken oberen Ecke des Modells befindet. Der Algorithmus setzt sich dabei aus folgenden Schritten zusammen: 1. Zuerst folgt der Algorithmus den Corner Stitches, die auf den oberen oder unteren Nachbarn einer Kachel zeigen (lt und lb in Abbildung 4.8 auf Seite 49), bis er auf eine Kachel trifft, deren vertikales Intervall die vertikale Position des Punktes enthält. 2. Von dieser Kachel aus folgt der Algorithmus solange den Corner Stitches zu den linken und rechten Nachbarn (tl und tr in Abbildung 4.8 auf Seite 49) bis er auf eine Kachel trifft, deren horizontales Intervall die horizontale Position des Punktes enthält. 3. Bei diesem Vorgang kann es dazu kommen, dass das vertikale Intervall der durch die horizontale Suche (Schritt 2) gefundenen Kachel die vertikale Position des Punktes nicht mehr enthält. Abbildung 5.1 illustriert dieses Problem: durch die Lage von Kachel F springt der Algorithmus bei der horizontalen Suche in Kachel G. Die vertikale Position des Punktes liegt jedoch nicht innnerhalb dieser Kachel. Deshalb müssen die Schritte 1 und 2 solange wiederholt werden, bis die Kachel gefunden wurde, die den Punkt auch wirklich enthält. Abbildung 5.1: Kachel an einem bestimmten Punkt lokalisieren Im ungünstigsten Fall müssen bei diesem Vorgehen alle Kacheln der Struktur untersucht √ werden. Im durchschnittlichen Fall sind jedoch bei n Kacheln nur gerade n Kacheln1 zu durchsuchen, also deutlich weniger als beim sequentiellen Durchsuchen einer Liste, bei dem durchschnittlich n2 Kacheln untersucht werden müssen. Der Algorithmus spielt seine Stärke damit bei einer sehr grossen Anzahl von Kacheln aus, wie dies bei integrierten Schaltungen normalerweise der Fall ist. Aufgrund der bedeutend geringeren Anzahl an Knoten und damit auch an Kacheln ist dieser Unterschied bezüglich der Laufzeit bei Adora-Modellen von geringerer Bedeutung. 1 Eine ausführliche Diskussion hierzu findet sich in [Ous84]. KAPITEL 5. REALISIERUNG DES LINIENFÜHRUNGSALGORITHMUS 5.1.2 64 Datenstruktur aufbauen Bevor mit der Corner Stitching Datenstruktur gearbeitet werden kann, muss diese aufgebaut werden. Zu Beginn besteht die gesamte Struktur aus einer einzigen freien Kacheln, die den Bereich des gesamten Layouts einnimmt. In diese freie Kachel werden dann nacheinander alle Knoten eingefügt. Da bei einem Adora-Modell die Knoten hierarchisch ineinander geschachtelt sind, wird die Corner Stitching Strukur immer innerhalb eines Knoten für alle Kinder dieses Knotens erstellt. Da die Corner Stitching Struktur im vorliegenden Fall nur für die Linienführung benutzt wird, wird die gesamte Struktur erst im Nachhinein, d.h. wenn das gesamte Layout (Position und Grösse der Knoten) bereits festgelegt ist, erstellt. Beim Erstellen der Struktur kann deshalb immer von einem korrekten Layout, d.h. einem Layout ohne Überlappungen zwischen Knoten, ausgegangen werden. Daher ist es auch nicht nötig vor dem Einfügen eines Knoten zu überprüfen, ob der Knoten an dieser Stelle überhaupt eingefügt werden kann, obwohl eine solche Überprüfung mit Hilfe der Corner Stitching Struktur leicht möglich wäre. Abbildung 5.2 zeigt das Vorgehen beim Einfügen eines Knotens in eine Corner Stitching Strukur. Dabei wird ein Knoten in eine Struktur eingefügt, die bereits andere Knoten enthält. Das Vorgehen beim Einfügen des ersten Knotens bleibt jedoch dasselbe, wobei die Struktur vor dem Einfügen dann nur aus einer einzige freie Kachel besteht. Abbildung 5.2: Knoten in die Corner Stitching Struktur einfügen KAPITEL 5. REALISIERUNG DES LINIENFÜHRUNGSALGORITHMUS 65 Der Algorithmus setzt sich aus folgenden Schritten zusammen: 1. Mit Hilfe des in Abschnitt 5.1.1 beschriebenen Algorithmus wird nach der freien Kachel gesucht, die die obere linke Ecke (P1 in Abbildung 5.2a) des einzufügenden Knotens enthält. Aufgrund der Organisation der Corner Stitching Struktur ist die gesamte obere Kante des einzufügenden Knoten in einer einzigen freien Kachel enthalten. 2. Diese obere Kachel wird entlang einer horizontalen Linie, die durch die obere Kante des einzufügenden Knotens verläuft, in zwei Kacheln aufgespaltet (Abbildung 5.2b). Dabei müssen die Corner Stitches der beteiligten und benachbarten Kacheln angepasst werden. 3. Mit Hilfe des in Abschnitt 5.1.1 beschriebenen Algorithmus wird nach der freien Kachel gesucht, die die untere linke Ecke (P2 in Abbildung 5.2a) des einzufügenden Knotens enthält. 4. Diese untere Kachel wird analog zu Schritt 2 aufgespalten und die Corner Stitches angepasst (Abbildung 5.2b). 5. Ausgehend von der oberen Kante des neuen Knotens werden bis zu der unteren Kante alle Kacheln durchlaufen. Dabei muss jede Kachel vertikal in zwei Kacheln aufgespaltet werden: Eine Kachel rechts und eine Kachel links des neuen Knotens. Freie Kacheln werden falls möglich vertikal zu einer einzelnen Kacheln verbunden. Dabei sind jeweils die Corner Stitches aller beteiligten Kacheln anzupassen (Abbildung 5.2c). Die Laufzeit des Algorithmus hängt vom Aufwand, der für das Aufspalten und Verbinden der Kacheln benötigt wird, ab. Dieser wiederum ist abhängig von der Anzahl der zu bearbeitenden Kacheln, d.h. von der Umgebung, in die der neue Knoten eingefügt werden soll. Normalerweise läuft dieser Vorgang in konstanter Zeit ab, ist also nicht abhängig von der Anzahl der Knoten im gesamten Modell. Eine genauere Diskussion des Aufwandes für das Einfügen von Knoten in die Corner Stitching Struktur findet sich in der Orginalpublikation von Ousterhout [Ous85]. Das Entfernen von Knoten aus der Corner Stitching Struktur erfolgt invers zum oben beschriebenen Einfügen. Da jedoch bei der Linienführung die Struktur jedesmal, wenn sie benötigt wird, “on-the-fly” erstellt wird, wird diese Operation im Zusammenhang mit der Linienführung nicht benötigt. Struktur speichern Beim Aufbauen der Corner Stitching Struktur stellt sich die Frage, zu welchem Zeitpunkt diese Struktur neu aufgebaut werden muss und ob und wie sie abgespeichert werden kann. Da die Knoten eines Adora-Modells hierarchisch ineinander geschachtelt sind, besteht ein erster Ansatz darin, für jeden Knoten eine Corner Stitching Struktur zu erstellen, die jeweils dessen Kinder als belegte Kacheln enthält. Diese Struktur müsste nur einmal erstellt werden und könnte danach im Knoten gespeichert werden. Das Problem mit diesem Ansatz ist aber, dass die Corner Stitching Struktur je nach Start- und Endknoten der betreffenden Linie unterschiedlich ausfällt. Damit gibt es im Zusammenhang mit der Linienführung keine eindeutige Corner Stitching Struktur für jeden Knoten, die einmal erstellt und dann abgespeichert werden kann. Abbildung 5.3 veranschaulicht dies: KAPITEL 5. REALISIERUNG DES LINIENFÜHRUNGSALGORITHMUS 66 Abbildung 5.3: Unterschiedliche Corner Stitching Strukturen innerhalb eines Knotens Obwohl die Linie aus Abbildung 5.3a als auch in Abbildung 5.3b durch Knoten 1 hindurchführen, kommen in den beiden Fällen unterscheidliche Corner Stitching Strukturen zum Einsatz. Der Unterschied kommt dadurch zu Stande, dass die beiden Linien aufgrund der hierarchischen Einordnung ihrer Start- und Endknoten um unterschiedliche Hindernisse herumgeführt werden müssen. So stellt z.B. der Knoten 1.1.2 in Abbildung 5.3a für die Linie ein Hindernis dar, in Abbildung 5.3b jedoch nicht, da er in diesem Fall innerhalb des Startknotens liegt. Der Aufbau der Corner Stitching ist damit nicht nur von den Kindern des übergeordneten Knotens, sondern auch von der Linie selbst abhängig. Aus diesem Grund ist es nicht sinnvoll, für jeden Knoten die entsprechende Corner Stitching Struktur aufzubauen und diese im Knoten zu speichern. Zwar wäre es möglich, für jede Linie die entsprechende Struktur zu speichern, um bei einer Anpassung der Linie infolge einer Layoutveränderung darauf zurückgreifen zu können. Dabei wird es jedoch auch nötig, diese Struktur bei einer Veränderung des Layouts (z.B. einer Positionsänderung eines Knotens) anzupassen. Eine solche Anpassung kann sich aufwendig gestalten, da bestehende Kacheln verschwinden und neue Kacheln hinzukommen können und eine grosse Anzahl von Corner Stitches angepasset werden müssen. Da sich eine Struktur sehr schnell erstellen lässt, ist es in der Regel einfacher, bei jeder Linienführung eine neue Corner Stitching Struktur zu erstellen und diese auch nicht abzuspeichern. 5.1.3 Nachbarn bestimmen Eine weitere häufig benötigte Operation ist das Auffinden aller Kacheln, die eine bestimmte Kachel auf einer bestimmten Seite berühren. Mit Hilfe der Corner Stitches ist es bei der Corner Stitching Struktur ein Leichtes diese Nachbarn auszumachen, indem einfach den entsprechenden Corner Stitches gefolgt wird. Abbildung 5.4 auf Seite 67 veranschaulicht das Vorgehen zum Auffinden aller Nachbarn, die Kachel A auf der rechten Seite berühren. Die Bezeichnung der Corner Stitches entspricht dabei derjenigen aus Abbildung 4.8 auf Seite 49. Die Suche beginnt dabei mit der Corner Stitch tr, die den rechten Nachbarn an der oberen rechten Ecke von Kachel A angibt. Dieser Zeiger führt auch gleich zum ersten Nachbarn. Danach wird jeweils den lb Corner Stitches gefolgt, bis die unterste Kachel erreicht wird. Die unterste Kachel entspricht dabei der Kachel, die über br von der Kachel A aus erreichbar ist. KAPITEL 5. REALISIERUNG DES LINIENFÜHRUNGSALGORITHMUS 67 Abbildung 5.4: Auffinden aller Nachbarn einer Kachel 5.2 Geeigneten Pfad finden Die grundlegende Funktionsweise des Algorithmus zum Finden eines geeigneten Pfades wurde bereits in Abschnitt 4.3.2 erläutert. Im Folgenden wird dessen Vorgehen systematisch und anhand eines Beispiels beschrieben. Der Algorithmus setzt sich dabei aus folgenden Schritten zusammen: 1. Mit Hilfe des Algorithmus aus Abschnitt 5.1.1 wird nach den beiden freien Kacheln gesucht, die den End- bzw. Startpunkt der Linie enthalten. Der Start- und Endpunkt der Linie sind damit als Teil der Sekundärnotation fest vorgegeben (vgl. dazu Abschnitt 2.3) und können durch den Algorithmus nicht verändert werden. Dabei ist zu beachten, dass diese Punkte auf den Rändern der entsprechenden Knoten liegen und deshalb zuerst in die nächstgelegenen freien Kacheln übertragen werden müssen. 2. Ein erster Pfad wird erstellt. Der genaue Aufbau eines Pfades ist in Abschnitt 4.3.2 beschrieben. Dieser erste Pfad enthält noch keinen Elternpfad; Er enthält die Startkachel aus Schritt 1 als Endkachel, den Startpunkt aus Schritt 1 als Kostenpunkt und einen Distanzwert 0. Dieser Pfad wird im Heap abgelegt. 3. Die folgenden Schritte werden wiederholt, solange der Heap, in dem die Pfade abgelegt sind, nicht leer ist. Der nächste Pfad wird aus dem Heap entnommen. Dieser aktuelle Pfad entspricht dem Pfad, der im Moment den kleinsten Distanzwert aufweist. Entspricht die Endkachel dieses Pfades der Endkachel der Linie aus Schritt 1, so wurde ein Pfad gefunden. Existieren mehrere Lösungen so befinden sich diese an der Spitze des Heaps und können daraus entnommen werden. Potentielle Lösungen lassen sich dabei daran erkennen, dass ihre Endkachel der Endkachel der Linie entspricht. Alle diese Lösungen werden vom Algorithmus zurückgegeben, womit dieser beendet wird. Ansonsten wird der aktuelle Pfad im folgenden Schritt weiterverarbeitet. 4. Dieser Schritt wird in analoger Weise für die Nachbarn oberhalb, unterhalb, links und rechts der Endkachel des aus dem Heap entnommenen Pfades durchgeführt. KAPITEL 5. REALISIERUNG DES LINIENFÜHRUNGSALGORITHMUS 68 Mit Hilfe des Algorithmus aus Abschnitt 5.1.3 werden alle Nachbarn der Endkachel des aktuellen Pfades durchlaufen. Entspricht der aktuelle Nachbar dieser Iteration einer belegten Kachel oder ist die entsprechende Kachel bereits im Pfad enthalten, so wird dieser Nachbar übersprungen. Ansonsten wird die Position des nächsten Kostenpunktes bestimmt. Dieser Kostenpunkt entspricht dabei dem Punkt innerhalb der Nachbarkachel, der gegenüber dem aktuellen Kostenpunkt die geringste Distanz aufweist (vgl. dazu Abschnitt 4.3.2). Danach wird die Manhatten-Distanz zwischen dem neuen Kostenpunkt und dem Kostenpunkt des aktuellen Pfades berechnet. Zum Abschluss wird ein neuer Pfad mit dem aktuellen Pfad als Elternpfad, dem aktuellen Nachbarn als Endkachel, dem neuen Kostenpunkt und dem berechneten Distanzwert erzeugt und im Heap abgelegt. Abbildung 5.5 illustriert das Vorgehen des oben beschriebenen Algorithmus anhand eines einfachen Beispiels. Dabei soll eine Linie zwischen den Hindernissen C und K hindurch vom Punkt X1 zum Punkt X2 geführt werden. A A B B F E C G D X1 F E H C G X1 K3 H K1 I I L K J M X2 N L K J O M X2 P E B Q Q (a) (b) K211 K311 C G D F E A C G D X1 X1 H H K13 I K12 K11 J O B K21 F N P A K31 D K2 K I K12 L M X2 N O K J L M N O P P Q X2 K111 Q (d) (c) Abbildung 5.5: Finden eines geeigneten Pfades Zu Beginn wird in Abbildung 5.5a der erste Pfad P0 erzeugt, der Kachel H als Endkachel, Punkt X1 als Kostenpunkt und einen Distanzwert 0 enthält. Dieser Pfad wird im Heap abge- KAPITEL 5. REALISIERUNG DES LINIENFÜHRUNGSALGORITHMUS 69 legt und in Schritt 2 auch gleich wieder daraus entnommen. Als nächstes werden alle Nachbarn der Kachel H (der Endkachel von P0) durchlaufen und die jeweiligen Kostenpunkt innerhalb dieser Nachbarn bestimmt. Abbildung 5.5b zeigt die drei Kostenpunkte K1, K2 und K3 für die drei Nachbarn I, G und E. Für jeden der Nachbarn wird ein neuer Pfad erzeugt, der P0 als Elternpfad enthält. Somit werden drei neue Pfade P1, P2 und P3 mit dem jeweiligen Kostenpunkt K1, K2 und K3 und der Manhatten-Distanz zwischen dem Kostenpunkt und dem Startpunkt X1 im Heap abgelegt. Aus dem Heap wird nun der Pfad mit dem geringsten Distanzwert entnommen und die Nachbarn von dessen Endknoten verarbeitet. In Abbildung 5.5c wird entsprechend den Distanzwerten zuerst P1 dann P2 und zuletzt P3 aus dem Heap entnommen. Aus P1 entstehen durch die drei Nachbarn drei neue Pfade (K11, K12 und K13) und aus P2 und P3 jeweils ein neuer Pfad P21 bzw. P31, die nun ihrerseits im Heap abgelegt werden. Aus dem Heap wird nun wiederum jeweils der Pfad mit dem geringsten Distanzwert entnommen. In Abbildung 5.5d werden die Pfade in der Reihenfolge P21, P11 und P12 aus dem Heap entommen und verarbeitet. Da der Pfad P12 Kachel L und damit die Endkachel der Linie als Endkachel enthält, wurde ein Pfad gefunden und er Algorithmus hat seine Arbeit erledigt. Im vorliegenden Fall gibt es damit nur eine optimale Lösung. Position von Start- und Endpunkt In der bisher beschriebenen Form wird die Position des Start- und Endpunktes der Linie vor der Anwendung des Algorithmus festgelegt und durch den Algorithmus nicht verändert. Wird die Position der beiden Punkte als Teil der Sekundärnotation betrachtet, so ermöglicht dieses Vorgehen die Erhaltung dieses Teils der Sekundärnotation bei Layoutveränderungen. Fügt der Benutzer jedoch eine neue Linie zum Modell hinzu, so müssen die Positionen der beiden Punkte bestimmt werde. Dies kann z.B. dadurch geschehen, dass eine direkte Linie durch die Mittelpunkte des Start- und Endknoten gezogen wird und der Start- und Enpunkt dann dem Schnittpunkt dieser Linie und dem Rand des Start- bzw. Endknoten entspricht. Durch eine kleine Modifikation ist aber auch der Algorithmus zum Finden eines geeigneten Pfades in der Lage, die Positionen der beiden Punkte zu bestimmen. Abbildung 5.6 illustriert das Vorgehen anhand des Startpunktes: Abbildung 5.6: Bestimmung des Startpunktes durch den Linienführungsalgorithmus KAPITEL 5. REALISIERUNG DES LINIENFÜHRUNGSALGORITHMUS 70 Der Algorithmus beginnt dabei nicht mit einem Punkt, der auf dem Rand des Startknotens liegt, sondern dem Mittelpunkt des Knotens. Die Startkachel der Linie ist damit nicht mehr eine freie Kachel, sondern entspricht der Kachel, die mit dem Startknoten belegt ist. Ansonsten bleibt das Vorgehen unverändert, d.h. die Nachbarkacheln der Startkachel werden durchlaufen und jeweils die Position der Kostenpunkte bestimmt. Durch dieses Vorgehen bestimmt der Algorithmus die erste freie Kachel, durch die ein bezüglich der Distanz optimaler Pfad hindurchführen muss. Ausgehend von dieser Kachel lässt sich dann leicht der Startpunkt auf dem Rand des Startknotens bestimmen. Diese Vorghen lässt sich in analoger Weise auch auf den Endpunkt der Linie anwenden, wodurch der Algorithmus in der Lage ist den kürzesten Pfad zwischen zwei Knoten zu finden. Die Bestimmung von Start- und Endpunkt durch den Algorithmus macht dabei jedoch nur beim erstmaligen Führen einer Linie Sinn, da sonst die Sekundärnotation (vgl. dazu Abschnitt 2.3) zerstört wird. 5.3 Linienführung Für das Führen der Linien durch den aus freien Kacheln bestehenden Pfad sind, wie bereits in Abschnitt 4.3.2 ausgeführt, verschiedenste Algorithmen denkbar. Im folgenden Abschnitt wird als Besipiel dazu eine mögliche Realisierung einer orthogonalen Linienführung beschrieben. 5.3.1 Orthogonale Linienführung Der folgende Algorithmus führt die Linien orthogonal durch den aus freien Kacheln bestehenden Pfad. Dabei geht er rückwärts vor, d.h. er beginnt mit der Endkachel und arbeitet sich bis zur Startkachel durch den Pfad hindurch. Diese Vorgehensweise kommt dadurch zu Stande, dass der im vorhergehenden Abschnitt beschriebene Algorithmus Pfade jeweils durch die Endkachel und einen Verweis auf den Elternpfad repräsentiert. Um den gesamten Pfad zu rekonstruieren ist es deshalb nötig, sich mit Hilfe der Verweise auf die Elternpfade von hinten nach vorne durch den Pfad zu hangeln. Damit ein solcher Pfad nicht zuerst in eine anderen Struktur umgewandelt werden muss, geht der Linienführungsalgorithmus rückwärts vor. Das vorgestellte Verfahren führt die Linie innerhalb einer freien Kachel in Abhängigkeit von der Richtung aus der die Linie die Kachel betritt und diese wieder verlässt. Die Richtungen werden im Folgenden mit den vier Himmelsrichtungen Nord, Süd, Ost und West bezeichnet. Dabei sind für eine freie Kachel vier verschiedene Konstellationen möglich: 1. Die Linie durchquert die freie Kachel vertikal, d.h. sie betritt die Kachel von Norden und verlässt sie nach Süden. Ebenso möglich ist eine Durchquerung von Süden nach Norden (Abbildung 5.7a). Dabei spielt es im Moment noch keine Rolle, ob für diese Durchquerung innerhalb der Kachel zusätzliche Hilfspunkte nötig sind oder nicht. 2. Die Linie verlässt die Kachel wieder in die gleiche Richtung, aus der sie diese betreten hat. Dabei kann es sich sowohl um Süden als auch um Norden handeln (Abbildung 5.7b). 3. Die Linie ändert innerhalb der Kachel ihre Richtung, d.h. sie betritt die Kachel von Norden oder Süden und verlässt sie nach Osten oder Westen. Ebenso ist es möglich, dass die Linie von Westen oder Osten in die Kachel eintritt und diese entweder nach KAPITEL 5. REALISIERUNG DES LINIENFÜHRUNGSALGORITHMUS 71 Norden oder Süden verlässt (Abbildung 5.7c). Diese Situation kann nur eintreten, falls die Kachel im Osten oder Westen dem Start- oder Endknoten entspricht. 4. Die Kachel wird von der Linie horizontal durchquert, d.h. die Linie tritt von Westen oder Osten in die Kachel ein und verlässt sie auf der gegenüberliegenden Seite (Abbildung 5.7d). Aufgrund der Organisation der Corner Stitching Struktur in maximale horizontale Streifen kann dieser Fall nur eintreten, wenn die betreffende freie Kachel sowohl der Start- als auch der Endkachel der Linie entspricht, d.h. der Pfad aus einer einzigen freien Kachel besteht. Abbildung 5.7: Mögliche Konstellationen bei der orthogonalen Linienführung Da sich der Pfad aus einer Kette von freien Kacheln zusammensetzt, lassen sich aufgrund der vorhergehenden und nachfolgenden Kachel leicht die Richtungen bestimmen, aus denen die Linie eine Kachel betreten und sie wieder verlassen muss. Der Pfad zwischen den Punkten X1 und X2 in Abbildung 5.8 setzt sich aus den vier dunkelgrau hinterlegten freien Kacheln zusammen. Kachel B befindet sich in diesem Pfad zwischen den Kacheln D und A, woraus sich schliessen lässt, dass die Linie Kachel B von Süden her betreten und nach Norden wieder verlassen muss. Im Folgenden werden dafür die Begriffe Eintritts- und Austrittsrichtung verwendet. Kachel B in Abbildung 5.8 hat damit die Einrtittsrichtung Süd und die Austrittsrichtung Nord. S X1 A B D E X2 E Abbildung 5.8: Bestimmung der Eintritts- und Austrittsrichtung KAPITEL 5. REALISIERUNG DES LINIENFÜHRUNGSALGORITHMUS 72 Der Algorithmus durchläuft rückwärts alle freien Kacheln, aus denen sich der Pfad zusammensetzt. Die Kacheln in Abbildung 5.8 werden damit in der Reihenfolge E, D, B und A durchlaufen. Die letzte Kachel E lässt sich dabei direkt aus dem Pfad entnehmen, da sie der Endkachel des Pfades entspricht. Die übrigen Kacheln befinden sich jeweils im Elternpfad des aktuellen Pfades, d.h. D im Elternpfad des Pfades, der E als Endkachel enthält. Für jede freie Kachel werden dabei zuerst die Eintritts- und Austrittsrichtung in bzw. aus der Kachel bestimmt. Im ersten Durchlauf (d.h. für die Endkachel des Pfades) müssen dabei beide Richtungen bestimmt werden. Danach entspricht die Eintrittsrichtung jeweils der Gegenrichtung der Austrittsrichtung der vorhergehenden Kachel. Da eine Linie in Abbildung 5.8 z.B. Kachel D nach Norden hin verlassen muss, kann Kachel B nur von Süden her betreten werden. Abbildung 5.9: Vorgehen bei der orthogonalen Linienführung KAPITEL 5. REALISIERUNG DES LINIENFÜHRUNGSALGORITHMUS 73 Abbildung 5.9 illustriert das Vorgehen des Algorithmus beim Führen einer Linie von Punkt P1 zu Punkt P2. Der Pfad setzt sich dabei aus den dunkelgrau hinterlegten freien Kacheln zusammen. Beim Bestimmen der Eintritts- und Austrittsrichtung wird jeweils auch gleich noch das horizontale Intervall festgelegt, durch das ein vertikales Segment hindurchführen muss. Die beiden Punkte die dieses Intervall aufspannen werden in Abbildung 5.9 jeweils mit L und R bezeichnet. So muss z.B. eine Linie, die Kachel E in Abbildung 5.9a von Süden her betritt, zwischen den Punkten L1 und R1 hindurchführen. Da sich der Endpunkt P2 als Teil der Sekundärnotation nicht verschieben lässt, wird die Linie zuerst so lange wie möglich ohne Richtungsänderung vom Endpunkt weg geführt. Befindet sich die horizontale Position des Liniensegments nicht mehr innerhalb des von L und R aufgespannten Intervalls, wie dies in Abbildung 5.9b mit L2 und R2 der Fall ist, so sind Hilfspunkt nötig, damit sich die horizontale Position des vertkalen Segment wiederum innerhalb des von L2 und R2 aufgespannten Intervalls befindet. Die horizontale Position der Hilfspunkte ergibt sich dabei aus dem letzten bzw. nächsten Segment, die vertikale Position entspricht der vertikalen Position des Mittelpunktes der Kachel, in welche der Hilfspunkt eingefügt wird. Da sich die horizontale Position der Punkte L3 und R3 in Abbildung 5.9c gegenüber derjenigen von L2 und R2 in Abbildung 5.9b nicht ändert, kann die Linie ohne Änderung weitergeführt werden. In Abbildung 5.9d wird das durch L4 und R4 aufgespannte horizontale Intervall jedoch schmaler, da Kachel B schmaler ist als Kachel D. Wärend sich der Algorithmus durch die Kacheln hindurch bewegt, werden die Positionen von L und R nur verändert, falls der Bereich eingeschränkt wird, d.h. L nach rechts oder R nach links verschoben werden muss. Dadurch geben die beiden Punkte immer den schmalsten horizontalen Durchgang an, durch den sich ein vertikales Segment hindurchbewegen muss. Im Fall von Abbildung 5.9d wird der zuletzt eingefügte Hilfspunkt H2 nach links verschoben, um die Linie durch den Mittelpunkt von Kachel B hindurchzuführen. Der durch L und R aufgespannte Bereich gibt dabei jeweils an, wie weit der zuletzt eingefügte Hilfspunkt bewegt werden kann. In Abbildung 5.9e verändert sich die horizontale Position von L5 und R5 gegenüber L4 und R4 nicht und die Linie wird ohne Veränderung durch Kachel B hindurchgeführt. Da sich der Startpunkt P1 nicht verschieben lässt, wird in Abbildung 5.9f das Intervall einfach auf diesen Punkt eingeschränkt, d.h. sowohl L als auch R entsprechen P1. Dadurch befindet sich dieser neue Bereich ausserhalb des Bereiches von Abbildung 5.9e und die Hilfspunkte H3 und H4 sind nötig um die Linie durch Kachel A hindurchzuführen. Im obigen Beispiel tritt nur der Fall auf, dass die Linie von Süden nach Norden durch eine Kachel hindurchgeführt werden muss (dies entspricht der Konstellation a in Abbildung 5.7 auf Seite 71). Dies ist aufgrund der Organisation der Corner Stitching Struktur in maximale horizontale Streifen auch der Fall, der am häufigsten eintritt. In den übrigen Fällen (Konstellation b, c und d in Abbildung 5.7) ist ein solch kompliziertes Vorgehen gar nicht nötig, da alle Informationen, die für das Einfügen eines Hilfspunktes benötigt werden, in der betreffenden Kachel enthalten sind und die Position der Hilfspunkte nicht durch vorhergehende oder nachfolgende Kacheln beeinflusst werden kann. So ist z.B. für die Situation in Abbildung 5.7c die Position des Hilfspunktes beim Einfügen bekannt und diese Position wird nicht mehr verändert. Die vertikale Position ist durch die vertikale Position des zuletzt eingefügten Hilfspunktes und die horizontale Position durch die horizontale Position des Start- bzw. Endpunktes gegeben. Veränderungen an der Position eines bereits eingefügten Hilfspunkt (wie dies in Abbildung 5.9d der Fall ist) sind somit in keiner dieser Konstellationen nötig. KAPITEL 5. REALISIERUNG DES LINIENFÜHRUNGSALGORITHMUS 74 Problemfälle Beim oben beschriebenen Vorgehen zur orthogonalen Linienführung kann es in bestimmten Situationen zu einer unschönen Linienführung kommen. Dabei wird jedoch auch in diesen Fällen die Linie korrekt, d.h. ohne Überschneidungen mit Knoten geführt. Abbildung 5.10 zeigt drei solche Problemfälle. A A B B C C B B D D A C D (a) B C (b) (c) Abbildung 5.10: Problemfälle bei der orthogonalen Linienführung In der Situation a wird die Linie sehr nahe am Knoten C entlang geführt, obwohl zwischen den Knoten C und D bedeutend mehr Raum zur Verfügung steht. Dieses Problem tritt auch im Beispiel von Abbildung 5.9b auf Seite 72 bei den Kacheln E und F auf. Ein ähnliches Problem zeigt Situation b in Abbildung 5.10, bei der die Linie ebenfalls in zu geringem Abstand an einem Knoten vorbeigeführt wird. Die Linien nutzen in beiden Fällen den zur Verfügung stehenden freien Raum in vertikaler Richtung nicht optimal aus. Aufgrund der Organisation der Corner Stitching Struktur tritt dieses Problem nur bei horizontalen Liniensegmenten auf, d.h. die vertikalen Segmente werden immer innerhalb des zur Verfügung stehenden Raumes zentriert. Das Problem lässt sich leicht lösen, indem, nachdem die Linie geführt worden ist, in einem zweiten Schritt die horizontalen Liniensegmente ebenfalls zentriert werden. Dies geschieht mit Hilfe des Rechteckes, das den Bereich angibt, in dem sich ein Liniensegment befinden muss. Diese Rechtecke sind in Abbildung 5.10 dunkelgrau hinterlegt dargestellt. Dieses Rechteck kommt ebenfalls für die Erhaltung der Sekundärnotation und das Verschieben von Liniensegment zur Vermeidung von Linienüberlappungen zum Einsatz (vgl. dazu Abschnitt 4.3.3). Innerhalb dieses Rechteckes kann das betreffende horizontale Liniensegment dann zentriert werden. Durch die Zentrierung der Linie innerhalb des freien Raumes, wird in Situation c in Abbildung 5.10 die Linie mit zu grossem Abstand um Knoten B herumgeführt. Auch dieses Problem lässt sich leicht lösen, indem ein Grenzwert eingeführt wird, ab dem die Linie nicht mehr zentriert, sondern in einem festen Abstand um den betreffenden Knoten herumgeführt wird. Bestimmen der optimalen Lösung Der Algorithmus zum Finden eines geeigneten Pfades aus freien Kacheln kann, wie in Abschnitt 5.2 beschrieben, mehrere gleichwertige Lösungen liefern. Der Algorithmus, der die Linie durch diese Kacheln hindurchführt, muss deshalb anhand eigener Kriterien eine dieser Lösungen auswählen. Dazu ist es in der Regel nötig, durch alle Pfade, die für eine optimale Linienführung in Frage kommen, eine Linie hindurchzuführen und diese verschiedenen Linien miteinander zu vergleichen. So existieren z.B. in Abbildung 5.11 zwei Lösungen, wie eine Linie KAPITEL 5. REALISIERUNG DES LINIENFÜHRUNGSALGORITHMUS 75 von P1 zu P2 geführt werden kann. Die beiden Linien weisen dabei sogar die gleiche Länge auf. Abbildung 5.11: Mehrere Lösungen bei der orthogonalen Linienführung Aus diesen Lösungen muss nun eine ausgewählt werden. Für die Auswahl kommen verschiedene Kriterien in Frage. Ein Auswahlverfahren kann z.B. nach folgenden Kriterien durchgeführt werden. Die Kriterien 1 bis 3 kommen dabei bei einem Auswahlverfahren zur Anwendung, bei dem zuerst anhand des ersten Kriteriums versucht wird, einen Sieger zu küren. Ist aufgrund des ersten Kriteriens keine eindeutige Wahl möglich, weil beide Lösungen gleich gut abschliessen, kommt das zweite Kriterium zum Einsatz. Ist auch damit keine eindeutige Auswahl möglich, so wird das dritte Kriterium zur Entscheidung herangezogen. Dabei handelt es sich jedoch nur um eine Heuristik, d.h. es ist nicht garantiert, dass mit diesen Kriterien immer eine eindeute Auswahl möglich ist. Die folgenden Kriterien leiten sich aus den ästhetischen Kriterien aus dem Bereich des Graphenlayouts (vgl. dazu Abschnitte 2.1.5 und 3.1) ab. 1. Die Anzahl der Hilfspunkte in der Linie. Die Anzahl der Hilfspunkte stellt ein intuitives Kriterium zur Beurteilung der Qualität einer Linie dar, da mit zunehmender Anzahl von Hilfspunkten auch die Komplexität einer Linie zunimmt. 2. Die gesamte Länge der Linie. Die Länge der Linie entspricht dabei in vielen Fällen nicht der Distanz, die beim Finden eines geeigneten Pfades zum Einsatz kommt, weil sich die Kostenpunkte, mit denen diese Distanz berechnet wird, oftmals am Rande der freien Kacheln befindet, die Linie selbst jedoch möglichst zentriert durch die Kacheln geführt wird. 3. Die Länge des kürzesten Segments der Linie. Dieses Kriterium wird nötig, falls anhand der ersten beiden Kriterien keine eindeutige Auswahl möglich ist. Das Kriterium nimmt damit nicht eine ästhetische Beurteilung vor, sondern soll ein eine eindeutige Auswahl der Lösung ermöglichen. Die Auswahl der Lösung muss dabei eindeutig sein, d.h. eine Lösung darf nicht nur aufgrund der Tatsache, dass sie als Erste gefunden wurde, ausgewählt werden. Dies ist nötig, damit die Linien symetrisch geführt werden. Symetrisch bedeutet in diesem Zusammenhang, das eine Linie die vom End- zum Startpunkt führt, gleich aussieht wie eine Linie die umgekehrt KAPITEL 5. REALISIERUNG DES LINIENFÜHRUNGSALGORITHMUS 76 vom Start- zum Endpunkt führt. Dabei werden zwar in beiden Fällen die gleichen Lösungen gefunden, jedoch in unterschiedlicher Reihenfolge. Hat bei der Auswahl der Lösung diese Reihenfolge einen Einfluss, so ist es möglich, dass je nach Richtung die Linie unterschiedlich geführt wird. 5.3.2 Linienführung mit Hilfe von Splines Aufbauend auf dem Vorgehen zur orthogonalen Linienführung aus Abschnitt 5.3.1 lassen sich nun leicht weitere Linienführungen realisieren. So lässt sich z.B. durch das Einfügen von Stützpunkten an Stelle der Hilfspunkte eine auf Splines basierende Linienführung realisieren. Abbildung 5.12 illustriert dies anhand des Beispiels aus Abbildung 5.9 auf Seite 72. Abbildung 5.12: Linienführung mit Hilfe von Splines Daneben sind aber auch ganze andere Vorgehensweisen möglich, bei denen die Position der Hilfspunkt - anders als in Abschnitt 5.3.1 beschrieben - berechnet werden. Für eine direkte Linienführung kann das oberste Kriterium z.B. darin bestehen, die Linie mit möglichst wenig Hilfspunkten zu führen, womit auch ein anderes Verfahren angewandt werden muss, um diese Punkte zu bestimmen. Kapitel 6 Zusammenfassung und Diskussion Die Aufgabe der vorliegenden Arbeit bestand darin, eine Linienführung für Adora-Modelle zu entwickeln. Die Analyse bestehehender Linienführungsalgorithmen und von verschniedenen Autoren vorgeschlagener Ansätze für die Linienführung in Adora-Modellen brachte eine Reihe von Problemen zum Vorschein. So stellt bereits die Linienführung in einem statischen Layout ein nicht unerhebliches Problem dar. Die Visualisierung von Adora-Modelle beruht jedoch auf einem dynamischen Layout, bei dem aus einem integrierten Gesamtmodell unterschiedliche Darstellungen dynamisch generiert werden. Um ein interaktives Arbeiten mit den Modellen zu ermöglichen, werden dabei sehr hohe Anforderungen an die Laufzeit der Algorithmen gestellt. Aus diesem Grund kommen die meisten bestehenden Ansätze fürAdora-Modelle nicht in Frage, da sie eine zu hohe Laufzeitkomplexität aufweisen. Als zusätzliche Anforderung muss in Adora-Modellen die möglichst gute Erhaltung der Sekundärnotation ermöglicht werden, um dem Benutzer einen gewissen Einfluss auf das Layout und damit auch die Linienführung zu belassen. Aus diesem Grund kann die Linienführung nicht vollautomatisch durchgeführt werden. Die Sekundärnotation muss dabei, unabhängig von der aktuellen Darstellung, so gut wie möglich erhalten bleiben. Oftmals muss nach einer Veränderung des Layouts durch den Zoom-Algorithmus die Linie aber auch komplett neu gefürt werden, da der Zoom-Algorithmus das Layout des Modells zu stark verändert. In diesem Fall ist eine Erhaltung der Sekundärnotation nicht möglich. In den meisten bestehenden Ansätzen ist eine solche manuelle Einflussnahme in die Linienführung nicht vorgesehen. Da sich keiner der bestehenden Ansätze als für Adora-Modelle geeignet erwies, wurde im Verlauf der Arbeit ein neuer Ansatz entwickelt, der auf einer Datenstruktur beruht, die im Bereich des computerunterstützten Entwurfs von Schaltungen in erster Linie zum effizienten Speichern der Schaltungselemente entwickelt wurde. Dabei wird die eigentliche Linienführung, d.h. das Bestimmen der benötigen Hilfspunkte in den Linien, vom Finden des Bereiches, durch den die Linie hindurchführen muss, entkoppelt. Damit ist es möglich, verschiedene Ansätze der Linienfühung (z.B. orthogonal oder möglichst direkt) auf dem gleichen Fundament aufbauend zu implementieren und damit auch austauschbar zu gestalten. Zusätzlich ermöglicht dieser Ansatz dem Benutzer in beschränktem Masse Änderungen an der Linienfügrung vorzunehmen und diese auch bei Layoutveränderungen, wie sie z.B. durch den Zoom-Algorithmus entstehen, zu erhalten. Da sich die Erfüllung der an die Linienführung gestellten Anforderungen eine grosse Herausfor77 KAPITEL 6. ZUSAMMENFASSUNG UND DISKUSSION 78 derung darstellte, konnte im Rahmen der zur Verfügung stehenden Zeit keine abgeschlossene Realisierung für das Problem der Linienführung erarbeitet werden. Der vorgestellte Ansatz entspricht denn auch mehr einem grundlegenden Konzept als einer detaillierten technischen Lösung. Seine grundsätzliche Tauglichkeit für die Linienführung in Adora-Modellen hat er jedoch in einem Prototyp unter Beweis gestellt. Im Zusammenhang mit der Realisierung sind aber auch einige grundsätzliche Probleme bei der Linienführung aufgetaucht, denen bis jetzt noch kaum Aufmerksamkeit gewidmet wurde. So bleibt es z.B. unklar, in welchem Ausmass der Benutzer Einfluss auf die Linienführung nehmen und damit die Sekundärnotation definieren möchte. Ebenfalls bist jetzt nicht geklärt ist die Frage, welche Elemente eines Adora-Modells die Mental Map des Benutzers ausmachen und damit auch nach Layoutveränderungen weiterhin dieser Mental Map entsprechen müssen. Diese Fragen müssten mit Hilfe einer empirischen Analyse mit realen Adora-Modellen geklärt werden. Die Corner Stitching Datenstruktur, auf der die Linienführung beruht, könnte zusätzlich auch in anderen Bereichen der Visualisierung von Adora-Modellen eingesetzt werden, da sie zwei grundlegende Probleme aller geometrischen Algorithmen angeht: die Repräsentation der Nachbarschaftsbeziehungen zwischen den graphischen Symbolen und die explizite Repräsentation des freien Raumes zwischen den Elementen. Auf diese Informationen sind auch andere Layout-Operationen, wie z.B. der Zoom-Algorithmus, angewiesen. Die Corner Stitching Datenstruktur macht dabei das Durcharbeiten des gesamten Modells oder aller Elemente überflüssig. Am Beispiel einer orthogonalen Linienführung wurde im Rahmen dieser Arbeit ein mögliches Vorgehen, das auf der Idee der kachelbasierten Linienführung beruht, vorgestellt. Ein nächster Schritt würde nun die Realisierung anderer Linienführungen (z.B. möglichst direkt oder mit Hilfe von Splines), die ebenfalls auf dem vorgestellten Ansatz beruhen, umfassen. Dadurch wäre es dann auch möglich, Linien, die unterschiedliche Beziehungen in einem Adora-Modell repräsentieren, unterschiedlich zu führen und damit voneinander abzuheben. Da der vorgestellte Ansatz das Problem der Linienführung in zwei Teilaufgaben zerlegt, stellt eine solche Erweiterung kein grosses Problem dar. Ein weiterer Bereich, der mit der Linienführung in engem Zusammenhang steht, jedoch im Rahmen dieser Arbeit nicht vertieft behandelt wurde, betrifft das Problem der Platzierung der Linienbeschriftungen. Da der kachelbasierte Ansatz den Pfad der Linien durch eine Reihe von freien Kacheln repräsentiert, ist der freie Raum, in dem die Linienbeschriftungen platziert werden können, für jede Linie bekannt. Dadurch sollte sich auch ein Algorithmus zur Platzierung der Linienbeschriftungen ohne grosse Mühe realisieren lassen. Literaturverzeichnis [Bea90] Beard, D. V., Walker, J. Q.: Navigational techniques to improve the display of large two-dimensional spaces. Behaviour & Information Technology, Vol. 9, No. 6, p. 451-466, 1990 [Ber98] Berner, S., Joos, S., Glinz, M., Arnold, M.: A visualization concept for hierarchical object models. Proceedings of the 13th IEEE International Conference on Automated Software Engineering (ASE-98), p. 225-228, 1998 [Ber02] Berner, S.: Modellvisualisierung für die Spezifikationssprache ADORA. Dissertation, Universität Zürich, 2002 [Bri98] Bridgeman, S., Tamassia, R.: Difference metrics for interactive orthogonal graph drawing algorithms. Proceedings of the 6th International Symposium on Graph Drawing (GD 98), p. 57-71, 1998 [Dij59] Dijkstra, E. W.: A Note on Two Problems in Connexion with Graphs. Numerical Mathematics, Vol. 1, p. 269-271, 1959 [Dio95] Dion, J., Monier, L. M.: Contour: A Tile-based Gridless Router. Western Research Laboratory Research Report 95/3, Palo Alto, 1995 [Ead84] Eades, P.: A heuristic for graph drawing. Congressus Numerantium, Vol. 42, p. 149-160, 1984 [Ead91] Eades, P., Lai, W., Misue, K., Sugiyama, K.: Preserving the mental map of a diagram. Proceedings of Compugraphics 91, p. 34-43, Sesimbra, Portugal, 1991 [Ead95] Eades, P., Lai, W., Misue, K., Sugiyama K.: Layout adjustment and the mental map. J. Visual Languages Comput. 6, p. 183-210, 1995 [Eig03] Eiglsperger, M.: Automatic Layout of UML Class Diagrams: A Topology-ShapeMetrics Approach. Dissertation, Universität Tübingen, 2003 [Fur86] Furnas, G. W.: Generalized fisheye views. Proceedings of ACM CHI 86 Conference on Human Factors in Computing Systems, Boston, 1986 [Gli00] Glinz, M.: Problems and deficiencies of UML as a requirements specification language. Proceedings of the Tenth International Workshop on Software Specification and Design, p. 11-22, San Diego, 2000 79 LITERATURVERZEICHNIS 80 [Gli02] Glinz, M., Berner, S., Joos, S.: Object-oriented modeling with ADORA. Information Systems 27, p. 425-444, 2002 [Har87] Harel, D.: Statecharts: a visual formalism for complex systems. Sci. Computer Programming 8, p. 231-274, 1987 [Jac75] Jackson, M. A.: Principles of Program Design. Academic Press, New York, 1975 [Joo97] Joos, S., Berner, S., Arnold, M., Glinz, M.: Hierarchische Zerlegung in objektorientierten Sepezifikationsmodellen. Softwaretechnik-Trends 17 (1), p. 29-37, 1997 [Joo99] Joos, S.: ADORA-L - Eine Modellierungssprache zur Spezifikation von SoftwareAnforderungen. Dissertation, Universität Zürich, 1999 [Lee61] Lee, C. Y.: An Algorithm for Path Connection and its Application. IRE Transactions on Electronic Computers, 1961 [Mar02] Marty, M.: Analyse und Erweiterung von Algorithmen zur logischen Navigation in Adora-Modellen. Diplomarbeit, Universität Zürich, 2002 [Mik68] Mikami, K., Tabuchi, K.: A computer program for optimal routing of printed circuit connectors. IFIPS Proceedings, H47, p. 1475-1478, 1968. [Moy98] Moy, J.: OSPF Version 2. Network Working Group, Request for Comments: 2328, April 1998 [Nor96] North, S. C.: Incremental layout with DynaDag. Proceedings of the 3rd International Symposium on Graph Drawing, p. 409-418, 1996 [Omg03] OMG: UML 2.0 Superstructure Specification. OMG document ptc/0308-02. Tech. Rep., Object Management Group, http://www.omg.org/cgibin/doc?ptc/2003-08-02, 2003 [Ous84] Ousterhout, J. K.: Corner Stitching: A Data Structuring Technique for VLSI Layout Tools. IEEE Transactions on Computer-Aided Design CAD-3(1), p. 8789, January 1984 [Ous85] Ousterhout, J., Hamachi, G., Mayo, R., Scott, W., Taylor, G. S.: The Magic VLSI Layout System. IEEE Design and Test of Computers 2(1), p. 19-30, February 1985 [Pet95] Petre, M.: Why looking isn’t always seeing - Readership Skills and Graphical Programming. Communications of the ACM, Vol. 38, No. 6, p. 33-43, June 1995 [Pur98] Purchase, H. C.: The Effects of Graph Layout. Proceedings of the Australian Conference on Computer Human Interaction, p. 80, 1998 [Rum99] Rumbaugh, J., Jacobson, I., Booch, G.: The Unified Modeling Language Reference Manual. Addison-Wesley, Reading, 1999 LITERATURVERZEICHNIS 81 [Sch96] Schaffer, D., et al.: Navigating Hierarchically Clustered Networks through Fisheye and Full-Zoom Methods. ACM Transactions on Computer-HumanInteraction, Vol. 3, No. 2, p. 162-188, 1996 [Sou78] Soukup, J.: Fast maze router. Proceedings of the 15th conference on design automation, p. 100-102, Las Vegas, Nevada, United States, 1978 [Wie01] Wiese, R., Eiglsperger, M., Kaufmann, M.: yFiles: Visualization and Automatic Layout of Graphs. Proceedings of the 9th International Symposium on Graph Drawing (GD 2001), p. 453, 2001 [Wil64] Williams, J. W. J.: Algorithm 232: Heapsort. Communications of the ACM, Vol. 7, No. 6, p. 347-348, 1964 [Xia04] Xia, Y.: A Language Definition Method for Visual Specification Languages. Dissertation, Universität Zürich, 2004