Autor |
Beitrag |
pagan1900
      
Beiträge: 22
|
Verfasst: 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?
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]]; 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 UGrohne: Delphi-Tags hinzugefügt.
|
|
digi_c
      
Beiträge: 1905
W98, XP
D7 PE, Lazarus, WinAVR
|
Verfasst: Mo 15.05.06 10:40
Ein normaler Rückpfeil oder etwas spezielles? Mal das sonst mal auf mit Paint...
|
|
pagan1900 
      
Beiträge: 22
|
Verfasst: 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 Tino: Überflüssige Zeilenumbrüche entfernt.
Einloggen, um Attachments anzusehen!
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Mi 17.05.06 00:33
Hauptmethode Button1Click. Andere Prozeduren sind die Zeichnungsroutinen.
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; C = H*6/7; W = H*2/3; 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; Offset = 8; var X1, Y1, X2, Y2: Integer; begin with Image1,Image1.Canvas do begin Font.Name := 'Arial'; Font.Height := 30;
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);
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
      
Beiträge: 1905
W98, XP
D7 PE, Lazarus, WinAVR
|
Verfasst: 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 
|
|
pagan1900 
      
Beiträge: 22
|
Verfasst: 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!
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 TKnoten=Array[1..8] of integer; TPfeil=Array[1..64] of integer; TKnoten_plus1=array[1..9] of integer; ...
procedure zeichnePfeil(var pbPfeileingabe:TPaintbox; var X1,Y1,X2,Y2:integer); const H = 30; C = H*6/7; W = H*2/3; 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;
procedure TfrmUebung.Button1Click(Sender: TObject); const Offset = 8; 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 Tino: Überflüssige Zeilenumbrüche entfernt.
Einloggen, um Attachments anzusehen!
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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 
      
Beiträge: 22
|
Verfasst: 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
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; 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!
|
|
|