![]() |
Graphzeichnen
Hallo.
Bevor Mißverständnisse auftreten: ich suche keine Komponenten zum zeichnen oder ähnliches, sondern: ![]() Im Grunde genommen habe ich auch gefunden, was ich suche: ![]() "The Zest project also contains a graph layout package which can be used independently. [...] The Zest graph layout package provides the following layout algorithms: Spring Layout Algorithm Tree Layout Algorithm Radial Layout Algorithm Grid Layout Algorithm" Nun stellt sich mir die Frage, ob hier jemand den Code (nur die Layout Algorithmen!) bereits nach Delphi portiert hat und den Code zur Verfügung stellen kann, darf und möchte. Anderenfalls werde ich mich demnächst selber dran machen, darf ihn dann aber leider nicht weitergeben :? Grüße, sahimba |
AW: Graphzeichnen
Zitat:
Zest ist Java entwickelt und kräftig mit Eclipse verbandelt. Für Programmiersprachen die nicht auf der Java VM aufsetzen gibt es keine Möglichkeit die Bibliothek zu benützen. Eine Umsetzung nach Delphi würde Monate dauern. Alternativvorschlag: Schau dir mal ![]() Das ist eine sehr leistungsfähige Javascript (hax nix mit Java zu tun) Bibliothek die in jedem modernen Browser läuft. Schau mal die ![]() Du könntest aus Delphi heraus HTML + Javascript Code erzeugen und als Datei abspeichern. Diese Datei kann man z.B. per EMail verschicken und jeder kann sie anschauen. Es sind auch interaktive Grafiken möglich. Es ist bestimmt nicht so einfach, den richtigen Code aus Delphi zu erzeugen, aber wenn's funktioniert ist das Ergebnis hervorragend. Vielleicht habe ich mit meiner Idee einige Leute hier angefixed, die Lust haben dir zu helfen. |
AW: Graphzeichnen
Zitat:
Die anderen Links schaue ich mir dennoch an, Danke erst einmal. |
AW: Graphzeichnen
Zitat:
Das Ergebnis würde einen auch größeren Aufwand der Integration rechtfertigen. |
AW: Graphzeichnen
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe sowas auch mal in C# programmiert, das geht eigentlich ohne großen Aufwand straightforward.
In den Kanten hatte ich eine "Step" Methode, die die angrenzenden Knoten versetzt hat (.Delta) je nach "Federkraft":
Code:
In den Knoten dann das quadratische Abstoßungsgesetz:
// Federkraft wirkt auf die Knoten
internal void Step(float factor, float length) { var dx = TargetNode.Position.X - SourceNode.Position.X; var dy = TargetNode.Position.Y - SourceNode.Position.Y; Vector distance = new Vector(dx, dy); double force = (distance.Length - length * Cost) * factor; distance.Normalize(); SourceNode.Delta += distance * force; TargetNode.Delta -= distance * force; }
Code:
Und wenn du bis hierher gleesen hast: Jetzt kommt der interessante Teil. Nach meine damaligen Einschätzung hat sich der Graph nämlich noch sehr oft "verhakt" und ist quasi in lokalen Energieminima stecken geblieben. Knoten die eigentlich nach außen gelegt werden konnten, kamen nicht über die Barriere hinaus, die von dern anderen Knoten gebildet wurde. Deshalb habe ich eine angepasste Version entwickelt, die zuerst die Knotenabstoßungen übermächtig macht und den Graphen demzufolge komplett "aufbläht". Die Knoten können sich dann passend auseinanderfriemeln. Die Kräfte lassen dann mit einer Parabelfunktion stark nach und werden schließlich gleich den eingestellten Kräften. Schaut dann so aus:
// Abstoßung der Knoten nach dem Coulomb-Gesetz
internal void Step(Node other, float factor) { double dx = other.Position.X - Position.X; double dy = other.Position.Y - Position.Y; if (dx == 0 && dy == 0) // Wenn 2 Knoten exakt die gleiche Position haben kommt es sonst zu einem Fehler dx = 1; Vector distance = new Vector(dx, dy); double force = factor / distance.LengthSquared; // F = k * r^-2 distance.Normalize(); Delta -= distance * force; other.Delta += distance * force; }
Code:
Vielleicht kannst du damit ja etwas anfangen :-)
public void AutoLayout(float NodeForcefactor, float EdgeForgeFactor, float EdgeRelaxedLength)
{ const int loops = 800; // Layout-Iterationen const int nf_elev = 300; // Erhöhungsfaktor für die Knotenkräfte am Anfang for (int i = 0; i < loops; i++) { foreach (var edge in Edges) { edge.Step(EdgeForgeFactor, EdgeRelaxedLength); // Federkräfte auf die Knoten wirken lassen } // Die Knoten abstoßen lassen for (int a = 0; a < Nodes.Count(); a++) { for (int b = a + 1; b < Nodes.Count(); b++) { float x = 1 - (float)i / loops; Nodes[a].Step(Nodes[b], NodeForcefactor * (1 + x * x * nf_elev)); } } foreach (var node in Nodes) { node.Layout(); // Anhand der Vektorsumme der Kräfte jeden Knoten passend verschieben. } } } Die Ergebnisse des Auto-Layouts kannst du im Anhang betrachten. Du kannst ein paar Sachen im Kontextmenü machen wenn du auf Knoten/Kanten klickst. Mit Bearbeiten kannst du rechts auch die Kosten verändern, falls du nicht alle Kanten gleich lang haben möchtest.... |
AW: Graphzeichnen
Zitat:
Grüße, S. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz