Danke für alle Antworten,
ich habe es mittlerweile geschafft den code von Bresenham umzuschreiben. Ich poste ihn mal hier falls Interesse besteht.
Code: Alles auswählen
if (circle) and (x1<>x) and (y1<>y) then//abfrage was der Benuter zeichnen möchte
begin
a:=round(abs((x-x1)/2)); //a:=Halbachsenlänge x
b:=round(abs((y-y1)/2)); //b:=Halbachsenlänge y
if x<x1 then
begin
xm:=x+a //xm:=Mittelpunk x
end else
begin
xm:=x1+a
end;
if y<y1 then //ym:=Mittelpunkt y
begin
ym:=y+b
end else
begin
ym:=y1+b
end;
a2:=a*a; //implementierung
b2:=b*b;
err:=b2-(2*b-1)*a2;
dx:=0;
dy:=b;
while (dy>=0) do
begin
Feld[xm+dx,ym+dy].Groundtyp:=1; //Zeichnen (nur die ersten 4 sind wichtig
Feld[xm-dx,ym+dy].Groundtyp:=1; //die andern 4 sind dazu da das nicht das
Feld[xm-dx,ym-dy].Groundtyp:=1; //ganze Feld neu gezeichnet wird
Feld[xm+dx,ym-dy].Groundtyp:=1;
Feld[xm+dx,ym+dy].AEnderung:=true;
Feld[xm-dx,ym+dy].AEnderung:=true;
Feld[xm-dx,ym-dy].AEnderung:=true;
Feld[xm+dx,ym-dy].AEnderung:=true;
e2:=err+err; //Ermittlung der einzufärbenden Pixel
if (e2<(2*dx+1*b2)) then
begin
dx:=dx+1;
err:=err+(2*dx+1)*b2;
end;
if (e2> -(2*dy-1)*a2) then
begin
dy:=dy-1;
err:=err-(2*dy-1)*a2;
end;
end;
//folgender code wird in dem Algorythmus von Bresenahm als correkter verwendet
//führt aber bei meinem Beispiel nur zu abstürtzen, konnte auch ohne diesen
//code keinen Fehler endecken.
//while (dx+1 <a) do
//begin
// Feld[xm+dx,ym].Groundtyp:=1;
// Feld[xm-dx,ym].Groundtyp:=1;
// Feld[xm+dx,ym].AEnderung:=true;
// Feld[xm-dx,ym].AEnderung:=true;
//end;
end; //circle end
edit: in meinem Programm zieht man die Maus um so ein 4eck zu erzeugen in dem die Ellipse gezeichnet wird. x1,y1,x,y sind dabei die Koordinaten der Eckpunkte des 4ecks. Man muss natürlich auch noch eine draw funktion für das Array erstellen, meine sieht so aus:
Code: Alles auswählen
procedure TEditor.draw;
var
i,j:integer;
begin
for i := 1 to 480 do
begin for j := 1 to 320 do
begin
if Feld[i,j].AEnderung then
begin
case Feld[i,j].Groundtyp of
0:imFeld.Canvas.Draw(i,j,bmpweiss);
1:imFeld.Canvas.Draw(i,j,bmpschwarz);
end;
Feld[i,j].AEnderung:=false;
end;
end;
end;
end;