Hallo,
ich habe vor kurzem einen Quelltext zur grafischen Darstellung eines Binärbaumes (mit Buchstaben von A-Z) erhalten und diesen jetzt implementiert. Allerdings ist mir aufgefallen, dass die Umsetzung nicht sonderlich gut ist.
Wenn ich zum Beispiel die Buchstaben: (P,A,B,C,D,Z,Y,X,W,V) in dieser Reihenfolge eingebe gibt es in der Mitte eine Überschneidung (siehe original Screenshot-Ausschnitt im Anhang). Dort fällt außerdem auf, dass die Elemente, die zur linken Seite eingeordnet werden sollen, grundsätzlich einen größeren horizontalen Abstand zum übergeordneten Element haben, als solche Elemente, die zur rechten Seite eingeordet werden.
Hier der Quellcode mit den beiden zugehörigen Prozeduren:
Delphi-Quellcode:
procedure GrafikAusgabe(a:Zeiger;xx,yy,ii,rr:integer); //Prozedur zur Ausgabe der Grafik
var ll,oo:integer;
begin
if a<>nil then
begin
GrafikAusgabe(a^.links,xx-(100 div ii)-5,yy+40,ii+1,1);
Form1.ImageZeichnung.Canvas.TextOut(xx,yy,a^.Inhalt);
if ii>1 then
begin
ll:=xx+length(a^.Inhalt)*5-(length(a^.Inhalt)*5) div 2;
oo:=yy-1;
Form1.ImageZeichnung.Canvas.MoveTo(ll,oo);
ll:=ll+((100 div (ii-1))+5*rr)*rr;
oo:=oo-25;
Form1.ImageZeichnung.Canvas.LineTo(ll,oo);
end;
GrafikAusgabe(a^.rechts,xx+(100 div ii)-5,yy+40,ii+1,-1);
end;
end;
procedure GrafikSteuerung();
var rect: TRect;
xkoord, ykoord: integer;
begin
xkoord:=Form1.ImageZeichnung.Width div 2;
ykoord:=10;
rect:=Bounds(0,0,Form1.ImageZeichnung.Width,Form1.ImageZeichnung.Height);
Form1.ImageZeichnung.Canvas.Brush.Color:=clwhite;
Form1.ImageZeichnung.Canvas.FillRect(rect);
GrafikAusgabe(wurzel,xkoord,ykoord,1,1);
end;
Ich habe heute den ganzen Tag versucht, dass irgendwie umzuschreiben, sodass diese Probleme nicht auftreten, meine größte Schwierigkeit dabei ist allerdings, dass ich dem Quelltext-Abschnitt selbst nicht so ganz folgen kann. Ich habe ein paar Änderungen gemacht, was dazu geführt, dass Elemente plötzlich außerhalb des Images eigeordnet wurden, weil anscheinend der Bezugspunkt nicht richtig war. Hier mal mein Versuch (bisher noch ohne Verbindungsstriche). Eine falsche Darstellung tritt zum Beispiel bei Eingabe von "C,A,B" auf (das B wird rechts neben das C geschrieben in dem Abstand in dem es eigentlich vom A entfernt sein sollte:
Delphi-Quellcode:
procedure GrafikAusgabe(a:Zeiger;xx,yy,ii,rr:integer); //Prozedur zur Ausgabe der Grafik
var ll,oo:integer;
begin
if a<>nil then
begin
GrafikAusgabe(a^.links,xx-(xx div 2)-5,yy+40,ii+1,1);
Form1.ImageZeichnung.Canvas.TextOut(xx,yy,a^.Inhalt);
GrafikAusgabe(a^.rechts,xx+((Form1.ImageZeichnung.Width-xx) div 2)-5,yy+40,ii+1,-1);
end;
end;
Ich hoffe ihr könnt mir ein bisschen auf dem Weg zu einer problemfreien Lösung helfen.
Vielen Dank im Voraus
jawo3