![]() |
Delphi-Version: XE2
Dijkstra mittels Image Darstellen und Ecken + Kanten verknüpfen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo!
ich bin gerade dabei ein kleines Programm zu schreiben womit ich schon relativ weit fortgeschritten bin (anbei Screenshot), allerdings fällt mir jetzt erst auf, dass ich an einer Sache nicht gedacht habe und jetzt damit Probleme habe... Das Problem liegt viel weniger darin den Algorithmus zu implementieren (da ich noch gar nicht an der Stelle bin) sondern, dass ich das ganze graphisch darstellen möchte. ZIEL: Ich möchte nur dann eine Kante hinzufügen, wenn der erste Klick (setzt die MoveTo Koordinate in den Knoten) IN dem Knoten erfolgt. Sonst passiert nichts. Nunja, daraus folgt ja, dass irgendwo alle Koordinaten der Knoten gespeichert werden müssen --> Deswegen habe ich mir ein dynamisches Array gebaut mit 4 Komponenten (x1, x2, y1, y2). Nun bin ich dabei gewesen mir eine Funktion zu schreiben, welche prüft ob die neuen Koordinaten (von MouseDown {x,y} , also von der neuen Kante) innerhalb von den Koordinaten liegen, die im Array gespeichert sind. Und hier ist das Problem. Ich habe ja mehrere Knoten im Array gespeichert und somit auch mehrere Koordinaten. Gibt es eine geschickte Methode im Array diese Koordinaten zu suchen die am nächsten den Koordinaten der Ecke zusammenpassen? Ich hoffe ich hab mein Problem einigermaßen verständlich geschildert, bei Fragen sonst fragt! Danke! |
AW: Dijkstra mittels Image Darstellen und Ecken + Kanten verknüpfen
1. Hat Dijkstra nur einen Algorithmus entwickelt?
2. Du verwendest wohl eine geklautes Windows 7. |
AW: Dijkstra mittels Image Darstellen und Ecken + Kanten verknüpfen
Dijkstra ... Algorithmus ... Ich denk du suchst was für die Koordinatensuche/-Koordinatenverwaltung und nicht für den Algo? :gruebel:
Nein, da gibt's im Delphi natürlich nichts fertiges, für sowas spezielles. Aber du wirst doch wohl selber dein Array / deine Liste durchsuchen können, dir jeweils die Entfernung ausrechnen und dir dabei das Nächste merken können? |
AW: Dijkstra mittels Image Darstellen und Ecken + Kanten verknüpfen
Zitat:
2. Nein, ich verwende Parallels und habe eine lizenzisierte Studentenversion von der Uni aus kostenlos bekommen, allerdings noch nicht aktiviert. 3. Was bringt mir jetzt dein Beitrag in Bezug auf das Problem? Zitat:
Zitat:
Zitat:
Jetzt hatte ich mir eine Funktion schreiben wollen, ob die neuen Koordinaten IN einem Kreis liegen. Also müssen doch: 1. x_neu, y_neu <= x2_alt, y2_alt 2. x_neu, y_neu >= x2_alt, y2_alt sein oder habe ich einen Denkfehler? |
AW: Dijkstra mittels Image Darstellen und Ecken + Kanten verknüpfen
Das kommt jetzt drauf an, wie du deine Knoten gespeichert hast.
Wenn du sie als Mittelpunktskoordinaten und Radius speicherst, kannst du ja einfach den Abstand des Klicks zum Mittelpunkt errechnen und mit dem Radius vergleichen. Hast du Sie als 4 Koordinaten gepeichert (x1,y1, x2, y2) musst du dir erst den Mittelpunkt und den Radious ausrechnen. Btw.: Mit den vier Koordinaten speicherst du eine allg. Ellipse. Falls alle Knoten Kreise sind, ist das ein bisschen unschön... Ach übrigens kannst du ja eine Klasse für die Knoten machen und eine für die Kanten. Und dann jeder Klasse Koordinaten spendieren und eine Zeichenmethode. Und vll. auch eine Hittest-Methode oder so. |
AW: Dijkstra mittels Image Darstellen und Ecken + Kanten verknüpfen
Zitat:
Es gibt ja gewisse Kreisfunktionen, womit man aus X und Y den Radius/Abstand berechnet ... und du willst ja die Abstände vergleichen. Hier (
Delphi-Quellcode:
) wird ja der Compiler meckern, denn wie soll er das vergleichen?
x_neu, y_neu <= x2_alt, y2_alt
Aber wenn du nur je einen Abstandswert hast (
Delphi-Quellcode:
), dann würde es gehn.
abstand_neu <= abstand_alt
Wobei jfheins auch ein paar schöne Ansätze genannt hat. |
AW: Dijkstra mittels Image Darstellen und Ecken + Kanten verknüpfen
Ertsmal danke für euere Antworten! :thumb:
Zitat:
Delphi-Quellcode:
Mit sowas in der Art würde ich in Kauf nehmen, dass der Benutzer nicht ganz genau im Kreis klicken muss um die Funktion auf True zu setzen, allerdings wäre das meine, zugegebener Maßen nicht schönste Idee. :|
checkIfConnected(x:integer; y: integer):boolean;
begin for i:= 0 to xxx( Anzahl der Kreise) do begin checkIfConnected:= (x >= Coordinates[i].x1_coor) AND (y >= Coordinates[i].y1_coor) AND (x<= Coordinates[i].x2_coor) AND (y<= Coordinates[i].y2_coor) // Coordinates[i] ist mein dynamisches Array für die Koordinaten end; end; Zitat:
Zitat:
Delphi-Quellcode:
CCircle=25;
Image.Canvas.Ellipse(x-CCircle,y-CCircle,x+CCircle,y+CCircle);
Delphi-Quellcode:
Ich kenn leider keine andere Methode einen Kreis in einem Image zu zeichnen :( Gibt es da eine Kreisfunktion?
Btw.: Mit den vier Koordinaten speicherst du eine allg. Ellipse. Falls alle Knoten Kreise sind, ist das ein bisschen unschön...
Zitat:
EDIT: Es funktioniert jetzt, danke für die Mithilfe. Hier der Code:
Delphi-Quellcode:
function checkIfConnected(x,y:integer):boolean;
begin index:=0; while (index<array_length) and (Result=false) do begin Result:= (x >= Coordinates[index].x1_coor) AND (y >= Coordinates[index].y1_coor) AND (x<= Coordinates[index].x2_coor) AND (y<= Coordinates[index].y2_coor); inc(index); end; end; |
AW: Dijkstra mittels Image Darstellen und Ecken + Kanten verknüpfen
Zitat:
Und, das Du dein Windows mal registrieren könntest. |
AW: Dijkstra mittels Image Darstellen und Ecken + Kanten verknüpfen
Zitat:
Und du mußt Result auch noch initialisieren, denn so ist er quasi zu Anfang mit einem Zufallswert belegt.
Delphi-Quellcode:
function checkIfConnected(x,y:integer):boolean;
var index: Integer; begin Result:=False; index:=0; while (index<array_length) and (Result=false) do begin Result:= (x >= Coordinates[index].x1_coor) AND (y >= Coordinates[index].y1_coor) AND (x<= Coordinates[index].x2_coor) AND (y<= Coordinates[index].y2_coor); inc(index); end; end;
Delphi-Quellcode:
oder gleich ein paar neuere Features nutzen, also wenn du die Koordinaten auch gleich/zusätzlich als
function checkIfConnected(x,y:integer):boolean;
var index: Integer; begin Result:=False; for index := 0 to array_length - 1 do begin if (x >= Coordinates[index].x1_coor) AND (y >= Coordinates[index].y1_coor) AND (x<= Coordinates[index].x2_coor) AND (y<= Coordinates[index].y2_coor) then begin Result := True; Break; end; end; end;
Delphi-Quellcode:
anbietest.
coor: TRect
Delphi-Quellcode:
prozedual (alt) / oop-iger (neu): :
function checkIfConnected(x, y: Integer): Boolean;
var i: Integer; begin for i := array_length - 1 downto 0 do if Coordinates[i].coor.Contains(Point(x, y)) then Exit(True); Result := False; end; function checkIfConnected(p: TPoint): Boolean; var i: Integer; begin for i := array_length - 1 downto 0 do if Coordinates[i].coor.Contains(p) then Exit(True); Result := False; end; ![]() ![]() ![]() Nja, und daß "Listen" auch einige Vorteile haben, gegenüber "einfachen" Arrays, braucht man ja nicht mehr zu erwähnen. |
AW: Dijkstra mittels Image Darstellen und Ecken + Kanten verknüpfen
Zitat:
Delphi-Quellcode:
Ich sehe da nur die Mittelpunkt-Koordinaten und den Radius (und der ist ja konstant).
Image.Canvas.Ellipse(x-CCircle,y-CCircle,x+CCircle,y+CCircle);
Wozu speicherst du also die Eckkoordinaten der Ellipse? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:48 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-2025 by Thomas Breitkreuz