AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Grafische Darstellung eines Binärbaum

Ein Thema von jawo3 · begonnen am 12. Feb 2011 · letzter Beitrag vom 13. Feb 2011
Antwort Antwort
jawo3

Registriert seit: 15. Sep 2009
Ort: Niedersachsen
41 Beiträge
 
#1

Grafische Darstellung eines Binärbaum

  Alt 12. Feb 2011, 19:46
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
Miniaturansicht angehängter Grafiken
binary.png  
Jan
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: Grafische Darstellung eines Binärbaum

  Alt 13. Feb 2011, 01:08
Crosspost
http://www.delphi-forum.de/viewtopic.php?p=632336
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
jawo3

Registriert seit: 15. Sep 2009
Ort: Niedersachsen
41 Beiträge
 
#3

AW: Grafische Darstellung eines Binärbaum

  Alt 13. Feb 2011, 15:04
Die Anordnung der Elemente funktioniert jetzt zu vollster Zufriedenheit.

Das nächste Problem besteht jetzt allerdings darin, dass die Verbindungslinien noch fehlen und ich nicht weiß, wie ich jetzt weiter verfahren muss.

Hier der Quellcode:

Delphi-Quellcode:
procedure GrafikAusgabe(a:Zeiger;left,top,width,ii: integer);
var ll,oo: integer;
begin
  Form1.ImageZeichnung.Canvas.TextOut(left+width div 2,top,a^.Inhalt);
  if ii>1 then
    begin
      //Form1.ImageZeichnung.Canvas.MoveTo(_______________);
      //Form1.ImageZeichnung.Canvas.LineTo(_______________);
    end;
  if a^.Links<>nil then GrafikAusgabe(a^.links,left,top+50,width div 2,ii+1);
  if a^.Rechts<>nil then GrafikAusgabe(a^.rechts,left+width div 2,top+50,width div 2,ii+1);
end;

procedure GrafikSteuerung();
var rect: TRect;
begin
  rect:=Bounds(0,0,Form1.ImageZeichnung.Width,Form1.ImageZeichnung.Height);
  Form1.ImageZeichnung.Canvas.Brush.Color:=clwhite;
  Form1.ImageZeichnung.Canvas.FillRect(rect);
  if wurzel<>nil then GrafikAusgabe(wurzel,0,25,Form1.ImageZeichnung.Width-50,1);
end;

Vielleicht könnt ihr mir einen Denkanstoß geben, das wäre klasse.
Jan
  Mit Zitat antworten Zitat
jawo3

Registriert seit: 15. Sep 2009
Ort: Niedersachsen
41 Beiträge
 
#4

AW: Grafische Darstellung eines Binärbaum

  Alt 13. Feb 2011, 16:50
Thema gelöst

(siehe Link oben)
Jan
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz