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.