Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Problem Graphen erstellen unter delphi 7 (https://www.delphipraxis.net/68148-problem-graphen-erstellen-unter-delphi-7-a.html)

pagan1900 25. Apr 2006 13:47


Problem Graphen erstellen unter delphi 7
 
Ich möchte für ein Lernprogramm für den Dijkstra algorithmus den graphen dastellen und habe nun paar probleme
1. wie verhindere ich das der graph den ich durch canvas erstelle "gelöscht" werden, wenn man das
fenster verkleinert?
2. ich habe so weit, dass er zur laufzeit die "knoten zeichnet" und beschriftet nun hab ich beim
zeichnenen der "pfeile" das bei line to bzw von move to, dass die
linie im zentrum des knotens" startet bzw enden und es soll ja erst am rand der ellipsen
starten/enden. Mann muss so denke ich die "überschuessigen" pixel abziehen. Aber wie ambesten?
Nur diese implementierung sollte so sein, dass sie in jeder richtung funktioniert, da die knoten
ja "überall" auf der zeichenfläche eingetragen werden können, sprich die knoten werden vom
benutzer eingetragen.
3. wie kann man die "pfeile" mit bewertungen beschriften?

wundert euch nicht über den quellcode ohne dijkstra, wollte erstmal das ein graph erstellt werden kann unter berücksichtigung der fragen 1->3, da ich bisher nie graphen unter delphi zeichnen muste

vielen Dank für eure hile im vorraus :=)
der delphi code ausschnitt
Delphi-Quellcode:


procedure TForm1.eingabeClick(Sender: TObject);
var x1,y1, x2,y2 : integer;
begin
 anfknoten[j]:=strtoint(edit1.text);   //einlesen des Anfangsknoten
 endknoten[j]:=strtoint(edit2.text);   //einlesen des endknoten
 bewertung[j]:=strtoint(edit3.text);   //einlesen des der bewertung
   with paintbox1.Canvas do
       begin
      x1 := x_ort[anfknoten[j]];
      y1 := y_ort[anfknoten[j]];
      x2 := x_ort[endknoten[j]];
      y2 := y_ort[endknoten[j]];
         canvas.moveto(x1,y1);
         canvas.LineTo(x2,y2);
       end;
     edit1.Clear;                        //nach eingabe editfelder leeren
     edit2.Clear;                        //
     edit3.Clear;                        //
     j:=j+1;                 // erhöhe j um beim nächsten betätigen in eine höhere benen des arrays zu kommen
end;

procedure TForm1.knotenerschaffen(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
Var nummer:string;
    wert:integer;
begin nummer:=inttostr(n);
  if n<=8 then
      begin
        with label1.Canvas do
         begin
           x_ort[n]:= x; // Speichern der X/Y koordinaten der (maximal) 8 knoten
           y_ort[n]:= y; //

           canvas.Ellipse(x-15,y-15,x+15,y+15);
           Canvas.Textout(x-3,y-6,nummer);
           n:=n+1;
        end;
      end;
end;

fkerber 25. Apr 2006 14:22

Re: Problem Graphen erstellen unter delphi 7
 
Hi!

Mal zu Frage 1:
Zeichne am besten auf ein Bitmap im Speicher und lasse dieses dann bei Bedarf auf den canvas deines Labels zeichnen (Stichwort BitBlt) - sollte das ganze zusätzlich schneller machen.

Zweiter Tipp:
Warum zeichnest du auf ein Label? Nimm doch vielleicht eher ne Paintbox?!


Ciao Frederic

pagan1900 25. Apr 2006 14:46

Re: Problem Graphen erstellen unter delphi 7
 
wie löst ich nun am bestendas "problem" des zulangezeichnens?
Sprich das die linie am knoten rand endet und nicht im zentrum des knotens?

fkerber 25. Apr 2006 16:41

Re: Problem Graphen erstellen unter delphi 7
 
Hi!

Wenn du doch den Mittelpunkt des Knotens kennst und seine Ausdehnung, dann weißt du doch, wo sein Rand ist, oder?


Ciao Frederic

pagan1900 25. Apr 2006 18:57

Re: Problem Graphen erstellen unter delphi 7
 
Ja ich weiss die daten, muste sie ja zum zeichnen des kreises verwenden
(x-15,y-15,x+15,y+15)
nur wie ziehe ich die pixelanzahl von der zu zeichnenden linie ab ?

pagan1900 25. Apr 2006 20:16

Problem mit canvas. ellipse und moveto/lineto
 
Hi ich habe ein probleme

wie ziehe ich den radius einer ellipse von lineto ab?
Ich möchte folendes:

Die ellipse stellt einen Knoten eines graphen da und line to den "pfeil".
Nun möchte ich das die linie erst ab dem ellipsenrand gezeichnet wird (moveto), also
moveto-elipsenradius und beim zielknoten lineto-ellipsenradius.

Bisher waren meine bemühungen erfolglos, die linie startet innerhalb des ellipsen zentrum und endet im (zielkonten) ellipsenzentrum

wie kann ich dieses verhindern?

und wie kann ich es bewerkstelligen, dass die gewichtung des "pfeils" in die mitte der
gezeichneten linie erscheint ?

danke für eure hilfe!

fkerber 26. Apr 2006 06:46

Re: Problem Graphen erstellen unter delphi 7
 
HI!

Du gibst doch bei LineTo und MoveTo Koordinaten an, oder? Dann mach doch da die 15 pixel dazu bzw. zieh sie ab....


Ciao Frederic

pagan1900 26. Apr 2006 09:31

Re: Problem Graphen erstellen unter delphi 7
 
funktioniert leider nicht!
die linie verschiebt sich dann ganz eigenartig!

und zum anderen werden die knoten erst vom benutzer auf die zeichenfläche gedroppt
und dann im zuge des dijkstra algorithmus mit"pfeilen"verbunden
Delphi-Quellcode:

procedure TForm1.eingabeClick(Sender: TObject);
var x1,y1, x2,y2 : integer;
begin
 anfknoten[j]:=strtoint(edit1.text);   //einlesen des Anfangsknoten
 endknoten[j]:=strtoint(edit2.text);   //einlesen des endknoten
 bewertung[j]:=strtoint(edit3.text);   //einlesen des der bewertung
   with paintbox1.Canvas do
       begin
      x1 := (x_ort[anfknoten[j]]);
      y1 := (y_ort[anfknoten[j]]);
      x2 := (x_ort[endknoten[j]]);
      y2 := (y_ort[endknoten[j]]);
         canvas.moveto(x1,y1);
         canvas.LineTo(x2,y2);
       end;
     edit1.Clear;                        //nach eingabe editfelder leeren
     edit2.Clear;                        //
     edit3.Clear;                        //
     j:=j+1;                 // erhöhe j um beim nächsten betätigen in eine höhere benen des arrays zu kommen
end;
seit bitte nachsichtig, da ich in der verwendung der grafikerstellung unter delphi ein neuling
bin und deshalb währe ein beispiel quellcode super wie das gemeint ist !

Danke für eure mühen

Klaus01 26. Apr 2006 09:38

Re: Problem Graphen erstellen unter delphi 7
 
du kannst ja auch nicht von den Koordinaten canvas.LineTo(x2-15,y2-15);
15 pixel abziehen.
Du musst Dir den Schnittpunkt der Linie mit dem Kreis berechnen und diesen
Schnittpunkt als Enpunkt Deiner Linie nehmen.
Zur Berechnung mußt Du mal in Deine Schulzeit zurückgehen und Dir die
Winkelfunktionen anschauen.

Grüße
Klaus


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:00 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