AGB  ·  Datenschutz  ·  Impressum  







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

Linien plotten mit Bresenham

Ein Thema von Flogo · begonnen am 18. Okt 2004
Antwort Antwort
Benutzerbild von Flogo
Flogo

Registriert seit: 24. Mär 2003
Ort: Freiburg im Breisgau
317 Beiträge
 
Delphi 7 Professional
 
#1

Linien plotten mit Bresenham

  Alt 18. Okt 2004, 13:41
Der Bresenham Algorithmus eignet sich um Linien von einem Punkt zum nächsten zu berechnen und dabei zu überprüfen, welche Punkte gezeichnet werden müssen. Da nicht jeder Punkt auf die genauen Koordinaten gezeichnet werden kann muss man entweder die exakte Formel benutzen und jedes mal runden oder eben den Algorithmus von Bresenham verwenden. Dieser kommt mit Additionen (und einer Multiplikation mit 2) und Integern aus und betrachtet jeden Punkt auf der Linie nur ein mal und ist deswegen sehr effektiv.

Das folgende Beispiel habe ich mit diesem Tutorial entwickelt und auf alle 8 Richtungen erweitert:
Delphi-Quellcode:
procedure Bresenham(P1, P2: TPoint);

  procedure TauschePunkte(var P1: TPoint; var P2: TPoint);
  var
    Temp: TPoint;
  begin
    Temp := P1;
    P1 := P2;
    P2 := Temp;
  end;

var
  x, y, e, dx, dy: Integer;
begin
  if P1.X > P2.X then TauschePunkte(P1,P2);
  e := 0; // Der relative Fehler (im Tutorial e' genannt)
  x := P1.X;
  y := P1.Y;
  dx := P2.X - P1.X;
  dy := P2.Y - P1.Y;
  if dy >= 0 then // positive Steigung
    if dx >= dy then // leichte positive Steigung
      for x := P1.X to P2.X do
      begin
        Plot(x,y);
        if 2*(e + dy) < dx then
          Inc(e,dy)
        else
        begin
          Inc(y);
          Inc(e, dy-dx);
        end;
      end
    else // starke positive Steigung
      for y := P1.Y to P2.Y do
      begin
        Plot(x,y);
        if 2*(e + dx) < dy then
          Inc(e,dx)
        else
        begin
          Inc(x);
          Inc(e, dx-dy);
        end;
      end
  else // negative Steigung
    if dx >= -dy then // leichte negative Steigung
      for x := P1.X to P2.X do
      begin
        Plot(x,y);
        if 2*(e + dy) > -dx then
          Inc(e,dy)
        else
        begin
          Dec(y);
          Inc(e, dy+dx);
        end;
      end
    else // starke negative Steigung
    begin
      TauschePunkte(P1,P2);
      x := P1.X;
      dx := P2.X - P1.X;
      dy := P2.Y - P1.Y;
      for y := P1.Y to P2.Y do
      begin
        Plot(x,y);
        if 2*(e + dx) > -dy then
          Inc(e,dx)
        else
        begin
          Dec(x);
          Inc(e, dx+dy);
        end;
      end
    end;
end;
[edit=Matze] Mfg, Matze[/edit]
If one coincidence can occur, then another coincidence can occur. And if one coincidence happens to occur just after another coincidence, then that is just a coincidence.
DNA

www.Anyxist.de
  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:52 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