Magnus Karlsson



Källa: http://magnus-karlsson.nu/mandel/program.php

Matematik

Mandelbrot­mängden

Programmering

Att göra ett program som ritar mandelbrotmängden handlar i stort sett om att göra en loop som för varje punkt i koordinatsystemet räknar efter om talföljden konvergerar eller inte i denna punkt. Jag har skrivit koden för java, men det borde inte vara några större problem att översätta till valfritt programmeringsspråk.

Initiering

Vi börjar med att tilldela värden till koordinaterna för fönstrets storlek. Eftersom mandelbrotmängden ryms i ett område som är 3×3 underlättar det om man låter bilden vara 300×300 pixlar.


double  xmin = -2.25, xmax = 0.75,
        ymin = -1.5,  ymax = 1.5,
        steg = 0.01;             

Kärnan i programmet

Programmet går igenom hela bilden pixel för pixel. Varje pixel utgör ett värde på c i iterationsformeln zn+1 = zn² + c



//ange startpunkten för c. x=Re(c), y=Im(c)
double x = xmin, y = ymin;


for (int i=0; i<300; i++)  //gå igenom pixlarna i y-led
{
    for (int j=0; j<300; j++)  //gå igenom pixlarna i x-led
    {
        // Ange begynnelsevärde, vi ska starta i origo
        double a0 = 0.0, b0 = 0.0;
        
        // a1 och b1 är nästa värde i iterationen
        double  a1, b1,

        int counter = 0;  //nollställ räknaren

        do  //upprepa  Zn+1=Zn^2+c 
        {
            a1 = a0*a0 - b0*b0 + x;  //först realdelen
            b1 = 2*a0*b0 + y;        //och sedan imaginärdelen

            counter++;               //räkna upp räknaren

            a0 = a1;
            b0 = b1;      //byt Zn mot Zn+1
        }
        //Kontrollera om vi är färdiga
        while ( ((a1*a1+b1*b1) <= 4.0)&&(counter <= 100) );

        /*
        Här kommer kod som ger en viss färg till 
        pixel[i,j] beroende på värdet på counter
        Om counter=100 ska det vara svart 
        */

        x = x + steg; //gå till nästa punkt i raden
    }

    y = y + steg; //gå till nästa rad
    x = xmin; //gå till början på denna rad

} //nu skulle det vara klart

I "do while"-loopen utförs själva iterationen. Övertyga dig själv om att de beräkningar som utförs verkligen är riktiga!

Om färgsättningen

Att ge en färg till varje pixel beroende på hur många iterationer som behövdes för att avgöra dess öde kan man nog göra på väldigt många sätt. Färgsättningen i sig kan ju också diskuteras. Färgerna är ju baserade på RGB-systemet. Var och en av komponenteran RED, GREEN och BLUE kan tilldelas ett värde från 0 till 255 (FF hexadecimalt). Om alla tre komponenter är noll får man svart och om alla tre är 255 får man vitt. Genom att göra något lämpligt "case"-test på counter kan man stega sig igenom en färgskala som man tycker om.

Om du har frågor eller åsikter om koden får du gärna höra av dej via epost.

Lycka till med programmeringen!