GED ist ein Tool zum Visualisieren und Konstruieren
von Graphen auf einer grafischen Oberfläche.
Es handelt sich hierbei um Graphen aus der Graphentheorie,
einem Teilgebiet der diskreten Mathematik, nicht um
Funktionsgrafen.
Rechts auf dem Bild sieht man einen solchen Graphen.
Der Grapheneditor GED soll das werden, was ich mir während
meiner Diplomarbeit, die im Bereich der Graphentheorie angesiedelt
war, als Tool zur schönen Darstellung von Graphen gewünscht
hätte.
Ich wünsche mir, dass GED Mathematiklehrenden und
-studierenden aus dem Bereich der Graphentheorie
eine Hilfe sein wird, wenn die Entwicklung weiter
fortgeschritten ist.
Ich freue mich über Kommentare, Anregungen und Hinweise, wo
GED eingesetzt wird. Ich bin auch prinzipiell offen für
Vorschläge für weitere Features etc.
Vorgängerversion in Perl:
Es gibt eine Vorgängerversion des GED in Perl, die ich von
2003 bis 2005 entwickelt hatte.
Zum GED in Perl kommt man
auf meiner GED in Perl-Seite.
Da ich später beruflich auf die Sprache Java wechselte und
inzwischen in dieser heimisch bin und nicht mehr in Perl, habe ich
im Jahr 2012 angefangen, den GED nach Java zu übertragen und dort
weiter zu entwickeln. Die beiden Versionen sind nicht völlig
deckungsgleich, die weitere Entwicklung wird aber in die hier
zu sehende Java-Version fließen.
Eigenschaften:
GED bietet die Möglichkeit, Graphen mit der Maus auf einer
grafischen Oberfläche zu erstellen, zu bearbeiten und zu
speichern.
-
Ecken einfügen
-
Kanten zwischen zwei Ecken ziehen (Mehrfachkanten und
Schlingen werden noch nicht unterstützt).
Hierbei wird unterschieden, ob es sich um einen gerichteten
oder einen ungerichteten Graphen handelt (dies kann man
unter dem Menüpunkt
Bearbeiten,
Metadaten des Graphen ändern,
Gerichteter Graph
ändern.
Beim gerichteten Graphen hat man die Wahl zwischen zwei
Arten von Kanten:
- Pfeil hin
- Pfeil in beide Richtungen, die fügt zwei Kanten ein
und stellt nur eine Arbeitserleichterung dar.
Beim ungerichteten Graphen gibt es nur eine einzige Art von
Kanten. Jede Kante verbindet zwei gleichberechtigte Ecken.
In der Oberfläche hat man daher auch zwei beziehungsweise
einen Schalter zum Hinzufügen von Kanten.
-
Ecken auf der Oberfläche verschieben.
-
Ecken mit allen inzidierenden Kanten löschen.
-
Kanten löschen. Klickt man hierbei in einen Bereich mit
mehreren Kanten, öffnet sich ein Dialog in dem man auswählen
kann, welche dieser Kanten man löschen möchte.
Außerdem gibt es noch einen Schalter, um gleich alle Kanten,
die der Mausklick trifft, zu löschen.
-
Ecken "verschmelzen", darunter verstehe ich, dass die Ecke
entfernt wird und alle Nachbarn der Ecke untereinander
durch Kanten verbunden werden.
-
Ecken inspizieren. Dieser Bearbeitungsmodus öffnet den Dialog
mit den Eigenschaften einer Ecke nun per Linksklick, in den
anderen Bearbeitungsmodi ist er per Rechtsklick verfügbar.
-
Speichern des Graphen ins "ged4"- und aus
Kompatibilitätsgründen mit der Perl Version auch ins
"ged3"-Format, wobei dies nicht völlig kompatibel ist.
Unterstützung der alten Dateiformate ged und ged2 ist in
Vorbereitung.
-
Laden von Graphen aus dem ged4- und ged3-Format.
Unterstützung der alten Dateiformate ged und ged2 ist in
Vorbereitung.
-
Speichern eines Graphen unter einem anderen Namen.
-
Einige Kreise und vollständige Graphen können
über das Menü in der Mitte des Zeichenbereiches
eingefügt werden.
Auch den Mittelpunkt kann man einfügen lassen.
-
Man kann optional ein Gitternetz einblenden lassen,
dessen Rasterweite man wählen kann.
-
Optional kann man die Ecken beim Einfügen und
Verschieben auf den Schnittpunkten des Gitters einrasten
lassen.
-
Ecken können über den Eckendialog (erreichbar per
Rechtsklick auf eine Ecke) in Farbe, Radius, Beschriftung
und Gewicht verändert werden.
Dabei lassen sich Positionen und Farben individuell
festlegen.
Der Eckendialog enthält ein Vorschaufenster, das die
Positionierung vereinfacht.
-
Kanten können über den Kantendialog (erreichbar per
eindeutigem Rechtsklick auf eine Kante) in Farbe, Dicke,
Stil, Beschriftung, Gewicht, Kapazität und Fluss verändert
werden.
Dabei lassen sich Positionen und Farben individuell
festlegen.
Der Kantendialog enthält ein Vorschaufenster, das die
Positionierung vereinfacht.
-
Man kann sich die internen Daten in einem Extrafenster
unter dem Menüpunkt
Extra,
Graphen als Textausgabe ansehen
anzeigen lassen.
-
Im Hilfemenü stehen die folgenden Informationen zur Verfügung:
- Über GED, dies zeigt die Version an.
- Hilfe (Inhalt noch leer)
- Anzeige der Todoliste mit gesammelten Ideen für die
Weiterentwicklung in Stichworten
- Anzeige der Historie
-
Historie: Man kann Änderungen am Graphen zurücknehmen
und wiederholen. Dies funktioniert wie gewohnt mit
Strg-Z und Strg-Y oder über die
Buttonleiste.
-
Die aktuelle Ansicht des Graphen im Editore lässt sich als
png-Bild speichern.
Geplant:
Folgende Punkte sind momentan unter anderem für die
Weiterentwicklung eingeplant:
Bekannte Probleme
Offene Punkte GED
- Export:
- Export in ein Vektorformat.
Die Perl-Version konnte den Graphen als Postscript-Datei exportieren, etwas
vergleichbares ist für die Java Implementierung geplant: Export in ein
Vektorgrafikformat.
- Export des Graphen als LaTeX-Datei, dies konnte die Perlversion bereits und muss
nur adaptiert werden.
- Grafische Oberfläche:
- Ecken-Bearbeitungsdialog ggf. auch zweispalttig.
- Kanten-Bearbeitungsdialog: Graph testweise nach rechts unten.
- Canvas:
- Canvasgröße mit Speichern und beim Laden herstellen, wenn das Fenster
zu klein ist. Oder generell?
- Größe der Canvas per Menüauswahl setzbar (für Präsentationen etc.).
- Im Menü Canvasgröße auf individuelles Maß setzen mit kleinem Dialog.
- Canvas mit Scrollbalken darstellen?
- Graph#maximizeGraphRespectingAspectRatio() auch direkt in der Oberfläche
verwenden, neues Icon!
-
Ev. Graphen an die Größe der Canvas anpassen im Ecken- und Kanten-Dialog. Einmal
nach dem Pack, aber auch bei Änderungen an der Größe. Ev. per Listener?
Muss aber auch nicht, auch so macht es eine gute Figur.
- Eigenschaften von mehreren Kanten mit dem Kantenauswahlmenü ändern:
Erst Kanten auswählen, dann Eigenschaften setzen.
-
Menüs:
- Alle Ecken Radius ändern - macht das Sinn? Auf Default und Radius
ändern?
- Alle Ecken Farbe ändern - macht das Sinn? Auf Default und Farbe
ändern?
- Laden GED 1 und 2
- Ecke in Kante hinein setzen (neue Ecke, zwei neue Kanten dazu mit,
gleichen Eigenschaften, alte Kante weg).
- Liniengraphen bilden
- Rahmen aufziehen und alle Ecken darin löschen / bearbeiten.
- Auswahl von Ecken mit gestrichelten Kreisen darum darstellen in
Radius * 1.25 Abstand oder so?
- Ecke ins Gitter einrasten ins Eckenmenü (mit snap in Grid kann man sie
einfach verschieben, aber kann ich trotzdem einbauen).
- Möglichkeit, die Beschriftung einer Ecke mit der Maus zu versetzen.
- Label, Gewicht, Kapazität und Fluss per Maus bewegbar machen.
- Bei Rechtsklick in freie Fläche dort Submenü zum Erzeugen von Graphen
mit diesem Mittelpunkt anbieten: Kreise, Kn, ... mit Radius um diesen
Punkt wählbar. Genau wie im Menü für den Mittelpunkt der Bildfläche.
- Bei Alle Ecken auf Gitter legen hinterher testen, ob zwei Ekcen die
gleichen Koordinaten haben und wenn ja, den Benutzer warnen.
- Graphen im Uhrzeigersinn und entgegengesetzt um den Mittelpunkt drehen.
Vielleicht auch in festen Winkeln. Oder eingebbar.
- Funktionalität, die Sinn macht aus dem GraphPanel in Graph verlegen,
analog zu vertexIntersctsWithOtherVertex()
- Schneller Zugriff auf die letzten 10 gespeicherten Dateien über das Menü.
Dazu ist dann allerdings ein SessionManager nötig, der sich dies über die
verschiedenen Starts von GED merkt.
- Unter der Haube:
- Logging aller Aktionen einbauen, das ist in der Logik eingebaut, da passiert
aber nicht viel! GraphPanel etc. auch loggen...
- Geändertmarker richtig anzeigen (setChange, speichern, laden...)
- Noch fehlendes:
- ged3-Form, alt Loader weiter refakturieren!
- Den Graphen in seinen Liniengraphen (oder Kantengraphen) wandeln lassen, dies
konnte die Perlversion bereits und muss nur adaptiert werden.
- Testabdeckung der Graphenklassen, also alles unterhalb von
de.duehl.math.graph.ged.graph
mit Ausnahme von
de.duehl.math.graph.ged.graph.io
.
- Laden und Speichern .ged einbauen
- Laden und Speichern .ged2 einbauen
- Laden nach automatischer Endung Format erkennen.
- Fehlende Kanteneigenschaften einfügen (welche wären das?).
- Geplante Refakturierungen:
- Generelles Refactoring, alle Klassen sichten.
- de.duehl.swing.ui.dialogs.ErrorDialog von ModalDialogBase erben lassen!
- Color aus Basics nutzen?
- Alle in Klassen enthaltenen Enums in eigene Klassen extrahieren!
- Funktionalität aus der Logik in den Graphen verlegbar?
- Alle Sourcedateien auf TODO absuchen.
- Grundlegende Überlegungen:
- Graphen im Format des Dumps unter dem Menüpunkt Extra, Graphen als Textausgabe
ansehen auch einlesen.
-
Eventuell könnte der Graph als solcher oder auch zu Teilen von allgemeineren
Klassen erben. Dann hätte man
GedVertex extends Vertex
und dergleichen.
Problem bei der jetzigen Darstellung, bei List<GedVertex> ist das nicht
kompatibel zu List<Vertex>.
- Line durch neue PixelLine ersetzen. die Pixelklassen nach Swing...
Allerdings gibt es da schon eine...
- Decorator-Pattern für Graphen verwenden... ?
Dann ließe er sich elegant für alle Einsatzzwecke abwandeln und man könnte ihn
auch direkt im Algorithmus verwenden.
Allerdings hapert es bei Listen von Klassen...
- Layer? man könnte dann rechts verwalten welche angezeigt werden sollen
und hätte für jeden Layer einen Graphen.
- Zeichnen von Mehrfachkanten als Kreisbögen. Per Option in den Metadaten des
Graphen.
Im GraphPainter bei der Kantendarstellung dann erst alle Kanten
sammeln, die zwischen je zwei Ecken verlaufen, Radien und so selbst bestimmen.
Siehe ShortTestCodes.graphicalUserInterface.DrawArc.
Achtung, dann muss natürlich auch sowas wie Rechtsklick angepasst werden.
- Schlingen erlauben? Darstellung an Eckenradius anpassen und ermitteln,
wo der größte freie Winkel durch die Kanten an dieser Ecke sind und
diesen mit der oder den Schlingen füllen.
Achtung, dann muss natürlich auch sowas wie Rechtsklick angepasst
werden.
- Wenn alles andere fertig ist, kann über Animation nachgedacht werden.
Das läuft dann als eigene Historie, in die bestimmt Graphen gespeichert werden.
Eine Animationsverwaltung mit kleinen Bildern der Graphen wie im Perlprogramm
sollte dann
folgen.
So ähnlich wie der EdgeDeleteDialog.
- Generelle Behandlung von Algorithmen überlegen, Schnittstelle Algorithm?
- Beispielagorithmus schreiben, der zu jedem Zwischenstand einen Graphen
speichert. Ggf. sogar als Animation.
DFS oder BFS oder so.
- Farbalgorithmen aus meiner Diplomarbeit von C++ nach Java übertragen
und auf Graphen anwendbar machen.
- Test auf plättbaren Graphen einbauen. (Muss K5 oder K3,3 als
Subgraphen finden. Ob es da schnelle Algorithmen gibt?)
- GED als Android-App?
- Dokumentation:
- Hilfeseiten mit Texten und Bildern erstellen, die im Programm mit F1 angezeigt
werden kann, sobald GED weiter ist, so dass diese nicht dauernd
überarbeitet werden müssen.
Buttons im Text abbilden.
- Nach den ganzen Beispielgraphen auf der GED-Seite schauen.
Wenn ich die nicht mehr habe, nachbauen!
- Von Zeit zu Zeit Webseite und diese Texte synchron halten.
Versionshistorie GED
Version 0.2.33 vom 03.07.2019
- Im Eckendialog werden die Graphen nun zentriert um die Ecke um die es geht
dargestellt werden. Das klappte vorher noch nicht so, dass die bearbeitete Ecke
dann im Zentrum zu sehen war.
- Behebung eines Fehlers, nach dem bestimmte Farben und Abstände beim laden von Ecke zu
Ecke übertragen wurden, da diese sich fälschlicher Weise das gleiche Objekt teilten.
Version 0.2.32 vom 02.07.2019
-
Weitere Modernisierungen an den Oberflächenklassen:
- SizeChooser
- Auf den ShowTextDialog kann nun ganz verzichtet werden, statt dessen
wird der EditorDialog aus de.duehl.swing verwendet.
- Fehlerbehandlung verbessert.
- Es wird nun auf die neue GED-Seite in Java verwiesen.
- Vorhaben in todo.html aufgeräumt und sortiert.
Version 0.2.31 vom 19.06.2019
-
Vorbereitung für den Aufbau von Animationen in Algorithmen.
Version 0.2.30 vom 17.06.2019
-
Beim Speichern eines neuen Graphen wird nun auch das richtige Verzeichnis ausgewählt
und nicht das eine Stufe darüber.
Version 0.2.29 vom 17.06.2019
-
Ecken haben nun einen sinnvollen Default-Abstand für Beschriftung und Gewicht,
vorher war dieser (0, 0).
-
Überarbeitung Laden und Speichern im ged4-Format. Nun werden nur alle
nicht-default-Werte abgespeichert.
Version 0.2.28 vom 14.06.2019
-
Einbau der Option, dass der Graph auch ungerichtet sein kann.
- Anpassung des Graphen und des Speicherns und Ladens.
- Eintrag im Menü Bearbeiten / Metadaten.
- Anpassung der Darstellung für ungerichtete Graphen.
- Anpassung der Einfüge-Modi in der Gui und im GraphPanel.
-
Nun wird auch der alte Name bei Speichern unter im Dialog zur Auswahl des neuen Namens
angezeigt.
Version 0.2.27 vom 14.06.2019
-
Umstellung auf Liste von Ecken im Graphen statt der komplizierteren Verwaltung mit
Adjazenzlisten. Diese sind zwar in Graphenalgorithmen die zu bevorzugende
Implementation eines Graphen, weil sie deutliche Geschwindigkeitsvorteile bieten,
hier geht es ja aber nur um die Darstellung und wenn wir später Ergebnisse aus
Algrithmen als Ged-Graphen darstellen wollen, reicht ein einfacher Konverter, der uns
die passenden Graphen erzeugt.
Version 0.2.26 vom 14.06.2019
-
Gesicherte letzte Version mit Adjazenzlisten.
Version 0.2.25 vom 27.05.2019
-
Nicht nur beim Speichern unter, auch beim normalen Speichern kam die Frage nach dem Namen
der Datei und dieser wurde auch nicht in der Titelzeile des Fensters angezeigt,. Beides ist
nun behoben.
Version 0.2.24 vom 27.05.2019
- Beheben eniger Bugs rund um den Ecken-Bearbeitungsdialog..
Version 0.2.23 vom 27.05.2019
- Im Eckendialog werden nun alle Informationen gleich im angezeigten Graphen aktualisiert.
Der Teilgraph wird nun hübscher zentriert dargestellt.
- Im Kantendialog werden nun alle Informationen gleich im angezeigten Graphen aktualisiert.
Version 0.2.22 vom 27.05.2019
- Im Eckendialog wird nun auch ein Teilgraph angezeigt, leider ebenfalls noch nicht
automatisch aktualisiert.
Version 0.2.21 vom 27.05.2019
- Im Kantendialog werden nun die Abstände wieder richtig initialisiert, so dass sich der
Dialog ordnungsgemäß beenden lässt.
- Im Kantendialog kann man nun auch wieder nicht-numerische Beeschriftungen eingeben.
- Das Löschen der Kante aus dem Kantendialog hinterlegt nun auch eine Änderung in der
Historie, so dass es zurückgenommen werden kann.
- Im Kantendialog werden nun die Default-Farben für die Beschriftung, das Gewicht, die
Kapazität und den Fluss richtig gesetzt, wenn der Benutzer die Farbe der Ecke ändert.
- Im Ecken- und Kantendialog werden nun die Default-Farben für die Beschriftung, das Gewicht,
die Kapazität und den Fluss richtig gesetzt, wenn der Benutzer die Farbe der Ecke ändert
und den Dialog erneut öffnet.
-
Weitere Modernisierungen an der Oberflächenklassen:
- EdgeDialog - Ausplagerung der Eingabeteile für die Dicke in eigene Klassen,
die sich zur Wahl des Radius im Eckendialog wiederverwenden lässt. Außerdem wurde
der EdgeStyleChooser ausgelagert, einfach nur um Dinge besser zu trennen.
- VertexDialog
Version 0.2.20 vom 24.05.2019
- Todos aus Kommentaren in GedVersion in todo.html übernommen.
-
Weitere Modernisierungen an der Oberflächenklassen:
Neue Klassen und Interfaces
- ColorSetter
- DefaultOrOwnColorChooser
- SwitchableValueDistanceAndColorChooser
- ValueDistanceAndColorChooser
- Neue Klasse SubgraphCreator und Verwendnung dieser im
EdgeDeleteDialog zur Anzeige der Kante.
Version 0.2.19 vom 22.05.2019
-
Ich habe damit begonnen, die Oberflächenklassen zu modernisieren.
-
Entfernung der individuellen Vordergrund- und Hintergrundfarbe.
Der GED soll sich an das Betriebsssytem anpassen.
- EdgeDeleteDialog
- CreateGui
- GedGui
- Gui
- MenuCreation komplette Überarbeitung inklusive Aufteilung
- GedActionListener entfernt
Neue Klassen und Interfaces
- ModusButtonMouseListener
- SubGraphToggleButton
- Änderungen, TODO und Hilfe mit eingebaut, wenn auch die Hilfe und TODO noch leer
sind.
Version 0.2.18 vom 21.05.2019
-
Verwendung von Konstanten beim Laden und Speichern im ged4-Format.
Version 0.2.17 vom 21.05.2019
-
Refakturierung des Ladens des ged3-Formates im Ged3FormatLoader.
-
Reparatur des Speicherns des ged3-Formates im Ged3FormatSaver.
Noch ist keine hundertprozentige Kompatibilität zur Perlversion hergestellt.
Version 0.2.16 vom 21.05.2019
-
Auslagerung des Ladens aus Graph in den Formaten .ged, .ged2 und .ged4, nachdem zuvor
bereits .ged3 ausgelagert wurde.
-
Auslagerung des Speichers aus Graph in den Formaten .ged, .ged2, .ged3 und .ged4.
-
Einzeichnen des Hintergrundbildes funktioniert, es stimmten nur auf meinem neuen Rechner
die Pfade in den gespeicherten Dateien nicht mehr.
-
Refakturierung des Ladens des ged3-Formates im Ged3FormatLoader.
-
Umstellung einiger Werte wie Abstände des Grids und Koordinaten von
Ecken von double auf int.
-
Berücksichtigigung der dicksten Ecke beim Maximieren von Graphen. Beschriftungen können
immer noch außerhalb des Sichtfelds liegen, aber das ist schonmal ein fortschritt.