Entwickler-Ecke
Algorithmen, Optimierung und Assembler - bresenham-linie wird nicht gezeichnet :(
roKR-91 - Do 25.02.10 09:47
Titel: bresenham-linie wird nicht gezeichnet :(
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:
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; |
und der aufruf dazu:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.Button1Click(Sender: TObject); begin with form1.Image1.Canvas do begin p_brese(75,320,535,75); end; end; |
Xion - 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:
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
Delphi-Quelltext
1:
| form1.image1.Picture.Bitmap.Canvas.Pixels[x,y]:= clred; |
:arrow: achja, übrigens:
Delphi-Quelltext
1: 2: 3: 4:
| with form1.Image1.Canvas do begin p_brese(75,320,535,75); end; |
:arrow: ich hab jetzt einfach mal dreist das umgedreht zu
if Fehler>0 then, dann kommt ne unspektakuläre rote Gerade raus.
roKR-91 - 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...
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; |
die frage is jetz wo ich
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)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!