Autor |
Beitrag |
roKR-91
      
Beiträge: 22
|
Verfasst: Do 28.01.10 09:11
hi leute...mla wieder ein problem...hab im netz mal nachgeschaut wie ich einen kreis mit dem bresenham-algorithmus zeichnen kann...allerdings ist der kreis nich vollständig...bzw ein teil fehlt oder wird nicht gespiegelt...siehe bild
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: 32: 33:
| procedure p_bresek (r, xm, ym : integer) ; var x, y, dx, dy : integer; fehler : real; begin x := r; y := 0; fehler := r;
form1.image2.canvas.pixels[xm + x, ym + y] := clred ;
WHILE y < x do begin dy := y*2+1; y := y+1 ; fehler := fehler - dy; IF fehler < 0 THEN begin dx := 1-x*2 ; x := x-1 ; fehler := fehler - dx ; form1.image2.canvas.pixels[xm - x, ym + y] := clred; form1.image2.canvas.pixels[xm - x, ym - y] := clred; form1.image2.canvas.pixels[xm + x, ym - y] := clred; form1.image2.canvas.pixels[xm + y, ym + x] := clred; form1.image2.canvas.pixels[xm - y, ym + x] := clred; form1.image2.canvas.pixels[xm - y, ym - x] := clred; form1.image2.canvas.pixels[xm + y, ym - x] := clred;
end; end; end; |
Moderiert von Tino: Screenshot als Anhang hinzugefügt.
Einloggen, um Attachments anzusehen!
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Do 28.01.10 09:21
Hallo,
sollte man nicht immer zeichnen?
Du zeichnest nicht alle 8 Symmetrien.
Du hast auch in den Kommentaren sich überschneidende Begin end, was nicht möglich ist.Dein end while bezieht sich auf if und umgekehrt.
Ich habe es jetzt etwas ?anschaulicher? gemacht, indem ich eine Prozedur zum zeichnen der Kreispunkte eingebaut habe, dadurch wird es übersichtlicher.
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: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47:
| procedure TForm1.p_bresek(r, xm, ym: integer); var x, y, dx, dy: integer; fehler: integer;
procedure KreisPunkteAusgeben; begin with form1.image1.canvas do begin pixels[xm - x, ym + y] := clred; pixels[xm + x, ym + y] := clred; pixels[xm - x, ym - y] := clred; pixels[xm + x, ym - y] := clred; pixels[xm - y, ym + x] := clred; pixels[xm + y, ym + x] := clred; pixels[xm - y, ym - x] := clred; pixels[xm + y, ym - x] := clred; end; end;
begin x := r; y := 0; fehler := r; KreisPunkteAusgeben;
while y < x do begin dy := y * 2 + 1; y := y + 1; fehler := fehler - dy; if fehler < 0 then begin dx := 1 - x * 2; x := x - 1; fehler := fehler - dx; end; KreisPunkteAusgeben; end; end; |
Gestestet
Gruß Horst
Zuletzt bearbeitet von Horst_H am Do 28.01.10 10:30, insgesamt 1-mal bearbeitet
|
|
roKR-91 
      
Beiträge: 22
|
Verfasst: Do 28.01.10 10:09
hi...kann dir i-wie nich ganz folgen...
muss zeile 17 und zeile 18 in deinem text nich getauscht werden..und wie meinst du das "x ändern"?
und welche punkte soll ich da ausgeben...bin nicht so der info-freak...^^
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Do 28.01.10 10:31
Hallo,
uups ich habe es gerade editiert.
Schau es Dir nochmals an.
Gruß Horst
|
|
roKR-91 
      
Beiträge: 22
|
Verfasst: Do 04.02.10 09:00
herrlich...riesengroßen dankeschön jetz brauch ich nur noch rauskriegen wie ich den kreis an das raster anpasse...also ein kästchen soll einen pixel darstellen...
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Do 04.02.10 09:13
Guten morgen,
Das geht genauso einfach, statt Kreis in Pixelauflösung, machst Du einen Kreis in Kästchenauflösung.
Wenn ein Kästchen/Quadrat 10 Pixel hoch/breit ist wird aus r = 100 Pixel eben:
r(Kästchen) = r(Pixel) / PixelPrKaestchen
Du musst nur statt KreisPunkteAusgeben ein KaestchhenPunkteAusgeben schreiben.
Schau Dir mal (form1.image1.canvas).Fillrect hier an, um Brush und pen so zu setzen, wie Du es gerne hättest.Statt alles = cliprect, beschreibst Du nur ein kleines Quadrat rect(0,0,PixelPrKaestchen,PixelPrKaestchen).
xm und ym wandern auch auf andere Positionen.
Sie müssen ohne Rest durch PixelPrKaestchen teilbar sein und bezeihen sich auf die linke obere Ecke des Kaestchens.
Gruß Horst
|
|
roKR-91 
      
