Attribute VB_Name = "Module2" 'DEMO Domain of Mandelbrot ' J-P Moreau DefInt I-N Const bord = 150 Public incx As Single, incy As Single, P0 As Single, Q0 As Single Public x1 As Single, x2 As Single, y1 As Single, y2 As Single Public lim As Integer Dim compt As Integer Dim module As Single, x As Single, y As Single Dim aux As Single '*************************************************************************** '* FRACTALS: SET OF MANDELBROT * '* ----------------------------------------------------------------------- * '* 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 Single 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. * '* * '* ----------------------------------------------------------------------- * '* REFERENCE: * '* "Graphisme dans le plan et dans l'espace avec Turbo Pascal 4.0 * '* By R. Dony - MASSON, Paris 1990" [BIBLI 12]. * '* * '* Visual Basic 4.0 release by J-P Moreau * '* (to be used with gr2d.bas and Mandel.Frm) * '* (www.jpmoreau.fr) * '*************************************************************************** Sub Mandel() Dim colonne As Integer Donnees Form1.AutoRedraw = False Form1.Cls Fenetre x1, x2, y1, y2 cloture bord, MaxX - bord, bord, MaxY - bord Bordure Display 300, 300, "Domain of Mandelbrot" ch$ = "x1=" & CStr(x1) & " x2=" & CStr(x2) & " y1=" & CStr(y1) ch$ = ch$ & " y2=" & CStr(y2) & " Lim=" & CStr(lim) Display 2200, 5600, ch$ 'main loop to display Mandelbrot man column by column 'with a symmetry with respect to 0x axis colonne = bord While colonne <= MaxX - bord P0 = x1 + colonne * incx ligne = bord While ligne <= (MaxY - bord) / 4 Q0 = y1 + ligne * incy x = 0: y = 0 compt = 1: module = 0 While compt <= lim And module < 4 aux = x x = x * x - y * y + P0 y = 2# * y * aux + Q0 module = x * x + y * y compt = compt + 1 Wend If module < 4 Then 'in physical coordiantes 'MoveXY P0, Q0: LineXY P0 + incx, Q0 'MoveXY P0, -Q0: LineXY P0 + incx, -Q0 'directly in screen pixels (faster?) Form1.Line (colonne, 2 * ligne)-(colonne + 1, 2 * ligne) Form1.Line (colonne, MaxY - 2 * bord - 2 * ligne)-(colonne + 1, MaxY - 2 * bord - 2 * ligne) End If ligne = ligne + 2 Wend colonne = colonne + 1 Wend End Sub Sub Donnees() x1 = -1.8: x2 = 0.5 y1 = -1#: y2 = 1# lim = 50 MaxX = 8300: MaxY = 6000 incx = (x2 - x1) / (MaxX - 2 * bord) incy = 2 * (y2 - y1) / (MaxY - 2 * bord) End Sub