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



BeitragVerfasst: 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

bresekreis

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:
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//of while
    end// of if
end// of procedure


Moderiert von user profile iconTino: Screenshot als Anhang hinzugefügt.
Einloggen, um Attachments anzusehen!
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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.

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:
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
      //Punkte ausgeben  8-fache Symmetrie
      //oberhalb y= ym
      pixels[xm - x, ym + y] := clred;
      pixels[xm + x, ym + y] := clred;
      //unterhalb y= ym
      pixels[xm - x, ym - y] := clred;
      pixels[xm + x, ym - y] := clred;
      // x und y tauschen
      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
    //Jetzt x aendern
    begin
      dx     := 1 - x * 2;
      x      := x - 1;
      fehler := fehler - dx;
    end//IF hierhin
    KreisPunkteAusgeben;
  end//of while

//end; // of if war hier nie,es war end; //  of while !
end;


Gestestet ;-)

Gruß Horst


Zuletzt bearbeitet von Horst_H am Do 28.01.10 10:30, insgesamt 1-mal bearbeitet
roKR-91 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Do 28.01.10 10:31 
Hallo,

uups ich habe es gerade editiert.
Schau es Dir nochmals an.

Gruß Horst
roKR-91 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Do 25.02.10 10:10 
hm...mein delphi kennt "PixelPrKaestchen" nich...was jetz ?

ausblenden Delphi-Quelltext
1:
    r       := round(r / PixelPrKaestchen );					
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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
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 12:51 
user profile iconroKR-91 hat folgendes geschrieben Zum zitierten Posting springen:
hm...mein delphi kennt "PixelPrKaestchen" nich...was jetz ?

Ich glaub Sätze dieser Art bringen ziemlich jeden hier im Forum innerlich zum kochen xD

user profile iconHorst_H hat folgendes geschrieben Zum zitierten Posting springen:

Dieses PixelPrKaestchen kannst Du als Konstante oder als Variable erstellen.
Also PixelPrKaestchen :=10 fuer 10x10 Punkte Quadrate.

ich würde sogar sagen PixelPrKaestchen ist der Wert, der in deinem Screenshot als Rastereinstellung angezeigt wird

_________________
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: 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 :
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:
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
       // Punkte ausgeben 8-fache Symmetrie
       // oberhalb y = ym
       form1.image2.canvas.pixels[xm - x, ym + y]   := clred;
       form1.image2.canvas.pixels[xm + x, ym + y]   := clred;
       // unterhalb y = ym
       form1.image2.canvas.pixels[xm - x, ym - y]   := clred;
       form1.image2.canvas.pixels[xm + x, ym - y]   := clred;
       // x und y tauschen
       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// of canvas
    end// of punkte ausgeben
  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
        // jetz x aendern
        begin
          dx      := 1 - x * 2    ;
          x       := x - 1        ;
          fehler  := fehler - dx  ;
        end// of if
        KaestchhenPunkteAusgeben;
      end// of while

end;// of p_kreis


ich denke der fehler liegt immer noch hier :
ausblenden Delphi-Quelltext
1:
r       := round(r / 8 );					


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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: 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