Autor Beitrag
pagan1900
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: So 14.05.06 16:45 
Hi ich habe ein probleme ich mus eine graphen ertellen für den dijkstra algorithmus , nur die sache ist die, der graph kann ja auch rückpfeile besitzen
z.b. 1->2 und von 2->1
ohne das der pfeil zum mond "auswandert"?
ich müste den rückpfeil etwas versetzt dastellen
nur wie kann ich das realisieren?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
 for locali:=1 to m do
  begin
  Pfeilstartx:=Kx[anf[locali]];
  Pfeilstarty:=Ky[anf[locali]];
  Pfeilendex:=Kx[ende[locali]];
  Pfeilendey:=Ky[ende[locali]];
  //Linie zeichnen

  normal.Canvas.Brush.Color := clBlack;
  normal.Canvas.Pen.Style   := psSolid;
  normal.Canvas.Pen.Width   := 3;
  normal.Canvas.MoveTo(pfeilstartx,pfeilstarty);
  normal.canvas.LineTo(pfeilendex,pfeilendey);


Moderiert von user profile iconUGrohne: Delphi-Tags hinzugefügt.
digi_c
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: Mo 15.05.06 10:40 
Ein normaler Rückpfeil oder etwas spezielles? Mal das sonst mal auf mit Paint...
pagan1900 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Di 16.05.06 19:05 
Titel: rückpfeil einzeichen
Sieht zwar nicht alzusuper aus, aber so stelle ich es mir mit den rückpfeilen vor!

Also, ich weiss die koordinaten aller punkte (hab ich festgelegt!) sprich ich kann mit moveto(für den startpunkt) und lineto(zielknoten) die lininen zeichnen lassen, nur müste es nun für den fall das der benutzer einen rückpfeil einbaut (siehe skitze) beide pfeile dargestellt werden und nicht wie bei mir bisher übereinander gezeichnet werden! sprich beide "pfeil" müsten sich etwas von der moveto->lineto linie verschieben! (nur bisher wenn ich es versucht habe schossen die pfeile gleich "zum mond" !)

//und wenn ich gerade dabei binn moveto und line to zeichnen eine linie ja immer vom zentrum der gegeben x/ykoordinaten, wie kann ich ohne viel aufhebends es bewerkstelligen, dass die pfeile erst an den kreisenden gezeichnet werden? der radius der kreise ist (x-15,y-15,x+15,y+15)? bisher war meine lösung das ich einfach die knoten drübermalen lasse, aber dabei werden leider die pfeilspitzen etwas überdeckt!//

Moderiert von user profile iconTino: Überflüssige Zeilenumbrüche entfernt.
Einloggen, um Attachments anzusehen!
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mi 17.05.06 00:33 
Hauptmethode Button1Click. Andere Prozeduren sind die Zeichnungsroutinen.
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
procedure DrawArrow(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));
  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 DrawCircle(Canvas: TCanvas; X, Y, R: Extended; Text: String);
var
 Size: TSize;
begin
 with Canvas do
 begin
   Brush.Style := bsSolid;
   Ellipse(Round(X-R),Round(Y-R),Round(X+R),Round(Y+R));
   Size := Canvas.TextExtent(Text);
   Brush.Style := bsClear;
   TextOut(Round(X)-Size.cx div 2, Round(Y)-Size.cy div 2, Text);
 end;
end;