Beiträge: 22
|
Verfasst: Do 25.02.10 10:10
hm...mein delphi kennt "PixelPrKaestchen" nich...was jetz ?
Delphi-Quelltext 1:
| r := round(r / PixelPrKaestchen ); |
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Do 25.02.10 10:20
Hallo,
PixelPrKaestchen sind die Pixel pro Kaestchenquadratseite.
Dieses PixelPrKaestchen kannst Du als Konstante oder als Variable erstellen.
Also PixelPrKaestchen :=10 fuer 10x10 Punkte Quadrate.
Gruß Horst
|
|
Xion
      

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)
|
Verfasst: Do 25.02.10 12:51
_________________ 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 
      
Beiträge: 22
|
Verfasst: Do 04.03.10 10:01
hm ich hab jetz da mal ein wenig dran rumgeschraubt...leider ohne den gewünschten erfolg...
die procedure für den kreis sieht jetz so aus :
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: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44:
| procedure p_kreis (r, xm, ym : integer) ; var x, y, dx, dy, fehler : integer;
procedure KaestchhenPunkteAusgeben; begin with form1.image2.canvas do begin form1.image2.canvas.pixels[xm - x, ym + y] := clred; form1.image2.canvas.pixels[xm + x, ym + y] := clred; form1.image2.canvas.pixels[xm - x, ym - y] := clred; form1.image2.canvas.pixels[xm + x, ym - y] := clred; form1.image2.canvas.pixels[xm - y, ym + x] := clred; form1.image2.canvas.pixels[xm + y, ym + x] := clred; form1.image2.canvas.pixels[xm - y, ym - x] := clred; form1.image2.canvas.pixels[xm + y, ym - x] := clred; end; end; begin r := round(r / 8 ); x := r; y := 0; fehler := r; KaestchhenPunkteAusgeben;
while y < x do begin dy := y * 2 + 1 ; y := y + 1 ; fehler := fehler - dy; if fehler < 0 then begin dx := 1 - x * 2 ; x := x - 1 ; fehler := fehler - dx ; end; KaestchhenPunkteAusgeben; end; end; |
ich denke der fehler liegt immer noch hier :
Delphi-Quelltext
da der kreis einfach nur kleiner wird. also der radius nur kleiner wird...8 ist hier bei die rastergröße also wie hoch und breit ein kästchen ist
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Do 04.03.10 12:51
Hallo,
Du willst doch gefüllte Quadrate / Kästchen zeichnen.
Dann musst Du auch fillrect nutzen.
Wenn Du einen Kreis um 3,3 mit Radius 3 KE ( KästchenEinheit ) zeichnest, muss Du deine Koordianten umrechnen.
Wenn Du 10 PpK (Kantenlänge eines Kästchen in Pixel ) als 1 KE hast musst Du die Koordinaten umrechnen.
Kästchen in Pixel -> Faktor : PpK = 10
Pixel in Kästchen -> Faktor : 1/PpK = 1/10
Jetzt brauchst Du den Kreis nur in Kästcheneinheiten zu rechnen also Radius 3 und xm, ym = 3
Jeder berechnete Wert muss aber zentrisch gestreckt werden, dass heisst die Koordinaten in Pixel umgerechnet werden.
Das ist höchst kompliziert  Der Mittelpunkt des Kästchens ist dann PpK * berechnete Koordinate.
Jetzt steht da so was wie Mittelpunkt, Du brauchst zum zeichen aber die linke obere Ecke.
Die Koordinate der linken oberen Ecke des Kästchens ist um 0,5 *PpK nach links und 0,5 *PpK nach oben gegenüber der Mitte verschoben.
Das sollte doch jetzt machbar sein
Gruß Horst
Einloggen, um Attachments anzusehen!
|
|
roKR-91 
      
Beiträge: 22
|
Verfasst: Do 11.03.10 18:36
so ich hab mich jetz noch mal intensiv mit fillrect befasst...und hab jetz erstmal das prinzip verstanden...
aber wie krieg ich nun den oberen linken punkt(x;y) raus und wo kann ich einstellen das der nur bis (x+dx;y+dy) das rechteck zeichnet ?
dx := breite des rasters
dy := höhe des rasters
|
|
|