{************************************************************************** * FRACTALS: SET OF JULIA * * ----------------------------------------------------------------------- * * TUTORIAL: * * * * PRELIMINARY: THE SET OF MANDELBROT (see program mandel.pas) * * * * The set of Mandelbrot is a figure in the complex plane, that is (for no * * mathematicians) the plane allowing to represent complex numbers having * * the form a + i b, a is the real part (ox componant) and b is the * * imaginary part (oy componant). The imaginary number i is the unity of * * axis oy, defined as i x i = -1. In the following, we will use the * * multiplication of two complex numbers and the module value of a complex * * number before defining the set of Mandelbrot itself. * * * * Multiply z1 by z2 * * * * Let be z1 = a1 + i b1 and z2 = a2 + i b2, two complex numbers. To cal- * * culate Z = z1 x z2, one just has to algebraically develop the expression* * (a1 + i b1)*(a2 + i b2), replacing i² by -1 and sepatating constant * * terms from i terms. One easily obtains: * * * * Z = (a² - b²) + i (2ab) * * * * Module of a complex number * * * * Every complex number a + i b can be represented as the point of coordi- * * nates (a, b) in the complex plane. Its module is nothing other than the * * distance of this point from origin (0,0), that is to say: * * * * | Z | = square root of (a² + b²) * * * * We can now define the iterative process that will lead us to the magni- * * ficent "Set of Mandelbrot": * * * * We take, as a starting point, a fixed complex number c, and we calculate* * the complex expression z² + c, z being a variable complex number. * * Let us take z = 0, then z² + c equals c. Let us replace z by c in the * * formula z² + c, then we obtain c² + c. Let us again remplace z by this * * new value, then we obtain (c²+c)² + c. Such a process is indefinitly * * resumed, each new value z² + c is taken as new value z. This provides * * an unlimited series of z numbers. * * * * The mathematician Mandelbrot was the first to notice that, according to * * the chosen value c, the series of complex numbers z so obtained could * * have a module, either rapidly tending towards infinity, or tending * * towards a finite value, whatever the number of iterations may be. * * * * Two examples: * * * * 1) c = 1 + i * * * * iteration new z module of z * * ____________________________________________ * * 1 1 + 3i 3,16227... * * 2 -7 + 7i 9,89949... * * 3 1-97i 97,00515... * * 4 -9407-193i 9408,97965 * * * * The module of z increases very rapidly. * * * * 2) c = -1 + 0,25 i * * * * iteration new z module de z * * ____________________________________________ * * 1 -0,5 - 0i 0,5 * * 2 -0,25 + 0,5i 0,55902... * * 3 -0,687 + 0,25i 0,73154... * * * * At 80th iteration, z = 0.40868 + 0,27513 i, the module equals 0,49266...* * The module remains with a finite value, whatever the number of itera- * * tions may be. Practically, we will consider that the limit is obtained * * after 100 iterations, if the module of z is < 4. The set of Mandelbrot, * * still called the Mandelbrot man, because of its shape, is constituted * * by all the points for which the expression z² + c has a finite value * * whatever the number of iterations may be. * * * * * * SET OF JULIA * * * * If you take as a rule to fix the value of complex number c and to make * * vary the starting value of complex number z, you define a new set, * * different from the previous set of Mandelbrot, called Set of Julia, * * after the name of a french mathematician who studied it forst. Each new * * c value injected into the iterative formula z² + c generates a new set * * of Julia which are in unlimited amount. These sets of Julia can have * * amazingly different forms according to the starting value. * * * * If the starting point c is chosen inside the main body of the Mandelbrot* * man, then the corresponding set of Julia is in one single part. * * According to other possible starting points, the set of Julia can have * * the form of an infinity of so called fractal circles, or a "dendritic" * * line (with many ramifications), or can be composed of several parts. * * At the limit, if c is far away from the Mandelbrot man's body, the set * * of Julia is reduced to a "dust" of points, called "Fatou's dust" after * * the name of another french mathematicians. * * * * The program asks for the following parameters: * * * * x1, x2: interval for ox axis * * y1, y2: interval for oy axis * * Lim : maximum number of iterations * * p, q : coordinates of starting point c * * * * Some interesting examples: * * * * (Dragon shape) * * x1 = -1.5 x2 = 1.5 * * y1 = -1.5 y2 = 1.5 Lim = 200 * * p = 0.32 q = 0.043 * * * * (Jewel shape) * * x1 = -1.8 x2 = 1.8 * * y1 = -1.8 y2 = 1.8 Lim = 200 * * p = -0.74543 q = 0.11301 * * * * (cactus shape) * * x1 = -1.4 x2 = 1.4 * * y1 = -1.4 y2 = 1.4 Lim = 200 * * p = -0.12 q = 0.74 * * * * Up to you to discover other ones ! * * ----------------------------------------------------------------------- * * REFERENCE: * * "Graphisme dans le plan et dans l'espace avec Turbo Pascal 4.0 * * By R. Dony - MASSON, Paris 1990" [BIBLI 12]. * * * * TPW version by J-P Moreau * * (www.jpmoreau.fr) * **************************************************************************} Program Set_of_julia; Uses WinCrtMy,WinTypes,WinProcs,WObjects,Strings,Type_Def,CrtGr2D; Var x1,x2,y1,y2,incX,incY,p,q: real_ar; indice,limite:byte; CrtPen : HPen; {blue pen} Procedure Data; begin WinCrtInit('JULIA'); clrscr; writeln; writeln(' SET OF JULIA'); writeln(' ------------'); writeln; writeln; write(' Interval X1, X2: '); readln(x1,x2); writeln; write(' Interval Y1, Y2: '); readln(y1,y2); writeln; write(' Number of iterations: '); readln(limite); writeln; write(' Starting values (Xc, Yc): '); readln(p,q); incX:=(x2-x1)/(MaxX*1.0); incY:=(y2-y1)/(MaxY*1.0); end; PROCEDURE Draw_Julia; {draw a set of Julia} VAR compt: INTEGER; module,x,y,aux,xx,yy: REAL_AR; BEGIN CrtPen:=CreatePen(ps_Solid,1,RGB(0,0,255)); SelectObject(CrtDC,CrtPen); Clrscr; Fenetre(x1,x2,y1,y2); Cloture(10,MaxX-25,80,MaxY-10); Bordure(CrtDc); xx:=x1; WHILE xx <= x2 DO BEGIN yy:=y1; WHILE yy <= 0 DO BEGIN compt:=0; module:=0; x:=xx; y:=yy; WHILE (compt <= limite) AND (module <= 4) DO BEGIN aux:=x; x:=x*x-y*y+p; y:=2*y*aux+q; module:=x*x+y*y; inc(compt) END; IF module <= 4 THEN BEGIN MoveXY(CrtDC,-xx,-yy); LineXY(CrtDC,-xx+incX,-yy); MoveXY(CrtDC,xx,yy); LineXY(CrtDC,xx+incX,yy); END; yy:=yy+incY END; xx:=xx+incX END; TextOut(CrtDC,25,15,'SET OF JULIA',12); SortieGraphique END; {main program} Begin rep:='o'; Repeat Data; Draw_Julia Until rep='n'; DeleteObject(CrtPen); DoneWinCrt End. {end of file julia.pas}