procedure DrawConnectionArrow(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;
 DrawArrow(Canvas, X1+EY*Offset+EX*P, Y1-EX*Offset+EY*P, X2+EY*Offset-EX*P, Y2-EX*Offset-EY*P);
end;

procedure TForm1.Button1Click(Sender: TObject);
const
 R = 16// Radius der Kreise
 Offset = 8// Abstand der Pfeile zur Mittellinie
var
 X1, Y1, X2, Y2: Integer;
begin
  with Image1,Image1.Canvas do
  begin
   Font.Name := 'Arial';
   Font.Height := 30;

   // ** Einzelner Pfeil
   X1 := 20;
   Y1 := 30;
   X2 := 180;
   Y2 := 60;
   Brush.Color := clYellow;
    DrawCircle(Canvas, X1, Y1, R, '1');
   Brush.Color := clYellow;
    DrawCircle(Canvas, X2, Y2, R, '2');
   Brush.Color := clBlack;
   DrawConnectionArrow(Canvas, X1, Y1, X2, Y2, R, 0);

   // ** Doppelter Pfeil
   X1 := 20;
   Y1 := 80;
   X2 := 180;
   Y2 := 110;
   Brush.Color := clYellow;
    DrawCircle(Canvas, X1, Y1, R, 'A');
   Brush.Color := clYellow;
    DrawCircle(Canvas, X2, Y2, R, 'B');
   Brush.Color := clBlack;
   DrawConnectionArrow(Canvas, X1, Y1, X2, Y2, R, Offset);
   DrawConnectionArrow(Canvas, X2, Y2, X1, Y1, R, Offset);
  end;
end;
Einloggen, um Attachments anzusehen!
digi_c
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: Mi 17.05.06 08:27 
Ich hasse es, dass es für sowas keine Standart WinControls gibt :(

Aber wenn ihr mal was schönes zu Graphen sehen wollt, schaut euch mal www.essential-freebi...viewtopic.php?t=7627 an :D
pagan1900 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Fr 26.05.06 06:12 
Titel: klappt nicht
hi sorry stehe völlig auf dem schlauch und binn am verzweifeln! Ich bekomme die rückpfeile immer noch nicht hin! egal wie ich den vorrangegangenen quellcode verwende es kommt nur müll herraus, sprich er zeichnet irgendwie nen doppelstrich, aber an dem einen sind eine pfeilspitze am anfang/und ende!

mein problem: ich muss irgendwie abtesten ob der gerade eingegebene pfeil ein rückpfeil zu einem bestehenden pfeil dastellt, wenn ja zeichne rückpfeil nur wie muss ich die if geschichte richtig formulieren damit das funktioniert? ich müste doch eigentlich den neuen pfeil einfach daneben klatschen und das macht er einfach überhaup nicht

das problem ist unter anderem so vermute ich, das ich irgendie den zuersgesetzen pfeil übermalen und dann die neuen setzen!

von allen seiten bekomme ich nur kluge sprüche, wie z.B. drehe die angaben um und schon hast du nen rückpfeil! nur das klappt nicht und somit setze ich meine hoffnungen auf euch!

bitte helft mir, binn am verzweifeln mit den dingern!

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
type
  {Eingabestruckturen}
  TKnoten=Array[1..8of integer;
  TPfeil=Array[1..64of integer;
  TKnoten_plus1=array[1..9of integer;
...
  
{Die Pfeile}
 procedure zeichnePfeil(var pbPfeileingabe:TPaintbox; var X1,Y1,X2,Y2:integer);
  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 := X2-X1;
    Y := Y2-Y1;
    L := sqrt(X*X+Y*Y);
   PX := X*(1-H/L);
   PY := Y*(1-H/L);
   with pbPfeileingabe.canvas do
    begin
      MoveTo(Round(X1),Round(Y1)); LineTo(Round(X2),Round(Y2));
      Brush.Style := bsSolid;
      Polygon([Point(Round(X2), Round(Y2)),
      Point(Round(X1+PX-Y/L*W/2), Round(Y1+PY+X/L*W/2)),
      Point(Trunc(X1+X-X/L*C), Trunc(Y1+Y-Y/L*C)),
      Point(Round(X1+PX+Y/L*W/2), round(Y1+PY-X/L*W/2))]);
    end;
 end;

 procedure ZeichneVerbindung(pbPfeileingabe:TPaintbox; X1,Y1,X2,Y2:integer; 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(pbPfeileingabe,X1,Y1,X2,Y2);
end;

{Die Pfeile}
 procedure TfrmUebung.Button1Click(Sender: TObject);
  const Offset = 8// Abstand der Pfeile zur Mittellinie
  var X1, Y1, X2, Y2: Integer;
      x,y:integer;
      knotennummer:string;
      locali,k:word;
      art:integer;
  begin
    m:=m+1;
    Anf[m]:=strtoint(pfAnf.Text);
    Ende[m]:=strtoint(pfEnd.Text);
    Kosten[m]:=strtoint(pfBewertung.Text);
    for locali:=1 to m do
    begin
    if (Anf[m]and ende[m])<> (ende[locali]and anf[locali]) then
     begin
       x1:= kx[anf[m]];
       y1:= ky[anf[m]];
       x2:= kx[ende[m]];
       y2:= ky[ende[m]];
       pbpfeileingabe.Canvas.Brush.Color:=clwhite;
       pbpfeileingabe.Canvas.pen.Color:=clwhite;
       pbpfeileingabe.Canvas.pen.Width:=3;
       ZeichneVerbindung(pbPfeileingabe,X1,Y1,X2,Y2,R,Offset);
     end
     else
      begin
        x1:= kx[anf[m]];
        y1:= ky[anf[m]]+10;
        x2:= kx[ende[m]];
        y2:= ky[ende[m]]+10;
        pbpfeileingabe.Canvas.Brush.Color:=clwhite;
        pbpfeileingabe.Canvas.pen.Color:=clwhite;
        pbpfeileingabe.Canvas.pen.Width:=3;
        ZeichneVerbindung(pbPfeileingabe,X2,Y2,X1,Y1,R,Offset);
      end;
     end;
    for k:=1 to n do
     begin
       x:=Kx[k];
       y:=Ky[k];
       knotennummer:=inttostr(k);
       pbknoten.Canvas.Brush.Color:=clwhite;
       PKnoten(pbKnoten,x,y,R,Knotennummer);
     end;
     end;


Moderiert von user profile iconTino: Überflüssige Zeilenumbrüche entfernt.
Einloggen, um Attachments anzusehen!
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Fr 26.05.06 11:46 
Ich hab dir doch vorhin nen voll funktionsfähigen Code geschrieben, inkl. Screenshot des Resultats... Oder ist dein Problem wie du das jetzt einbauen musst?
pagan1900 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Fr 26.05.06 12:02 
Hi danke für deine schnelle antwort! daumen hoch!

Ich denke ich hab dann genau an dieser stelle meine probleme wie ich dieses korrekt einbinden muss!
mich hatt bei dem code irritiert, das x1,y1,x2,y2 so festgelegt war!
Da ich den code an die stelle schreiben muss (wo der graph vom user eingegeben werden muss werden die werte ständig verändert!

Hier soll er unteranderem seine Anwendung finden. Sprich bei jedem buttonclick erhöht sich mein m und wie du siehst soll bei jedem buttonclick der jeweilige pfeil in den graphen eingebaut werden. und da steckt der teufel im deteil.
ich muss doch ständig überpruefen, ist die eingabe ein rückpfeil eines vorrangegangenen eintrags oder sehe ich das falsch an der stelle??

freue mich auf deine antwort:=)

//Bevor ich die sache irgendwie falsch dastelle bzw unnötig verkompleziere
//poste ich einfach mal mein programm mit dem code

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
procedure TfrmUebung.Button1Click(Sender: TObject);
  const Offset = 8// Abstand der Pfeile zur Mittellinie
  var X1, Y1, X2, Y2: Integer;
      x,y:integer;
      knotennummer:string;
      locali,k:word;
      art:integer;
  begin
    m:=m+1;
    Anf[m]:=strtoint(pfAnf.Text);
    Ende[m]:=strtoint(pfEnd.Text);
    Kosten[m]:=strtoint(pfBewertung.Text);
    pfAnf.Clear; pfEnd.Clear; pfBewertung.Clear;
    x1:= kx[anf[m]];
    y1:= ky[anf[m]];
    x2:= kx[ende[m]];
    y2:= ky[ende[m]];
    for locali:=1 to m do
    begin
    if (Anf[m]and ende[m])<> (ende[locali]and anf[locali]) then
     begin
       pbpfeileingabe.Canvas.Brush.Color:=clwhite;
       pbpfeileingabe.Canvas.pen.Color:=clwhite;
       pbpfeileingabe.Canvas.pen.Width:=3;
       ZeichneVerbindung(pbPfeileingabe,X1,Y1,X2,Y2,R,Offset);
     end
     else
      begin
       y1:=y1;
       y2:=y2;
        pbpfeileingabe.Canvas.Brush.Color:=clwhite;
        pbpfeileingabe.Canvas.pen.Color:=clwhite;
        pbpfeileingabe.Canvas.pen.Width:=3;
        ZeichneVerbindung(pbPfeileingabe,X1,Y1,X2,Y2,R,Offset);
      end;
     end;
    for k:=1 to n do
     begin
       x:=Kx[k];
       y:=Ky[k];
       knotennummer:=inttostr(k);
       pbknoten.Canvas.Brush.Color:=clwhite;
       PKnoten(pbKnoten,x,y,R,Knotennummer);
     end;
  end;
Einloggen, um Attachments anzusehen!