Допустим у меня есть фрактал.
вот программа его рисующая. (функцию взял для примера z*z*z+c*c-c*z ):

{$mode objfpc}
{$apptype gui}
program Complex_Graph;
uses
graph, wincrt;

type
tfloat = extended;

tcomplex = record // x+yi
cmplx_x, cmplx_y :tfloat;
end;

function complex (re, im: tfloat ): tcomplex;
begin
with result do begin
cmplx_x:=re;
cmplx_y:=im;
end;
end;


operator + ( const cmx_1, cmx_2 : tcomplex ) r:tcomplex;
begin
r.cmplx_x:=cmx_1.cmplx_x+cmx_2.cmplx_x;
r.cmplx_y:=cmx_1.cmplx_y+cmx_2.cmplx_y;
end;


operator - ( const cmx_1, cmx_2 : tcomplex ) r:tcomplex;
begin
r.cmplx_x:=cmx_1.cmplx_x-cmx_2.cmplx_x;
r.cmplx_y:=cmx_1.cmplx_y-cmx_2.cmplx_y
end;

operator * ( const cmx_1, cmx_2 : tcomplex ) r:tcomplex;
begin
r.cmplx_x:=cmx_1.cmplx_x*cmx_2.cmplx_x - cmx_1.cmplx_y*cmx_2.cmplx_y;
r.cmplx_y:=cmx_1.cmplx_x*cmx_2.cmplx_y + cmx_1.cmplx_y*cmx_2.cmplx_x
end;


Const
iter = 50;
max = 16;

var
z,c: tcomplex;
cancel:boolean;
gd,gm:smallint;
mx,my,x,y:longint;
n:integer;
dx,dy,zoomx, zoomy: tfloat;
ch:char;
begin
gd := Detect;
Cancel := False;
zoomx := 0.005;
zoomy := 0.005;
dx := 0.0;
dy := 0.0;
Randomize; InitGraph(gd,gm,'');
Mx := GetMaxX div 2;
My := GetMaxY div 2;
repeat
cleardevice;
For y := -my to my do
For x := -mx to mx do Begin
n := 0;
c:=complex (x *zoomx+dx, y*zoomy +dy);
z:=complex (0, 0 );
While (sqr(z.cmplx_x) + sqr(z.cmplx_Y) < max) and (n < iter) do Begin
z:=z*z*z+c*c-c*z;
Inc(n);
// If keypressed then cancel := true;
End;
If n < iter then Begin
PutPixel(mx + x,my + y,31 - (n mod 16));
End;
//If cancel then exit;
End;
ch:=Readkey;
{
...
}
until (ch='e') or (ch=#13);
CloseGraph;
end.

Вопрос.
Допустим я произвольно выделю на экране прямоугольник x1,y1,x2,y2
как подсчитать коэффициенты dx, dy, zoomx, zoomy (проще говоря смещение и увеличение ),
при которых кусок фрактала, попавший в прямоугольник отразиться на весь экран ? mega_chok.gif
Спасибо smile.gif

p.s. пример. вот выведенный фрактал. Допустим я хочу нарисовать на весь экран выделенный фрагмент.
Нажмите для просмотра прикрепленного файла