Palux, держи исходник для начала... Учти, при больших значениях радиуса будет притормаживать. И попробуй (если это не устроит) переделать, как тебе нужно... ;)
Код
uses crt, graph;
var
buffer: array[1 .. 10000] of byte;
curr: integer;
procedure get_square(x, y, r: integer);
var ix, iy: integer;
begin
setactivepage(0);
curr := 0;
for iy := y - r to y + r do
for ix := x - r to x + r do begin
inc(curr);
buffer[curr] := getpixel(ix, iy);
end;
setactivepage(1);
end;
procedure put_circle(x, y, r: longint);
var ix, iy: integer;
begin
curr := 0;
for iy := y - r to y + r do
for ix := x - r to x + r do begin
inc(curr);
if (sqr(x - ix) + sqr(y - iy) <= sqr(r) then
putpixel(ix, iy, buffer[curr]);
end;
end;
procedure darkcircle(x, y, r: integer);
begin
setfillstyle(solidfill, black);
bar(x - r, y - r, x + r, y + r);
end;
var
gd, gm: integer;
x, y, i: integer;
const r = 20;
begin
Gd := ega;
Gm := egahi;
InitGraph(Gd, Gm, '');
If GraphResult <> grOk Then Halt(1);
SetActivePage(0);
SetVisualPage(0);
Repeat
SetColor (Random(15));
Line (Random(GetMaxX-2)+1,Random(GetMaxY-2)+1,
Random(GetMaxX-2)+1,Random(GetMaxY-2)+1);
Until KeyPressed;
while keypressed do readkey;
SetActivePage(1);
SetVisualPage(1);
x := getmaxx div 2; y := getmaxy div 2;
repeat
get_square(x, y, r);
put_circle(x, y, r);
delay(22000);
darkcircle(x, y, r);
inc(x, 10);
Until KeyPressed;
while keypressed do readkey;
closegraph;
end.