Autor Beitrag
roKR-91
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Do 25.02.10 09:47 
hi...für meine facharbeit in info (thema: bresenham) will ich eine linie mit dem bresenham algorithmus zeichnen. bei wikipedia hab ich den bresenham-algo für eine linie gefunden, allerdings in C also hab ich den algo mal in delphi umgeschrieben. fehlermeldungen kommen keine, aber die linie wird auch nicht auf dem formular gezeichnet.
hier mein quelltext:

ausblenden 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:
procedure p_brese (xa, xe, ya, ye : integer);
var x, y, dx, dy : integer;
    fehler : real;
    begin
      dx := xe - xa;
      dy := ye - ya;

      x := xa;
      y := ya;

      fehler := dx/2;
      form1.image1.Canvas.Pixels[x,y]:= clred;
      form1.Image2.Canvas.Pixels[x,y]:= clred;

      while x < xe do
        begin x := x+1;
              fehler := fehler - dy;
              if fehler < 0 then
                begin y := y + 1;
                      fehler := fehler + dx;
                      form1.image1.Canvas.Pixels[x,y]:= clred;
                      form1.Image2.Canvas.Pixels[x,y]:= clred;
                end;
        end;
end//of p_brese


und der aufruf dazu:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.Button1Click(Sender: TObject);  //bresenham (linie) zeichnen
begin
  with form1.Image1.Canvas do
    begin
      p_brese(75,320,535,75);
    end// of canvas
end// of linie
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Do 25.02.10 11:04 
:arrow: dein Algorithmus ist falsch. Fehler ist immer größer Null und somit wird nur ein Punkt gezeichnet (der vor der while-Schleife).

:arrow: Ich hab hier rumgebastelt und mich geärgert warums nichts geht...lag daran, dass ich in ein andres Image gemalt hab, als ich wollte :D

Also, erstmal das Image.Bitmap so groß ziehen wie nötig:
ausblenden Delphi-Quelltext
1:
2:
Form1.Image1.Picture.Bitmap.Width:=Form1.Image1.ClientWidth;
Form1.Image1.Picture.Bitmap.Height:=Form1.Image1.ClientHeight;

und dann immer auf Form1.Image1.Picture.Bitmap.Canvas zeichnen
ausblenden Delphi-Quelltext
1:
form1.image1.Picture.Bitmap.Canvas.Pixels[x,y]:= clred;					


:arrow: achja, übrigens:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
  with form1.Image1.Canvas do //<<die Zeile ist sinnlos ;)
    begin
      p_brese(75,320,535,75);
    end// of canvas


:arrow: ich hab jetzt einfach mal dreist das umgedreht zu if Fehler>0 then, dann kommt ne unspektakuläre rote Gerade raus.

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
roKR-91 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Fr 12.03.10 00:07 
weiß gar nich mehr wo ich diesen schwachsinnigen algorithmus her hab...hab jetz nochmal in hefter geschaut und bresenham müsste also so aussehen...

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:
procedure p_brese (xa, xe, ya, ye : integer);
var x, y, d, dx, dy, E, NE : integer;
begin
  dx := xe-xa;
  dy := ye-ya;

  d := 2*dy-dx;
  E := 2*dy;
  NE := 2+(dy-dx);


  x := xa;
  y := ya;

repeat
  begin
    if d<= 0 then
               begin
                 d := d + E;
                 x := x + 1;
               end
               else
               begin
                 d := d + NE;
                 x := x + 1;
                 y := y + 1;
               end;
  end;
until x < xe;

end//of p_brese


die frage is jetz wo ich
ausblenden Delphi-Quelltext
1:
form1.image1.Canvas.FloodFill(x, y,clnavy,fsborder);					

einfüge damit der das zeichnet...hat jemand ne schnelle antwort ?

weiterhin wär es schön wenn mir jmd was zu antialiasing für eben diese linie sagen könnte (nicht mit opengl...ich soll das mit delphi machen)
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Fr 12.03.10 20:30 
Kurz zum Bresenham:
Der 1. Code arbeitet mit nem Real (gleitkommawert).
Der Bresenham-Alg ist deshalb so schnell (und bekannt) weil nur Integer Operationen verwendet werden.

Zum 2. Code:
Du solltest die Variablen so bennennen, dass man damit was anfangen kann.
Ich z.B. kenn den Bresenham immer mit einer Fehlervariablen (wie Code 1).

Von daher solltest du Code(1) anpassen: glaub es sollte so gehen: (fehler := dx div 2 mit fehler: Integer).

Außerdem solltest du die globalen Variablen om code trennen (d.h. nicht auf form1 zugreifen) sondern z.b. als zusätzlichen Parameter den Canvas angeben.

Zu Antialiasing und Bresenham siehe
web.cs.wpi.edu/~matt...liasing/methods.html
"Bresenham's algorithm was developed by Pitteway and Watkinson"

bzw. hier:
www.inf.tu-dresden.d...antialias_script.pdf

und bei wiki findest die beiden codes von dir auch nochmal:
de.wikipedia.org/wik...resenham-Algorithmus

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit