Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi hab problem wenn programm die lösung zeichnen soll (https://www.delphipraxis.net/70468-hab-problem-wenn-programm-die-loesung-zeichnen-soll.html)

pagan1900 30. Mai 2006 20:29


hab problem wenn programm die lösung zeichnen soll
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi!
So langsam kommt in mein lernprogramm schwung!

mein problem ist das das Programm bei der korekten auflösung (wenn der benutzer die lösung sehen will) irgendwie zuviele pfeile zeichnet!

Ich hoffe ihr koennt mir a helfen!
Code:

(*----Die--Pfeildarstellung---------------------------------------------------*)
 procedure zeichnePfeil(Canvas: TCanvas; PX1,PY1,PX2,PY2:Extended);
  const
  H = 30;   // Höhe an den Seiten
  C = H*6/7; // Höhe am Rumpf (ein wenig kürzer)
  W = H*2/3; // Breite (Pfeil ist ein bisschen höher als breit)
 Var
  L, PX, PY, X, Y : Extended;
 begin
    X := PX2-PX1;
    Y := PY2-PY1;
    L := sqrt(X*X+Y*Y);
   PX := X*(1-H/L);
   PY := Y*(1-H/L);
   with Canvas do
    begin
      MoveTo(Round(PX1),Round(PY1)); LineTo(Round(PX2),Round(PY2)); //linie zeichnen für den Pfeil
      Brush.Style := bsSolid;
      Polygon([Point(Round(PX2), Round(PY2)),
           Point(Round(PX1+PX-Y/L*W/2), Round(PY1+PY+X/L*W/2)),
           Point(Trunc(PX1+X-X/L*C), Trunc(PY1+Y-Y/L*C)),
           Point(Round(PX1+PX+Y/L*W/2), round(PY1+PY-X/L*W/2))]);
    end;
 end;

 procedure ZeichneVerbindungspfeil(Canvas: TCanvas; X1, Y1, X2, Y2, R, Offset:Extended);
  var
  EX, EY, L, P: Extended;
  begin
    EX := X2-X1;
    EY := Y2-Y1;
     L := sqrt(sqr(EX)+sqr(EY));
    EX := EX/L;
    EY := EY/L;
     P := sqrt(sqr(R)-sqr(Offset));
    if Offset > R then
     Offset := R;
     zeichnePfeil(Canvas, X1+EY*Offset+EX*P, Y1-EX*Offset+EY*P, X2+EY*Offset-EX*P, Y2-EX*Offset-EY*P);
  end;

 
procedure TfrmUebung.Button1Click(Sender: TObject);
  const
  KRadius=19.0;
  Offset = 15; // Abstand der Pfeile zur Mittellinie
  var
  x1,y1,x2,y2:integer;
  px1,px2,px3:integer;
  Gewichtung:string;
  begin
  {Eingaben}
    m:=m+1;
    Anf[m]  :=StrToint(pfAnf.Text);
    Ende[m] :=StrToint(pfEnde.Text);
    Kosten[m]:=StrToint(pfKosten.Text);
    px3:=Kosten[m];
    px1:=Anf[m];
    px2:=Ende[m];
    gewichtung:=inttostr(px3);
    with imgGraph,imgGraph.Canvas do
    begin
      Font.Name := 'Arial';
      Font.Height := 30;
      X1 := (Kx[px1]);
      Y1 := (Ky[px1]);
      X2 := (Kx[px2]);
      Y2 := (Ky[px2]);
      setzeKnoten(Canvas,Kx,Ky,KRadius,Startknoten);
      Brush.Color := clBlack;
      ZeichneVerbindungspfeil(Canvas,x1,y1,x2,y2,KRadius,Offset);
      ZeichneVerbindungspfeil(Canvas,x1,y1,x2,y2,KRadius,Offset);
      pfeilbewertung (x1,y1,x2,y2,Gewichtung,Canvas);
    end;
  end;
das Problem wenn das programm die richtige lösung anzeigen soll malt er wild pfeile
(siehe bild)
und hier die passende stelle!

Code:
(*----Die--Darstellung--der--korekten--Lösung-------*)

procedure TfrmUebung.Button4Click(Sender: TObject);
 var x1,x2,y1,y2:integer;
     locali:integer;
 begin
   for locali:=1 to (m-1) do
    if Algo_pre[locali]<> 0 then
      begin
        with imgGraph,imgGraph.Canvas do
         begin
           x1:=kx[Algo_pre[locali]];
           y1:=ky[Algo_pre[locali]];
           x2:=Kx[locali];
           y2:=Ky[locali];
           Brush.Color := clyellow;
           Pen.Color:=clyellow;
           ZeichneVerbindungspfeil(Canvas,x1,y1,x2,y2,KRadius,Offset);
         end;
      end;
 end

pagan1900 4. Jun 2006 18:26

problemstellung Zeichnen der lösung umformuliert
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe folgendes problem
Ich möchte den inhalt eines Arrays Grafisch dastellen

gegeben ist ein Vorgängerpfeilarray, in dem sind alle vorganger knoten gespeichert und zwar so

Arrayspeicherplatz |1|2|3|
|3|0|0|

ich benöige ja 2 punkte um eine linie zu zeichnen!
Die Knotenkoordinaten selbst hab ich in 2 arrays abgespeichert Kx,Ky

Ich hatte mir dies wie folgt gedacht
Da locali von 1-n geht(wobein di anzahl der im graphen vorkommenden knoten dastellt)
das ich dann
Delphi-Quellcode:
 procedure TfrmUebung.Button4Click(Sender: TObject);
  var locali:integer;
      x1,x2,y1,y2:integer;
  begin
    for locali:=1 to n do
     begin
       x1:=kx[locali];
       y1:=ky[locali];
       x2:=kx[pre[locali]];
       y2:=ky[pre[locali]];
       Algo_loesung_dastellen(imgGraph,x1,x2,y1,y2,KRadius,Offset);
     end
  end;
nur das klappt leider nicht und es kommt das hier dabei herraus(siehe anhang, aber wieso??
und wie kann ich es verhinder, dass er die pfeile zeichnet die keine vorgaenger haben


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