procedure DrawEllipseMidpoint(xc, yc, rx, ry: Integer);
var
x, y: Int64;
rx2, ry2: Int64;
twoRx2, twoRy2: Int64;
px, py: Int64;
p: Int64;
begin
x := 0;
y := ry;
rx2 := rx * rx;
ry2 := ry * ry;
twoRx2 := 2 * rx2;
twoRy2 := 2 * ry2;
// Region 1
p := Round(ry2 - (rx2 * ry) + (0.25 * rx2));
px := 0;
py := twoRx2 * y;
while px < py
do
begin
// 4-fache Symmetrie
DrawPixel(xc + x, yc + y);
DrawPixel(xc - x, yc + y);
DrawPixel(xc + x, yc - y);
DrawPixel(xc - x, yc - y);
Inc(x);
px := px + twoRy2;
if p < 0
then
p := p + ry2 + px
else
begin
Dec(y);
py := py - twoRx2;
p := p + ry2 + px - py;
end;
end;
// Region 2
p := Round(ry2 * (x + 0.5) * (x + 0.5) + rx2 * (y - 1) * (y - 1) - rx2 * ry2);
px := twoRy2 * x;
py := twoRx2 * y;
while y >= 0
do
begin
// 4-fache Symmetrie
DrawPixel(xc + x, yc + y);
DrawPixel(xc - x, yc + y);
DrawPixel(xc + x, yc - y);
DrawPixel(xc - x, yc - y);
Dec(y);
py := py - twoRx2;
if p > 0
then
p := p + rx2 - py
else
begin
Inc(x);
px := px + twoRy2;
p := p + rx2 - py + px;
end;
end;
end;