Delphi-Forum.de Delphi-Library.de
C-Sharp-Forum.de C-Sharp-Library.de
Registrieren Login Suche Hilfe Sitemap
[objekt-pascal/delphi7] kreisbresenham
spacer
Autor Nachricht
roKR-91
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star

Beiträge: 22
Dabei seit: 29.02.2008



BeitragVerfasst: Do 28.01.10 09:11 
Betrifft: objekt-pascal/delphi7
Antworten mit Zitat Beitrag melden
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



ausblenden volle Höhe Delphi-Quelltext markieren
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!
Private Nachricht sendenPosting in privater Nachricht zitieren
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic star

Beiträge: 914
Erhaltene Danke: 1
Dabei seit: 07.09.2005
Wohnort: Münster

WinXp,PuppyLinux
Turbo Delphi, FreePascal
BeitragVerfasst: Do 28.01.10 09:21  Antworten mit Zitat Beitrag melden
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 markieren
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
Private Nachricht sendenPosting in privater Nachricht zitieren
roKR-91
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star

(Threadstarter)

Beiträge: 22
Dabei seit: 29.02.2008



BeitragVerfasst: Do 28.01.10 10:09  Antworten mit Zitat Beitrag melden
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...^^
Private Nachricht sendenPosting in privater Nachricht zitieren
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic star

Beiträge: 914
Erhaltene Danke: 1
Dabei seit: 07.09.2005
Wohnort: Münster

WinXp,PuppyLinux
Turbo Delphi, FreePascal
BeitragVerfasst: Do 28.01.10 10:31  Antworten mit Zitat Beitrag melden
Hallo,

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

Gruß Horst
Private Nachricht sendenPosting in privater Nachricht zitieren
roKR-91
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star

(Threadstarter)

Beiträge: 22
Dabei seit: 29.02.2008



BeitragVerfasst: Do 04.02.10 09:00  Antworten mit Zitat Beitrag melden
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...
Private Nachricht sendenPosting in privater Nachricht zitieren
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic star

Beiträge: 914
Erhaltene Danke: 1
Dabei seit: 07.09.2005
Wohnort: Münster

WinXp,PuppyLinux
Turbo Delphi, FreePascal
BeitragVerfasst: Do 04.02.10 09:13  Antworten mit Zitat Beitrag melden
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
Private Nachricht sendenPosting in privater Nachricht zitieren
roKR-91
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star

(Threadstarter)

Beiträge: 22
Dabei seit: 29.02.2008



BeitragVerfasst: Do 25.02.10 10:10  Antworten mit Zitat Beitrag melden
hm...mein delphi kennt "PixelPrKaestchen" nich...was jetz ?

ausblenden Delphi-Quelltext markieren
1:
    r       := round(r / PixelPrKaestchen );
Private Nachricht sendenPosting in privater Nachricht zitieren
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic star

Beiträge: 914
Erhaltene Danke: 1
Dabei seit: 07.09.2005
Wohnort: Münster

WinXp,PuppyLinux
Turbo Delphi, FreePascal
BeitragVerfasst: Do 25.02.10 10:20  Antworten mit Zitat Beitrag melden
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
Private Nachricht sendenPosting in privater Nachricht zitieren
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
EE-Maler

Beiträge: 1339
Erhaltene Danke: 2
Dabei seit: 23.02.2006
Wohnort: Mitte Deutschlands / A**** der Welt

Windoof 2000, XP
Delphi 6 Enterprise / Delphi 2005 Prof
BeitragVerfasst: Do 25.02.10 12:51  Antworten mit Zitat Beitrag melden
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
F steht für Feuer das wütet und lodert U steht für unfairer Kampf N steht für nukleares Waffenarsenal (Plankton)
Private Nachricht sendenPosting in privater Nachricht zitieren
roKR-91
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star

(Threadstarter)

Beiträge: 22
Dabei seit: 29.02.2008



BeitragVerfasst: Do 04.03.10 10:01  Antworten mit Zitat Beitrag melden
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 markieren
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 markieren
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
Private Nachricht sendenPosting in privater Nachricht zitieren
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic star

Beiträge: 914
Erhaltene Danke: 1
Dabei seit: 07.09.2005
Wohnort: Münster

WinXp,PuppyLinux
Turbo Delphi, FreePascal
BeitragVerfasst: Do 04.03.10 12:51  Antworten mit Zitat Beitrag melden
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!
Private Nachricht sendenPosting in privater Nachricht zitieren
roKR-91
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star

(Threadstarter)

Beiträge: 22
Dabei seit: 29.02.2008



BeitragVerfasst: Do 11.03.10 18:36  Antworten mit Zitat Beitrag melden
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
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
Beiträge vom vorherigen Thema anzeigen:   
home home