Fractalul Mandelbrot

Mulțimea Mandelbrot este o mulțime de numere complexe c, astfel încât dacă iterăm funcția z=z^2+c, aceasta nu merge la infinit (începând cu z=0).

Mulțimea Mandelbrot se calculează astfel:
– pentru fiecare pixel c, începând cu z=0, se repetă z=z^2+c de N ori
– aceasta va eșua dacă magnitudinea lui z devine tot mai mare
– daca s-a terminat iterația, punctul probabil se află în interiorul mulțimii Mandelbrot; în caz contrar, punctul se află în exterior și va fi colorat în funcție de cât de multe iterații au fost efectuate
– Se eșuează dacă |z|>2, și ecuația va duce la infinit
– Numărul maxim de iterații, N, poate fi ales cât se dorește, de exemplu 100; cu cât N este mai mare, cu atât graficul va fi mai detaliat, dar va lua mai mult timp pentru a fi trasat.

De ce se începe cu z=0 ?

Zero este punctul critic a ecuației z^2+c, un punct unde d/dz (z^2+c) = 0. Dacă înlocuim z^2+c cu o altă funcție, valoarea de start va trebui să fie modificată. De ex. pentru z->z^2+z+c, punctul critic este dat de 2z+1, deci se va începe cu z=-1/2. Punctele critice sunt importante pentru că orice ciclu de atracție pentru o funcție polinomială sau rațională atrage cel puțin un punct de atracție. Deci testând punctele critice se arată dacă există orice ciclu de atracție stabil.

Care sunt marginile mulțimii ? Când diverg acestea ?

Mulțimea Mandelbrot se obține pentru valoare |z|<=2.
Daca |z| depășește 2, ecuația va diverge.
(daca |z|>2, atunci |z^2+c|>= |z^2|-|c|> 2|z|-|c|. Daca |z|>=|c|, atunci 2|z|-|c|> |z|; deci , daca |z|>2 si |z|>=c, |z^2+c|>|z|, astfel secvența crește)

Cum se realizează desenul?

Pentru a obține o imagine bidimensionala nu sunt dificultăți deoarece numerele complexe sunt bidimensionale. Ele constau din doua părți: una reală și una imaginară. Numerele complexe sunt desenate într-un sistem de coordonate cartezian, unde pe axa x este reprezentată partea reală a numărului, iar pe axa y partea imaginară a numărului. Aceasta se face atunci când se desenează mulțimea Mandelbrot. Desenăm numerele complexe într-un sistem de coordonate cartezian: daca c aparține mulțimii, desenăm punctul (în culoare neagră), la locația respectivă, în caz contrar nu (sau cu o altă culoare, în funcție de numărul de iterații).

Implementare

Java-Logo
Cod Sursa JAVA


/**
 *
 @version 1.0, DATE: 8.17.96
 @author Paul Santa Maria
 */
import java.applet.*;
import java.awt.*;              // User Interface components
//
// MandelPlot: Implements Mandelbrot plot
//
class MandelPlot extends Canvas
{
  private int maxcol = 399, maxrow = 399, max_colors = 8,
        max_iterations = 512, max_size = 4;
  private Color cmap[];
  private void plot (Graphics g, int x, int y, int color_index)
  {
    g.setColor (cmap[color_index]);
    g.drawLine (x,y, x,y);
  }
  // MandelPlot display image constructor
  public MandelPlot ()
  {
     cmap = new Color[max_colors];
     cmap[0= Color.black;
     cmap[1= Color.red;
     cmap[2= Color.green;
     cmap[3= Color.blue;
     cmap[4= Color.cyan;
     cmap[5= Color.magenta;
     cmap[6= Color.yellow;
     cmap[7= Color.white;
  }
  // paint: actually draws the Mandelbrot set
  public void paint (Graphics g)
  {
     float Q[] new float[400];
     double Pmax = 1.75,Pmin = -1.75, Qmax = 1.5, Qmin = -1.5,
        P, deltaP, deltaQ, X, Y, Xsquare, Ysquare;
     int color, row, col;
     deltaP = (Pmax - Pmin)/(double)(maxcol - 1);
     deltaQ = (Qmax - Qmin)/(double)(maxrow - 1);
     for (row=0; row<=maxrow; row++) {
       Q[row(float)(Qmin + row*deltaQ);
     }
     for (col=0; col<=maxcol; col++) {
       P = Pmin + col*deltaP;
       for (row=0; row<=maxrow; row++) {
         X = Y = 0.0;
         color = 0;
         for (color=0; color<max_iterations; color++) {
           Xsquare = X*X;
           Ysquare = Y*Y;
           if ((Xsquare+Ysquare> max_size)
             break;
           Y = 2*X*Y+Q[row];
           X = Xsquare-Ysquare+P;
         }
         plot (g, col, row, (int)(color % max_colors));
       }
     }
  }
}


import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Event;
//
// Mandel1: sample program "main"
//
public class Mandel1 extends Applet
{
  private MandelPlot canvas;
  // Mandel: Frame constructor
  public void init ()
  {
     setLayout (new BorderLayout());
     canvas = new MandelPlot ();
     add ("Center", canvas);
   }
  // handleEvent: give us a way to gracefully exit the program
  public boolean handleEvent (Event evt)
  if (evt.id == Event.WINDOW_DESTROY)
        System.exit (0);
     return false;
  }
}

Rezultat:
mandelbrot rezultat

Leave a comment