Mandelbrot set

From Rosetta Code
This page uses content from Wikipedia. The original article was at Mandelbrot_set. The list of authors can be seen in the page history. As with Rosetta Code, the text of Wikipedia is available under the GNU FDL. (See links for details on variance)
Task
Mandelbrot set
You are encouraged to solve this task according to the task description, using any language you may know.


Task

Generate and draw the Mandelbrot set.


Note that there are many algorithms to draw Mandelbrot set and there are many functions which generate it .

11l[edit]

Translation of: Python
F mandelbrot(a)
   R (0.<50).reduce(0i, (z, _) -> z * z + @a)

F step(start, step, iterations)
   R (0 .< iterations).map(i -> @start + (i * @step))

V rows = (step(1, -0.05, 41).map(y -> (step(-2.0, 0.0315, 80).map(x -> (I abs(mandelbrot(x + 1i * @y)) < 2 {‘*’} E ‘ ’)))))
print(rows.map(row -> row.join(‘’)).join("\n"))

ACL2[edit]

(defun abs-sq (z)
   (+ (expt (realpart z) 2)
      (expt (imagpart z) 2)))

(defun round-decimal (x places)
   (/ (floor (* x (expt 10 places)) 1)
      (expt 10 places)))

(defun round-complex (z places)
   (complex (round-decimal (realpart z) places)
            (round-decimal (imagpart z) places)))

(defun mandel-point-r (z c limit)
   (declare (xargs :measure (nfix limit)))
   (cond ((zp limit) 0)
         ((> (abs-sq z) 4) limit)
         (t (mandel-point-r (+ (round-complex (* z z) 15) c)
                            c
                            (1- limit)))))

(defun mandel-point (z iters)
   (- 5 (floor (mandel-point-r z z iters) (/ iters 5))))

(defun draw-mandel-row (im re cols width iters)
   (declare (xargs :measure (nfix cols)))
   (if (zp cols)
       nil
       (prog2$ (cw (coerce
                    (list
                     (case (mandel-point (complex re im)
                                         iters)
                           (5 #\#)
                           (4 #\*)
                           (3 #\.)
                           (2 #\.)
                           (otherwise #\Space))) 'string))
               (draw-mandel-row im
                                (+ re (/ (/ width 3)))
                                (1- cols)
                                width iters))))

(defun draw-mandel (im rows width height iters)
   (if (zp rows)
       nil
       (progn$ (draw-mandel-row im -2 width width iters)
               (cw "~%")
               (draw-mandel (- im (/ (/ height 2)))
                            (1- rows)
                            width
                            height
                            iters))))

(defun draw-mandelbrot (width iters)
   (let ((height (floor (* 1000 width) 3333)))
        (draw-mandel 1 height width height iters)))
Output:
> (draw-mandelbrot 60 100)
                                        #                   
                                     ..                     
                                   .####                    
                            .     # .##.                    
                             ##*###############.            
                           #.##################             
                          .######################.          
                 ######.  #######################           
               ##########.######################            
##############################################              
               ##########.######################            
                 ######.  #######################           
                          .######################.          
                           #.##################             
                             ##*###############.            
                            .     # .##.                    
                                   .####                    
                                     ..                     

Ada[edit]

Library: Lumen

mandelbrot.adb:

with Lumen.Binary;
package body Mandelbrot is
   function Create_Image (Width, Height : Natural) return Lumen.Image.Descriptor is
      use type Lumen.Binary.Byte;
      Result : Lumen.Image.Descriptor;
      X0, Y0 : Float;
      X, Y, Xtemp : Float;
      Iteration   : Float;
      Max_Iteration : constant Float := 1000.0;
      Color : Lumen.Binary.Byte;
   begin
      Result.Width := Width;
      Result.Height := Height;
      Result.Complete := True;
      Result.Values := new Lumen.Image.Pixel_Matrix (1 .. Width, 1 .. Height);
      for Screen_X in 1 .. Width loop
         for Screen_Y in 1 .. Height loop
            X0 := -2.5 + (3.5 / Float (Width) * Float (Screen_X));
            Y0 := -1.0 + (2.0 / Float (Height) * Float (Screen_Y));
            X := 0.0;
            Y := 0.0;
            Iteration := 0.0;
            while X * X + Y * Y <= 4.0 and then Iteration < Max_Iteration loop
               Xtemp := X * X - Y * Y + X0;
               Y := 2.0 * X * Y + Y0;
               X := Xtemp;
               Iteration := Iteration + 1.0;
            end loop;
            if Iteration = Max_Iteration then
               Color := 255;
            else
               Color := 0;
            end if;
            Result.Values (Screen_X, Screen_Y) := (R => Color, G => Color, B => Color, A => 0);
         end loop;
      end loop;
      return Result;
   end Create_Image;

end Mandelbrot;

mandelbrot.ads:

with Lumen.Image;

package Mandelbrot is

   function Create_Image (Width, Height : Natural) return Lumen.Image.Descriptor;

end Mandelbrot;

test_mandelbrot.adb:

with System.Address_To_Access_Conversions;
with Lumen.Window;
with Lumen.Image;
with Lumen.Events;
with GL;
with Mandelbrot;

procedure Test_Mandelbrot is

   Program_End : exception;

   Win : Lumen.Window.Handle;
   Image : Lumen.Image.Descriptor;
   Tx_Name : aliased GL.GLuint;
   Wide, High : Natural := 400;

   -- Create a texture and bind a 2D image to it
   procedure Create_Texture is
      use GL;

      package GLB is new System.Address_To_Access_Conversions (GLubyte);

      IP : GLpointer;
   begin  -- Create_Texture
      -- Allocate a texture name
      glGenTextures (1, Tx_Name'Unchecked_Access);

      -- Bind texture operations to the newly-created texture name
      glBindTexture (GL_TEXTURE_2D, Tx_Name);

      -- Select modulate to mix texture with color for shading
      glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

      -- Wrap textures at both edges
      glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
      glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

      -- How the texture behaves when minified and magnified
      glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
      glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

      -- Create a pointer to the image.  This sort of horror show is going to
      -- be disappearing once Lumen includes its own OpenGL bindings.
      IP := GLB.To_Pointer (Image.Values.all'Address).all'Unchecked_Access;

      -- Build our texture from the image we loaded earlier
      glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, GLsizei (Image.Width), GLsizei (Image.Height), 0,
                    GL_RGBA, GL_UNSIGNED_BYTE, IP);
   end Create_Texture;

   -- Set or reset the window view parameters
   procedure Set_View (W, H : in Natural) is
      use GL;
   begin  -- Set_View
      GL.glEnable (GL.GL_TEXTURE_2D);
      glClearColor (0.8, 0.8, 0.8, 1.0);

      glMatrixMode (GL_PROJECTION);
      glLoadIdentity;
      glViewport (0, 0, GLsizei (W), GLsizei (H));
      glOrtho (0.0, GLdouble (W), GLdouble (H), 0.0, -1.0, 1.0);

      glMatrixMode (GL_MODELVIEW);
      glLoadIdentity;
   end Set_View;

   -- Draw our scene
   procedure Draw is
      use GL;
   begin  -- Draw
      -- clear the screen
      glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
      GL.glBindTexture (GL.GL_TEXTURE_2D, Tx_Name);

      -- fill with a single textured quad
      glBegin (GL_QUADS);
      begin
         glTexCoord2f (1.0, 0.0);
         glVertex2i (GLint (Wide), 0);

         glTexCoord2f (0.0, 0.0);
         glVertex2i (0, 0);

         glTexCoord2f (0.0, 1.0);
         glVertex2i (0, GLint (High));

         glTexCoord2f (1.0, 1.0);
         glVertex2i (GLint (Wide), GLint (High));
      end;
      glEnd;

      -- flush rendering pipeline
      glFlush;

      -- Now show it
      Lumen.Window.Swap (Win);
   end Draw;

   -- Simple event handler routine for keypresses and close-window events
   procedure Quit_Handler (Event : in Lumen.Events.Event_Data) is
   begin  -- Quit_Handler
      raise Program_End;
   end Quit_Handler;

   -- Simple event handler routine for Exposed events
   procedure Expose_Handler (Event : in Lumen.Events.Event_Data) is
      pragma Unreferenced (Event);
   begin  -- Expose_Handler
      Draw;
   end Expose_Handler;

   -- Simple event handler routine for Resized events
   procedure Resize_Handler (Event : in Lumen.Events.Event_Data) is
   begin  -- Resize_Handler
      Wide := Event.Resize_Data.Width;
      High := Event.Resize_Data.Height;
      Set_View (Wide, High);
--        Image := Mandelbrot.Create_Image (Width => Wide, Height => High);
--        Create_Texture;
      Draw;
   end Resize_Handler;

begin
   -- Create Lumen window, accepting most defaults; turn double buffering off
   -- for simplicity
   Lumen.Window.Create (Win           => Win,
                        Name          => "Mandelbrot fractal",
                        Width         => Wide,
                        Height        => High,
                        Events        => (Lumen.Window.Want_Exposure  => True,
                                          Lumen.Window.Want_Key_Press => True,
                                          others                      => False));

   -- Set up the viewport and scene parameters
   Set_View (Wide, High);

   -- Now create the texture and set up to use it
   Image := Mandelbrot.Create_Image (Width => Wide, Height => High);
   Create_Texture;

   -- Enter the event loop
   declare
      use Lumen.Events;
   begin
      Select_Events (Win   => Win,
                     Calls => (Key_Press    => Quit_Handler'Unrestricted_Access,
                               Exposed      => Expose_Handler'Unrestricted_Access,
                               Resized      => Resize_Handler'Unrestricted_Access,
                               Close_Window => Quit_Handler'Unrestricted_Access,
                               others       => No_Callback));
   end;
exception
   when Program_End =>
      null;
end Test_Mandelbrot;
Output:

Ada Mandelbrot.gif

ALGOL 68[edit]

Plot part of the Mandelbrot set as a pseudo-gif image.

 
INT pix = 300, max iter = 256, REAL zoom = 0.33 / pix;
[-pix : pix, -pix : pix] INT plane;
COMPL ctr = 0.05 I 0.75 # center of set #;

# Compute the length of an orbit. #
PROC iterate = (COMPL z0) INT:
  BEGIN COMPL z := 0, INT iter := 1;
        WHILE (iter +:= 1) < max iter # not converged # AND ABS z < 2 # not diverged #
        DO z := z * z + z0
        OD;
        iter
  END;

# Compute set and find maximum orbit length. #     
INT max col := 0;
FOR x FROM -pix TO pix
DO FOR y FROM -pix TO pix
   DO COMPL z0 = ctr + (x * zoom) I (y * zoom);
      IF (plane [x, y] := iterate (z0)) < max iter
      THEN (plane [x, y] > max col | max col := plane [x, y])
      FI
   OD
OD;

# Make a plot. #
FILE plot;
INT num pix = 2 * pix + 1;
make device (plot, "gif", whole (num pix, 0) + "x" + whole (num pix, 0));
open (plot, "mandelbrot.gif", stand draw channel);
FOR x FROM -pix TO pix
DO FOR y FROM -pix TO pix
   DO INT col = (plane [x, y] > max col | max col | plane [x, y]);
      REAL c = sqrt (1- col / max col); # sqrt to enhance contrast #
      draw colour (plot, c, c, c);
      draw point (plot, (x + pix) / (num pix - 1), (y + pix) / (num pix  - 1))
   OD
OD;
close (plot)

ALGOL W[edit]

Generates an ASCII Mandelbrot Set. Translated from the sample program in the Compiler/AST Interpreter task.

begin
    % -- This is an integer ascii Mandelbrot generator, translated from the   %
    % -- Compiler/AST Interpreter Task's ASCII Mandelbrot Set example program %
    integer leftEdge, rightEdge, topEdge, bottomEdge, xStep, yStep, maxIter;
    leftEdge   := -420;
    rightEdge  :=  300;
    topEdge    :=  300;
    bottomEdge := -300;
    xStep      :=    7;
    yStep      :=   15;
 
    maxIter    :=  200;
 
    for y0 := topEdge step - yStep until bottomEdge do begin
        for x0 := leftEdge step xStep until rightEdge do begin
            integer x, y, i;
            string(1) theChar;
            y := 0;
            x := 0;
            theChar := " ";
            i := 0;
            while i < maxIter do begin
                integer x_x, y_y;
                x_x := (x * x) div 200;
                y_y := (y * y) div 200;
                if x_x + y_y > 800 then begin
                    theChar := code( decode( "0" ) + i );
                    if i > 9 then theChar := "@";
                    i := maxIter
                end;
                y := x * y div 100 + y0;
                x := x_x - y_y + x0;
                i := i + 1
            end while_i_lt_maxIter ;
            writeon( theChar );
        end for_x0 ;
        write();
    end for_y0
end.
Output:
1111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222211111
1111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222211
1111111111111111112222222222222222222222222222222222222222222222222222222222222222222222222222222222222
1111111111111111222222222222222222233333333333333333333333222222222222222222222222222222222222222222222
1111111111111112222222222222333333333333333333333333333333333333222222222222222222222222222222222222222
1111111111111222222222233333333333333333333333344444456655544443333332222222222222222222222222222222222
1111111111112222222233333333333333333333333444444445567@@6665444444333333222222222222222222222222222222
11111111111222222333333333333333333333334444444445555679@@@@7654444443333333222222222222222222222222222
1111111112222223333333333333333333333444444444455556789@@@@98755544444433333332222222222222222222222222
1111111122223333333333333333333333344444444445556668@@@    @@@76555544444333333322222222222222222222222
1111111222233333333333333333333344444444455566667778@@      @987666555544433333333222222222222222222222
111111122333333333333333333333444444455556@@@@@99@@@@@@    @@@@@@877779@5443333333322222222222222222222
1111112233333333333333333334444455555556679@   @@@               @@@@@@ 8544333333333222222222222222222
1111122333333333333333334445555555556666789@@@                        @86554433333333322222222222222222
1111123333333333333444456666555556666778@@ @                         @@87655443333333332222222222222222
111123333333344444455568@887789@8777788@@@                            @@@@65444333333332222222222222222
111133334444444455555668@@@@@@@@@@@@99@@@                              @@765444333333333222222222222222
111133444444445555556778@@@         @@@@                                @855444333333333222222222222222
11124444444455555668@99@@             @                                 @655444433333333322222222222222
11134555556666677789@@                                                @86655444433333333322222222222222
111                                                                 @@876555444433333333322222222222222
11134555556666677789@@                                                @86655444433333333322222222222222
11124444444455555668@99@@             @                                 @655444433333333322222222222222
111133444444445555556778@@@         @@@@                                @855444333333333222222222222222
111133334444444455555668@@@@@@@@@@@@99@@@                              @@765444333333333222222222222222
111123333333344444455568@887789@8777788@@@                            @@@@65444333333332222222222222222
1111123333333333333444456666555556666778@@ @                         @@87655443333333332222222222222222
1111122333333333333333334445555555556666789@@@                        @86554433333333322222222222222222
1111112233333333333333333334444455555556679@   @@@               @@@@@@ 8544333333333222222222222222222
111111122333333333333333333333444444455556@@@@@99@@@@@@    @@@@@@877779@5443333333322222222222222222222
1111111222233333333333333333333344444444455566667778@@      @987666555544433333333222222222222222222222
1111111122223333333333333333333333344444444445556668@@@    @@@76555544444333333322222222222222222222222
1111111112222223333333333333333333333444444444455556789@@@@98755544444433333332222222222222222222222222
11111111111222222333333333333333333333334444444445555679@@@@7654444443333333222222222222222222222222222
1111111111112222222233333333333333333333333444444445567@@6665444444333333222222222222222222222222222222
1111111111111222222222233333333333333333333333344444456655544443333332222222222222222222222222222222222
1111111111111112222222222222333333333333333333333333333333333333222222222222222222222222222222222222222
1111111111111111222222222222222222233333333333333333333333222222222222222222222222222222222222222222222
1111111111111111112222222222222222222222222222222222222222222222222222222222222222222222222222222222222
1111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222211
1111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222211111

Amazing Hopper[edit]

Generate part of the Mandelbrot set as a binary-file. The generated file is binary, and the graph can be made with Matlab's "imshow" function.

Hopper-code & macros Version:

 
#!/usr/bin/hopper

#include <hopper.h>

main:
ancho=500
alto=500
min real=-2
minReal=minreal
min complex=-2
max real = 2
max complex = 2

mandel=0,{ancho,alto}nanarray(mandel)

i=1,a2=0,b2=0,a=0,b=0,t1=0,t2=0
{","}toksep
tic(t1)

for(i=1,{i} le than (ancho),++i)

   for(j=1,{j} le than (alto),++j)

       {minreal} PLUS ( {max real}, minus (minReal), MUL BY ({i}minus(1)),  DIV BY ({ancho}minus(1))),mov(a) 
       {min complex} PLUS ( {maxcomplex}, minus (mincomplex), MULBY ({j} minus(1)),DIVBY ({alto} minus (1)) ),mov(b)
       a2=a,b2=b,brillo=1
   
       k=100
       __iterador__:

            sqrdiff(a,b), plus (a2)
            {2} mulby (a), mulby (b), plus (b2)
            mov(b),mov(a)

            if( {a,b} sqr add, gthan (4)) 
               brillo=0, jmp(__out__) 
            endif
            k--,jnz(__iterador__)

       __out__:

       [j,i]{brillo}put(mandel)
   next
next
toc(t1,t2)
{"TIME = ",t2,"\n"}print
{mandel,"mandel.dat"}save
{0}return

Hopper-Basic high level language version:

#!/usr/bin/hopper

#include <hopper.h>

main:
   ancho=500
   alto=500
   min real=-2
   min complex=-2
   max real = 2
   max complex = 2
   mandel=0,{ancho,alto}nanarray(mandel)
   t1=0,t2=0
   tic(t1)
#hl{
   i=1
   while(i<=ancho)
      j=1
      while(j<=alto)
         a=min real + ((max real-min real) * (i-1)/(ancho-1))
         b=min complex+((maxcomplex-mincomplex)*(j-1)/(alto-1))
         a2=a
         b2=b
         k=0
         brillo=1
         while ( k<100 )
            a1 = sqrdiff(a,b)
            b1 = mul all(2,a,b)
            a = a1 +a2
            b = b1 + b2
            if ( (sqradd(a,b)) > 4 )
               brillo=0
               break
            end if
            k+=1
         wend
         mandel[j,i]=brillo
         j+=1
      wend
      i+=1
   wend
   }
   toc(t1,t2)
   {"TIME = ",t2,"\n"}print
   {","}toksep
   {mandel,"mandel.dat"}save
{0}return


Arturo[edit]

Translation of: Nim
inMandelbrot?: function [c][
    z: to :complex [0 0]
    do.times: 50 [
        z: c + z*z
        if 4 < abs z -> return false
    ]
    return true
]

mandelbrot: function [settings][
    y: 0
    while [y < settings\height][
        Y: settings\yStart + y * settings\yStep
        x: 0
        while [x < settings\width][
            X: settings\xStart + x * settings\xStep
            if? inMandelbrot? to :complex @[X Y] -> prints "*"
            else -> prints " "
            x: x + 1
        ]
        print ""
        y: y + 1
    ]
]

mandelbrot #[ yStart: 1.0 yStep: neg 0.05 
              xStart: neg 2.0 xStep: 0.0315
              height: 40 width: 80 ]
Output:
                                                           **                   
                                                         ******                 
                                                       ********                 
                                                         ******                 
                                                      ******** **   *           
                                              ***   *****************           
                                              ************************  ***     
                                              ****************************      
                                           ******************************       
                                            *******************************     
                                         ************************************   
                                *         **********************************    
                           ** ***** *     **********************************    
                           ***********   ************************************   
                         ************** ************************************    
                         ***************************************************    
                     ******************************************************     
************************************************************************        
                     ******************************************************     
                         ***************************************************    
                         ************** ************************************    
                           ***********   ************************************   
                           ** ***** *     **********************************    
                                *         **********************************    
                                         ************************************   
                                            *******************************     
                                           ******************************       
                                              ****************************      
                                              ************************  ***     
                                              ***   *****************           
                                                      ******** **   *           
                                                         ******                 
                                                       ********                 
                                                         ******                 
                                                           **

AutoHotkey[edit]

Max_Iteration := 256
Width := Height := 400

File := "MandelBrot." Width ".bmp"
Progress, b2 w400 fs9, Creating Colours ...
Gosub, CreateColours
Gosub, CreateBitmap
Progress, Off
Gui, -Caption
Gui, Margin, 0, 0
Gui, Add, Picture,, %File%
Gui, Show,, MandelBrot
Return

GuiClose:
GuiEscape:
ExitApp



;---------------------------------------------------------------------------
CreateBitmap: ; create and save a 32bit bitmap file
;---------------------------------------------------------------------------
    ; define header details
    HeaderBMP  := 14
    HeaderDIB  := 40
    DataOffset := HeaderBMP + HeaderDIB
    ImageSize  := Width * Height * 4 ; 32bit
    FileSize   := DataOffset + ImageSize
    Resolution := 3780 ; from mspaint

    ; create bitmap header
    VarSetCapacity(IMAGE, FileSize, 0)
    NumPut(Asc("B")   , IMAGE, 0x00, "Char")
    NumPut(Asc("M")   , IMAGE, 0x01, "Char")
    NumPut(FileSize   , IMAGE, 0x02, "UInt")
    NumPut(DataOffset , IMAGE, 0x0A, "UInt")
    NumPut(HeaderDIB  , IMAGE, 0x0E, "UInt")
    NumPut(Width      , IMAGE, 0x12, "UInt")
    NumPut(Height     , IMAGE, 0x16, "UInt")
    NumPut(1          , IMAGE, 0x1A, "Short") ; Planes
    NumPut(32         , IMAGE, 0x1C, "Short") ; Bits per Pixel
    NumPut(ImageSize  , IMAGE, 0x22, "UInt")
    NumPut(Resolution , IMAGE, 0x26, "UInt")
    NumPut(Resolution , IMAGE, 0x2A, "UInt")

    ; fill in Data
    Gosub, CreatePixels

    ; save Bitmap to file
    FileDelete, %File%
    Handle := DllCall("CreateFile", "Str", File, "UInt", 0x40000000
            , "UInt", 0, "UInt", 0, "UInt", 2, "UInt", 0, "UInt", 0)
    DllCall("WriteFile", "UInt", Handle, "UInt", &IMAGE, "UInt"
            , FileSize, "UInt *", Bytes, "UInt", 0)
    DllCall("CloseHandle", "UInt", Handle)

Return



;---------------------------------------------------------------------------
CreatePixels: ; create pixels for [-2 < x < 1] [-1.5 < y < 1.5]
;---------------------------------------------------------------------------
    Loop, % Height // 2 + 1 {
        yi := A_Index - 1
        y0 := -1.5 + yi / Height * 3 ; range -1.5 .. +1.5
        Progress, % 200*yi // Height, % "Current line: " 2*yi " / " Height
        Loop, %Width% {
            xi := A_Index - 1
            x0 := -2 + xi / Width * 3 ; range -2 .. +1
            Gosub, Mandelbrot
            p1 := DataOffset + 4 * (Width * yi + xi)
            NumPut(Colour, IMAGE, p1, "UInt")
            p2 := DataOffset + 4 * (Width * (Height-yi) + xi)
            NumPut(Colour, IMAGE, p2, "UInt")
        }
    }
Return



;---------------------------------------------------------------------------
Mandelbrot: ; calculate a colour for each pixel
;---------------------------------------------------------------------------
    x := y := Iteration := 0
    While, (x*x + y*y <= 4) And (Iteration < Max_Iteration) {
        xtemp := x*x - y*y + x0
        y := 2*x*y + y0
        x := xtemp
        Iteration++
    }
    Colour := Iteration = Max_Iteration ? 0 : Colour_%Iteration%

Return



;---------------------------------------------------------------------------
CreateColours: ; borrowed from PureBasic example
;---------------------------------------------------------------------------
    Loop, 64 {
        i4 := (i3 := (i2 := (i1 := A_Index - 1) + 64) + 64) + 64
        Colour_%i1% := RGB(4*i1 + 128, 4*i1, 0)
        Colour_%i2% := RGB(64, 255, 4*i1)
        Colour_%i3% := RGB(64, 255 - 4*i1, 255)
        Colour_%i4% := RGB(64, 0, 255 - 4*i1)
    }
Return



;---------------------------------------------------------------------------
RGB(r, g, b) { ; return 24bit color value
;---------------------------------------------------------------------------
    Return, (r&0xFF)<<16 | g<<8 | b
}

AWK[edit]

BEGIN {
  XSize=59; YSize=21;
  MinIm=-1.0; MaxIm=1.0;MinRe=-2.0; MaxRe=1.0;
  StepX=(MaxRe-MinRe)/XSize; StepY=(MaxIm-MinIm)/YSize;
  for(y=0;y<YSize;y++)
  {
    Im=MinIm+StepY*y;
    for(x=0;x<XSize;x++)
        {
      Re=MinRe+StepX*x; Zr=Re; Zi=Im;
      for(n=0;n<30;n++)
          {
        a=Zr*Zr; b=Zi*Zi;
        if(a+b>4.0) break;
        Zi=2*Zr*Zi+Im; Zr=a-b+Re;
      }
      printf "%c",62-n;
    }
    print "";
  }
  exit;
}
Output:
>>>>>>=====<<<<<<<<<<<<<<<;;;;;;:::96032:;;;;<<<<==========
>>>>>===<<<<<<<<<<<<<<<<;;;;;;;:::873*079::;;;;<<<<<=======
>>>>===<<<<<<<<<<<<<<<;;;;;;;::9974    (.9::::;;<<<<<======
>>>==<<<<<<<<<<<<<<<;;;;;;:98888764     5789999:;;<<<<<====
>>==<<<<<<<<<<<<<;;;;::::996. &2           45335:;<<<<<<===
>>=<<<<<<<<<<<;;;::::::999752                 *79:;<<<<<<==
>=<<<<<<<<;;;:599999999886                    %78:;;<<<<<<=
><<<<;;;;;:::972456-567763                      +9;;<<<<<<<
><;;;;;;::::9875&      .3                       *9;;;<<<<<<
>;;;;;;::997564'        '                       8:;;;<<<<<<
>::988897735/                                 &89:;;;<<<<<<
>::988897735/                                 &89:;;;<<<<<<
>;;;;;;::997564'        '                       8:;;;<<<<<<
><;;;;;;::::9875&      .3                       *9;;;<<<<<<
><<<<;;;;;:::972456-567763                      +9;;<<<<<<<
>=<<<<<<<<;;;:599999999886                    %78:;;<<<<<<=
>>=<<<<<<<<<<<;;;::::::999752                 *79:;<<<<<<==
>>==<<<<<<<<<<<<<;;;;::::996. &2           45335:;<<<<<<===
>>>==<<<<<<<<<<<<<<<;;;;;;:98888764     5789999:;;<<<<<====
>>>>===<<<<<<<<<<<<<<<;;;;;;;::9974    (.9::::;;<<<<<======
>>>>>===<<<<<<<<<<<<<<<<;;;;;;;:::873*079::;;;;<<<<<=======

B[edit]

This implements a 16bit fixed point arithmetic Mandelbrot set calculation.

Works with: The Amsterdam Compiler Kit - B version V6.1pre1
main() {
  auto cx,cy,x,y,x2,y2;
  auto iter;

  auto xmin,xmax,ymin,ymax,maxiter,dx,dy;

  xmin = -8601;
  xmax =  2867;
  ymin = -4915;
  ymax =  4915;

  maxiter = 32;

  dx = (xmax-xmin)/79;
  dy = (ymax-ymin)/24;

  cy=ymin;
  while( cy<=ymax ) {
    cx=xmin;
    while( cx<=xmax ) {
      x = 0;
      y = 0;
      x2 = 0;
      y2 = 0;
      iter=0;
      while( iter<maxiter ) {
        if( x2+y2>16384 ) break;
        y = ((x*y)>>11)+cy;
        x = x2-y2+cx;
        x2 = (x*x)>>12;
        y2 = (y*y)>>12;
        iter++;
      }
      putchar(' '+iter);
      cx =+ dx;
    }
    putchar(13);
    putchar(10);
    cy =+ dy;
  }

  return(0);
}
Output:
!!!!!!!!!!!!!!!"""""""""""""####################################""""""""""""""""
!!!!!!!!!!!!!"""""""""#######################$$$$$$$%'+)%%%$$$$$#####"""""""""""
!!!!!!!!!!!"""""""#######################$$$$$$$$%%%&&(+,)++&%$$$$$$######""""""
!!!!!!!!!"""""#######################$$$$$$$$$$%%%%&')*5:/+('&%%$$$$$$#######"""
!!!!!!!!""""#####################$$$$$$$$$$%%%&&&''),@@@@@@@,'&%%%%%$$$$########
!!!!!!!"""####################$$$$$$$$%%%&'())((())*,@@@@@@/+))('&&&&)'%$$######
!!!!!!""###################$$$$$%%%%%%&&&'+.@@=/<@@@@@@@@@@@@@@@/++@..93%%$#####
!!!!!"################$$$%%%%%%%%%%&&&&'),+2@@@@@@@@@@@@@@@@@@@@@@@@@1(&&%$$####
!!!!"##########$$$$$%%&(-(''''''''''''(*,5@@@@@@@@@@@@@@@@@@@@@@@@@@@@+)-&%$$###
!!!!####$$$$$$$$%%%%%&'(*-@1.+.@-4+))**@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@4-(&%$$$##
!!!!#$$$$$$$$$%%%%%%'''++.6@@@@@@@@@8/0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@3(%%$$$$#
!!!#$$$$$$$%&&&&''()/-5.5@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?'&%%$$$$#
!!!(**+/+<523/80/46@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@4+)'&&%%$$$$#
!!!#$$$$$$$%&&&&''().-2.@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@'&%%$$$$#
!!!!#$$$$$$$$$%%%%%&'''/,.7@@@@@@@@@;/0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0'%%$$$$#
!!!!####$$$$$$$$%%%%%&'(*-:2.,/?-5+))**@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@4+(&%$$$##
!!!!"##########$$$$$%%&(-(''''(''''''((*,4@@@@@@@@@@@@@@@@@@@@@@@@@@@4+).&%$$###
!!!!!"################$$$%%%%%%%%%%&&&&')<,4@@@@@@@@@@@@@@@@@@@@@@@@@/('&%%$####
!!!!!!""##################$$$$$$%%%%%%&&&'*.@@@0@@@@@@@@@@@@@@@@1,,@//9)%%$#####
!!!!!!!"""####################$$$$$$$$%%%&(())((()**-@@@@@@/+)))'&&&')'%$$######
!!!!!!!!""""#####################$$$$$$$$$$%%%&&&''(,@@@@@@@+'&&%%%%%$$$########
!!!!!!!!!"""""#######################$$$$$$$$$$%%%%&')*7@0+('&%%%$$$$$#######"""
!!!!!!!!!!!"""""""######################$$$$$$$$$%%%&&(+-).*&%$$$$$$######""""""
!!!!!!!!!!!!!"""""""""#######################$$$$$$%%'3(%%%$$$$$######""""""""""
!!!!!!!!!!!!!!!""""""""""""#####################################""""""""""""""""

BASIC[edit]

AmigaBASIC[edit]

Translation of: QBasic
SCREEN 1,320,200,5,1
WINDOW 2,"Mandelbrot",,0,1

maxIteration = 100
xmin = -2
xmax = 1
ymin = -1.5
ymax = 1.5
xs = 300
ys = 180
st = .01   ' use e.g. st = .05 for a coarser but faster picture
           '   and perhaps also lower maxIteration = 10 or so
xp = xs / (xmax - xmin) * st
yp = ys / (ymax - ymin) * st

FOR x0 = xmin TO xmax STEP st
    FOR y0 = ymin TO ymax STEP st
        x = 0
        y = 0
        iteration = 0
 
        WHILE (x * x + y * y <= (2 * 2) AND iteration < maxIteration)
            xtemp = x * x - y * y + x0
            y = 2 * x * y + y0
 
            x = xtemp
 
            iteration = iteration + 1
        WEND
 
        IF iteration <> maxIteration THEN
            c = iteration
        ELSE
            c = 0
        END IF
        COLOR c MOD 32
        AREA ((x0 - xmin) * xp / st, (y0 - ymin) * yp / st)
        AREA STEP (xp, 0)
        AREA STEP (0, yp)
        AREA STEP (-xp, 0)
        AREA STEP (0, -yp)
        AREAFILL
    NEXT
NEXT

' endless loop, use Run -> Stop from the menu to stop program
WHILE (1)
WEND

Applesoft BASIC[edit]

This version takes into account the Apple II's funky 280×192 6-color display, which has an effective resolution of only 140×192 in color.

10  HGR2
20  XC = -0.5           : REM CENTER COORD X
30  YC = 0              : REM   "      "   Y
40  S = 2               : REM SCALE
45  IT = 20             : REM ITERATIONS
50  XR = S * (280 / 192): REM TOTAL RANGE OF X
60  YR = S              : REM   "     "   "  Y
70  X0 = XC - (XR/2)    : REM MIN VALUE OF X
80  X1 = XC + (XR/2)    : REM MAX   "   "  X
90  Y0 = YC - (YR/2)    : REM MIN   "   "  Y
100 Y1 = YC + (YR/2)    : REM MAX   "   "  Y
110 XM = XR / 279       : REM SCALING FACTOR FOR X
120 YM = YR / 191       : REM    "      "     "  Y
130 FOR YI = 0 TO 3     : REM INTERLEAVE
140   FOR YS = 0+YI TO 188+YI STEP 4 : REM Y SCREEN COORDINATE
145   HCOLOR=3 : HPLOT 0,YS TO 279,YS
150     FOR XS = 0 TO 278 STEP 2     : REM X SCREEN COORDINATE
170       X = XS * XM + X0  : REM TRANSL SCREEN TO TRUE X
180       Y = YS * YM + Y0  : REM TRANSL SCREEN TO TRUE Y
190       ZX = 0
200       ZY = 0
210       XX = 0
220       YY = 0
230       FOR I = 0 TO IT
240         ZY = 2 * ZX * ZY + Y
250         ZX = XX - YY + X
260         XX = ZX * ZX
270         YY = ZY * ZY
280         C = IT-I
290         IF XX+YY >= 4 GOTO 301
300       NEXT I
301       IF C >= 8 THEN C = C - 8 : GOTO 301
310       HCOLOR = C : HPLOT XS, YS TO XS+1, YS
320     NEXT XS
330   NEXT YS
340 NEXT YI

By making the following modifications, the same code will render the Mandelbrot set in monochrome at full 280×192 resolution.

150 FOR XS = 0 TO 279
301 C = (C - INT(C/2)*2)*3
310 HCOLOR = C: HPLOT XS, YS


ARM BBC BASIC[edit]

The ARM development second processor for the BBC series of microcomputers came with ARM BBC Basic V. In version 1.0 this included a built-in MANDEL function that uses D% (depth) to update C% (colour) at given coordinates x and y. Presumably this was for benchmarking/demo purposes; it was removed from later versions. This can be run in BeebEm. Select BBC model as Master 128 with ARM Second Processor. Load disc armdisc3.adl and switch to ADFS. At the prompt load ARM Basic by running the AB command.

10MODE5:VDU5
20D%=100 : REM adjust for speed/precision
30FORX%=0 TO 1279 STEP8
40FORY%=0 TO 1023 STEP4
50MANDEL (Y%-512)/256, (X%-640)/256
51REM (not sure why X and Y need to be swapped to correct orientation)
60GCOL0,C%
70PLOT69,X%,Y%
80NEXT
90NEXT

File:Mandelbrot armbasic.png

BASIC256[edit]

fastgraphics

graphsize 384,384
refresh
kt = 319 : m = 4.0
xmin = -2.1 : xmax = 0.6 : ymin = -1.35 : ymax = 1.35
dx = (xmax - xmin) / graphwidth : dy = (ymax - ymin) / graphheight

for x = 0 to graphwidth
	jx = xmin + x * dx
	for y = 0 to graphheight
		jy = ymin + y * dy
		k = 0 : wx = 0.0 : wy = 0.0
		do
			tx = wx * wx - wy * wy + jx
			ty = 2.0 * wx * wy + jy
			wx = tx
			wy = ty
			r = wx * wx + wy * wy
			k = k + 1
		until r > m or k > kt
		
		if k > kt then
			color black
		else 
			if k < 16 then color k * 8, k * 8, 128 + k * 4
			if k >= 16 and k < 64 then color 128 + k - 16, 128 + k - 16, 192 + k - 16
			if k >= 64 then color kt - k, 128 + (kt - k) / 2, kt - k
		end if
		plot x, y
	next y
	refresh
next x
imgsave "Mandelbrot_BASIC-256.png", "PNG"
Image generated by the script:

Mandelbrot BASIC-256.jpg

BBC BASIC[edit]

      sizex% = 300 : sizey% = 300
      maxiter% = 128
      VDU 23,22,sizex%;sizey%;8,8,16,128
      ORIGIN 0,sizey%
      GCOL 1
      FOR X% = 0 TO 2*sizex%-2 STEP 2
        xi = X%/200 - 2
        FOR Y% = 0 TO sizey%-2 STEP 2
          yi = Y% / 200
          x = 0
          y = 0
          FOR I% = 1 TO maxiter%
            IF x*x+y*y > 4 EXIT FOR
            xt = xi + x*x-y*y
            y = yi + 2*x*y
            x = xt
          NEXT
          IF I%>maxiter% I%=0
          COLOUR 1,I%*15,I%*8,0
          PLOT X%,Y% : PLOT X%,-Y%
        NEXT
      NEXT X%

Mandelbrot bbc.gif

Commander X16 BASIC[edit]

10  CLS
20  SCREEN $80
30  FOR X=1 TO 199: 
40   FOR Y=1 TO 99:
50    LET I=0
60    LET CX=(X-100)/50
70    LET CY=(Y-100)/50
80    LET VX=0
90    LET VY=0
100   REM START OF THE CALCULATION LOOP
110   LET I=I+1
120   LET X2 = VX*VX
130   LET Y2 = VY*VY
140   LET VY = CY + (VX+VX)*VY
150   LET VX = CX + X2-Y2
160   IF I<32 AND (X2+Y2)<4 THEN GOTO 100
170  LET YR = 199-Y
180  PSET X,Y,I
190  PSET X,YR,I
200 :NEXT:NEXT

Commodore BASIC[edit]

The standard version 2.0 of BASIC that came with the VIC-20 and C-64 had no built-in support for graphics (though you could use POKE statements to put values in the VIC chip's registers and the RAM being used for video). However, Commodore sold add-on cartridges that provided such support, which was also included in later versions of BASIC (3.5 on the C-16 and Plus/4, 7.0 on the C-128). In all of these cases the programs are very slow; rendering the Mandelbrot set even with the escape threshold set to just 20 iterations takes hours. The fastest is the VIC-20, because it has only a 160x160-pixel bitmap display.

VIC-20 with Super Expander cartridge[edit]

Runs in about 90 minutes.

100 TH=20:REM ESCAPE THRESHOLD IN ITERATIONS 
110 COLOR 1,3,0,0:GRAPHIC 2:TH=20
120 FOR PY=0 TO 80
130 : SY=INT(PY*6.4)
140 : IM=1.12-PY/160*2.24
150 : FOR PX=0 TO 160
160 :  SX=INT(PX*6.4)
170 :  RE=PX/160*2.47-2
180 :  X=0:Y=0:IT=0
190 :  XT=X*X-Y*Y+RE
200 :  Y = 2*X*Y+IM
210 :  X=XT
220 :  IT=IT+1
230 :  IF(X*X+Y*Y<=4)AND(IT<TH) THEN 190
240 :  IF IT<TH THEN 270
250 :  DRAW 1,SX,SY TO SX,SY
260 :  DRAW 1,SX,1024-SY TO SX,1024-SY
270 : NEXT PX
280 NEXT PY
290 GET K$:IF K$="" THEN 290
300 GRAPHIC 4

C-64 with Super Expander 64[edit]

Runs in about 4.5 hours.

100 TH=20:REM ESCAPE THRESHOLD IN ITERATIONS 
110 COLOR 6,0,0,0,6:GRAPHIC 2,1
120 FOR PY=0 TO 100
140 : IM=1.12-PY/200*2.24
150 : FOR PX=0 TO 319
170 :  RE=PX/320*2.47-2
180 :  X=0:Y=0:IT=0
190 :  XT=X*X-Y*Y+RE
200 :  Y = 2*X*Y+IM
210 :  X=XT
220 :  IT=IT+1
230 :  IF(X*X+Y*Y<=4)AND(IT<TH) THEN 190
240 :  IF IT<TH THEN 270
250 :  DRAW 1,PX,PY
260 :  DRAW 1,PX,200-PY
270 : NEXT PX
280 NEXT PY
290 GET K$:IF K$="" THEN 290
300 GRAPHIC 0

Commodore-16 / 116 / Plus/4[edit]

Works with: Commodore BASIC version 3.5

Despite the faster clock on the TED systems compared to the C-64, this takes almost six hours to run.

100 TH=20:REM ESCAPE THRESHOLD IN ITERATIONS 
110 COLOR 0,2:COLOR 1,1:GRAPHIC 1,1
120 FOR PY=0 TO 100
130 : IM = 1.12-PY*2.24/200
140 : FOR PX=0 TO 319
150 :   RE=PX/320*2.47-2
160 :   X=0:Y=0:IT=0
170 :   DO WHILE (X*X+Y*Y<=4) AND (IT<TH)
180 :     XT = X*X-Y*Y+RE
190 :      Y = 2*X*Y+IM
200 :      X = XT
210 :     IT = IT +1
220 :   LOOP
230 :   IF IT=TH THEN DRAW 1,PX,PY:DRAW 1,PX,199-PY
240 : NEXT PX
250 NEXT PY
260 GETKEY K$
270 GRAPHIC 0

Commodore 128 (40-column display)[edit]

Works with: Commodore BASIC version 7.0

With the switch to FAST (2MHz) mode, this runs in about 2.5 hours, but you get to stare at a blank screen until it's done rendering. Without that switch it takes about 5.5 hours, splitting the difference between the Super Expander 64 and Plus/4 versions.

100 TH=20:REM ESCAPE THRESHOLD IN ITERATIONS 
110 COLOR 0,12:GRAPHIC 1,1:COLOR 1,1:GRAPHIC0:FAST
120 FOR PY=0 TO 100
130 : IM = 1.12-PY*2.24/200
140 : FOR PX=0 TO 319
150 :   RE=PX/320*2.47-2
160 :   X=0:Y=0:IT=0
170 :   DO WHILE (X*X+Y*Y<=4) AND (IT<TH)
180 :     XT = X*X-Y*Y+RE
190 :      Y = 2*X*Y+IM
200 :      X = XT
210 :     IT = IT +1
220 :   LOOP
230 :   IF IT=TH THEN DRAW 1,PX,PY:DRAW 1,PX,199-PY
240 : NEXT PX
250 NEXT PY
260 SLOW:GRAPHIC 1
270 GETKEY K$
280 GRAPHIC 0

Commodore 128 (80-column display)[edit]

Works with: Commodore BASIC version 8.0

This uses BASIC 8 to create a 640x200 render on the C-128's 80-column display. The doubled resolution comes with a commensurate increase in run time; this takes about 5h20m using FAST 2MHz mode.

100 TH=20:REM ESCAPE THRESHOLD IN ITERATIONS
110 @MODE,0:@COLOR,15,0,0:@SCREEN,0,0:@CLEAR,0:FAST
120 FOR PY=0 TO 100
130 : IM = 1.12-PY*2.24/200
140 : FOR PX=0 TO 639

150 :   RE=PX/640*2.47-2
160 :   X=0:Y=0:IT=0
170 :   DO WHILE (X*X+Y*Y<=4) AND (IT<20)
180 :     XT = X*X-Y*Y+RE
190 :      Y = 2*X*Y+IM
200 :      X = XT
210 :     IT = IT +1
220 :   LOOP
230 :   IF IT=20 THEN @DOT,PX,PY,0:@DOT,PX,199-PY,0
240 : NEXT PX
250 NEXT PY
260 GETKEY K$
270 @TEXT
Output:

Screen shots of all of the above running in the VICE emulator can be found here.

Commodore PET[edit]

Here's a version using mostly ASCII and some PETSCII (could probably improve the tile set for PETSCII) inspired by the Perl solution. Designed for a PET with an 80-column display.

100 TH=20:REM ESCAPE THRESHOLD IN ITERATIONS
110 CH$=" .:-=+*#@"+CHR$(255)
120 FOR Y=1 TO -1 STEP -0.08
130 : FOR X = -2 TO 0.5 STEP 0.0315
140 :   GOSUB 200:IF I=20 THEN PRINT CHR$(18);" ";CHR$(146);:GOTO 160
150 :   PRINT MID$(CH$,I/2+1,1);
160 : NEXT X:IF PEEK(198) THEN PRINT
170 NEXT Y
180 GET K$:IF K$=""THEN 180
190 END
200 CX=X:CY=Y:ZX=X:ZY=Y
210 FOR I=1 TO TH
220 : TX=ZX*ZX-ZY*ZY
230 : TY=ZX*ZY*2
240 : ZX = TX + CX
250 : ZY = TY + CY
260 : IF ZX*ZX+ZY*ZY > 4 THEN 280
270 NEXT I
280 IF I>TH THEN I=TH
290 RETURN
Output:
VICE screenshot here.

DEC BASIC-PLUS[edit]

Works under RSTS/E v7.0 on the simh PDP-11 emulator. For installation procedures for RSTS/E, see here.

10 X1=59\Y1=21
20 I1=-1.0\I2=1.0\R1=-2.0\R2=1.0
30 S1=(R2-R1)/X1\S2=(I2-I1)/Y1
40 FOR Y=0 TO Y1
50 I3=I1+S2*Y
60 FOR X=0 TO X1
70 R3=R1+S1*X\Z1=R3\Z2=I3
80 FOR N=0 TO 30
90 A=Z1*Z1\B=Z2*Z2
100 IF A+B>4.0 THEN GOTO 130
110 Z2=2*Z1*Z2+I3\Z1=A-B+R3
120 NEXT N
130 PRINT STRING$(1%,62%-N);
140 NEXT X
150 PRINT
160 NEXT Y
170 END
Output:
>>>>>>=====<<<<<<<<<<<<<<<;;;;;;:::96032:;;;;<<<<===========
>>>>>===<<<<<<<<<<<<<<<<;;;;;;;:::873*079::;;;;<<<<<========
>>>>===<<<<<<<<<<<<<<<;;;;;;;::9974    (.9::::;;<<<<<=======
>>>==<<<<<<<<<<<<<<<;;;;;;:98888764     5789999:;;<<<<<=====
>>==<<<<<<<<<<<<<;;;;::::996. &2           45335:;<<<<<<====
>>=<<<<<<<<<<<;;;::::::999752                 *79:;<<<<<<===
>=<<<<<<<<;;;:599999999886                    %78:;;<<<<<<==
><<<<;;;;;:::972456-567763                      +9;;<<<<<<<=
><;;;;;;::::9875&      .3                       *9;;;<<<<<<=
>;;;;;;::997564'        '                       8:;;;<<<<<<=
>::988897735/                                 &89:;;;<<<<<<=
>::988897735/                                 &89:;;;<<<<<<=
>;;;;;;::997564'        '                       8:;;;<<<<<<=
><;;;;;;::::9875&      .3                       *9;;;<<<<<<=
><<<<;;;;;:::972456-567763                      +9;;<<<<<<<=
>=<<<<<<<<;;;:599999999886                    %78:;;<<<<<<==
>>=<<<<<<<<<<<;;;::::::999752                 *79:;<<<<<<===
>>==<<<<<<<<<<<<<;;;;::::996. &2           45335:;<<<<<<====
>>>==<<<<<<<<<<<<<<<;;;;;;:98888764     5789999:;;<<<<<=====
>>>>===<<<<<<<<<<<<<<<;;;;;;;::9974    (.9::::;;<<<<<=======
>>>>>===<<<<<<<<<<<<<<<<;;;;;;;:::873*079::;;;;<<<<<========
>>>>>>=====<<<<<<<<<<<<<<<;;;;;;:::96032:;;;;<<<<===========

FreeBASIC[edit]

#define pix 1./120
#define zero_x 320
#define zero_y 240
#define maxiter 250

screen 12

type complex
    r as double
    i as double
end type

operator + (x as complex, y as complex) as complex
    dim as complex ret
    ret.r = x.r + y.r
    ret.i = x.i + y.i
    return ret
end operator

operator * (x as complex, y as complex) as complex
    dim as complex ret
    ret.r = x.r*y.r - x.i*y.i
    ret.i = x.r*y.i + x.i*y.r
    return ret
end operator

operator abs ( x as complex ) as double
    return sqr(x.r*x.r + x.i*x.i)
end operator

dim as complex c, z
dim as integer x, y, iter

for x=0 to 639
   for y=0 to 240
      c.r = (x-zero_x)*pix
      c.i = (y-zero_y)*pix
      z.r = 0.0
      z.i = 0.0
      for iter=0 to maxiter
          z = z*z + c
          if abs(z)>2 then
              pset(x,y),iter mod 16
              pset(x,480-y),iter mod 16
              goto cont
          end if
       next iter
       pset(x,y),1
       pset(x,480-y),1
       cont:
    next y
next x

while inkey=""
wend
end

GW-BASIC[edit]

10 SCALE# = 1/60 : ZEROX = 160
20 ZEROY = 100 : MAXIT = 32
30 SCREEN 1
40 FOR X = 0 TO 2*ZEROX - 1
50 CR# = (X-ZEROX)*SCALE#
60 FOR Y = 0 TO ZEROY
70 CI# = (ZEROY-Y)*SCALE#
80 ZR# = 0
90 ZI# = 0
100 FOR I = 1 TO MAXIT
110 BR# = CR# + ZR#*ZR# - ZI#*ZI#
120 ZI# = CI# + 2*ZR#*ZI#
130 ZR# = BR#
140 IF ZR#*ZR# + ZI#*ZI# > 4 THEN GOTO 170
150 NEXT I
160 GOTO 190
170 PSET (X, Y), 1 + (I MOD 3)
180 PSET (X, 2*ZEROY-Y), 1+(I MOD 3)
190 NEXT Y
200 NEXT X

Liberty BASIC[edit]

Any words of description go outside of lang tags.

nomainwin

WindowWidth  =440
WindowHeight =460

open "Mandelbrot Set" for graphics_nsb_nf as #w

#w "trapclose [quit]"
#w "down"

for x0 = -2 to 1 step .0033
    for y0 = -1.5 to 1.5 step .0075
        x = 0
        y = 0

        iteration    =   0
        maxIteration = 255

        while ( ( x *x +y *y) <=4) and ( iteration <maxIteration)
            xtemp      =x *x -y *y +x0
            y          =2 *x *y +y0
            x          = xtemp
            iteration  = iteration + 1
        wend

        if iteration <>maxIteration then
            c =iteration
        else
            c =0
        end if

        call pSet x0, y0, c
        scan
    next
next

#w "flush"

wait

sub pSet x, y, c
    xScreen = 10 +( x +2)   /3 *400
    yScreen = 10 +( y +1.5) /3 *400
    if c =0 then
        col$ ="red"
    else
        if c mod 2 =1 then col$ ="lightgray" else col$ ="white"
    end if
    #w "color "; col$
    #w "set "; xScreen; " "; yScreen
end sub

[quit]
close #w
end

Locomotive Basic[edit]

Translation of: QBasic

This program is meant for use in CPCBasic specifically, where it draws a 16-color 640x400 image in less than a minute. (Real CPC hardware would take far longer than that and has lower resolution.)

1 MODE 3    ' Note the CPCBasic-only screen mode!
2 FOR xp = 0 TO 639
3 FOR yp = 0 TO 399
4 x = 0 : y = 0
5 x0 = xp / 213 - 2 : y0 = yp / 200 - 1
6 iteration = 0
7 maxIteration = 100
8 WHILE (x * x + y * y <= (2 * 2) AND iteration < maxIteration)
9 xtemp = x * x - y * y + x0
10 y = 2 * x * y + y0
11 x = xtemp
12 iteration = iteration + 1
13 WEND
14 IF iteration <> maxIteration THEN c = iteration ELSE c = 0
15 PLOT xp, yp, c MOD 16
16 NEXT
17 NEXT

Microsoft Small Basic[edit]

GraphicsWindow.Show()
size = 500
half = 250
GraphicsWindow.Width = size * 1.5
GraphicsWindow.Height = size
GraphicsWindow.Title = "Mandelbrot"
For px = 1 To size * 1.5
  x_0 = px/half - 2
  For py = 1 To size
    y_0 = py/half - 1
    x = x_0
    y = y_0
    i = 0
    While(c <= 2 AND i<100)
      x_1 = Math.Power(x, 2) - Math.Power(y, 2) + x_0
      y_1 = 2 * x * y + y_0
      c = Math.Power(Math.Power(x_1, 2) + Math.Power(y_1, 2), 0.5)
      x = x_1
      y = y_1
      i = i + 1
    EndWhile
    If i < 99 Then
      GraphicsWindow.SetPixel(px, py, GraphicsWindow.GetColorFromRGB((255/25)*i, (255/25)*i, (255/5)*i))
    Else 
      GraphicsWindow.SetPixel(px, py, "black")
    EndIf
    c=0
 EndFor
EndFor

Microsoft Super Extended Color BASIC (Tandy Color Computer 3)[edit]

1 REM MANDELBROT SET - TANDY COCO 3
2 POKE 65497,1
10 HSCREEN 2
20 HCLS
30 X1=319:Y1=191
40 I1=-1.0:I2=1.0:R1=-2:R2=1.0
50 S1=(R2-R1)/X1:S2=(I2-I1)/Y1
60 FOR Y=0 TO Y1
70 I3=I1+S2*Y
80 FOR X=0 TO X1
90 R3=R1+S1*X:Z1=R3:Z2=I3
100 FOR N=0 TO 30
110 A=Z1*Z1:B=Z2*Z2
120 IF A+B>4.0 GOTO 150
130 Z2=2*Z1*Z2+I3:Z1=A-B+R3
140 NEXT N
150 HSET(X,Y,N-16*INT(N/16))
160 NEXT X
170 NEXT Y
180 GOTO 180

Nascom BASIC[edit]

Translation of: Sinclair ZX81 BASIC

In fact, it is based on the ZX81 version, but some optimizations are done to shorten the execution time (though they lengthen the code):

  • The variables X2 and Y2 for XA*XA and YA*YA respectively are introduced in order to calculate the squares only once.
  • The value of X does not depend on J, so it is calculated before the FOR J loop.
  • The symmetry of the shape is taken into account in order to calculate symmetric values only once. It is the most significant optimization. The case X=0 (corresponding to the line 22 on the screen grid) is treated separately.

Only a fragment of the shape is drawn because of low resolution of block graphics. Like in the ZX81 version, you can adjust the constants in lines 40 and 70 to zoom in on a particular area, if you like.

Works with: Nascom ROM BASIC version 4.7
10 REM Mandelbrot set
20 CLS
30 FOR I=0 TO 95
40 LET X=(I-78)/48
50 REM ** When X<>0
60 FOR J=1 TO 22
70 LET Y=(22-J)/30
80 LET XA=0:X2=0
90 LET YA=0:Y2=0
100 LET ITER=0
110 LET XTEMP=X2-Y2+X
120 LET YA=2*XA*YA+Y:Y2=YA*YA
130 LET XA=XTEMP:X2=XA*XA
140 LET ITER=ITER+1
150 IF X2+Y2<=4 AND ITER<200 THEN 110
160 IF ITER=200 THEN SET(I,J):SET(I,44-J)
170 NEXT J
180 REM ** When X=0
190 LET XA=0:X2=0
200 LET ITER=0
210 LET XA=X2+X:X2=XA*XA
220 LET ITER=ITER+1
230 IF X2<=4 AND ITER<200 THEN 210
240 IF ITER=200 THEN SET(I,22)
250 NEXT I
290 REM ** Set up machine code INKEY$ command
300 IF PEEK(1)<>0 THEN RESTORE 510
310 DOKE 4100,3328:FOR A=3328 TO 3342 STEP 2
320 READ B:DOKE A,B:NEXT A
400 SCREEN 1,15
410 PRINT "Hit any key to exit.";
420 A=USR(0):IF A<0 THEN 420
430 CLS
440 END
490 REM ** Data for machine code INKEY$
500 DATA 25055,1080,-53,536,-20665,3370,-5664,0
510 DATA 27085,14336,-13564,6399,18178,10927
520 DATA -8179,233

OS/8 BASIC[edit]

Works under BASIC on a PDP-8 running OS/8. Various emulators exist including simh's PDP-8 emulator and the PDP-8/E Simulator for Classic Macintosh and OS X.

10 X1=59\Y1=21
20 I1=-1.0\I2=1.0\R1=-2.0\R2=1.0
30 S1=(R2-R1)/X1\S2=(I2-I1)/Y1
40 FOR Y=0 TO Y1
50 I3=I1+S2*Y
60 FOR X=0 TO X1
70 R3=R1+S1*X\Z1=R3\Z2=I3
80 FOR N=0 TO 30
90 A=Z1*Z1\B=Z2*Z2
100 IF A+B>4.0 GOTO 130
110 Z2=2*Z1*Z2+I3\Z1=A-B+R3
120 NEXT N
130 PRINT CHR$(62-N);
140 NEXT X
150 PRINT
160 NEXT Y
170 END
Output:
>>>>>>=====<<<<<<<<<<<<<<<;;;;;;:::96032:;;;;<<<<===========
>>>>>===<<<<<<<<<<<<<<<<;;;;;;;:::873*079::;;;;<<<<<========
>>>>===<<<<<<<<<<<<<<<;;;;;;;::9974    (.9::::;;<<<<<=======
>>>==<<<<<<<<<<<<<<<;;;;;;:98888764     5789999:;;<<<<<=====
>>==<<<<<<<<<<<<<;;;;::::996. &2           45335:;<<<<<<====
>>=<<<<<<<<<<<;;;::::::999752                 *79:;<<<<<<===
>=<<<<<<<<;;;:599999999886                    %78:;;<<<<<<==
><<<<;;;;;:::972456-567763                      +9;;<<<<<<<=
><;;;;;;::::9875&      .3                       *9;;;<<<<<<=
>;;;;;;::997564'        '                       8:;;;<<<<<<=
>::988897735/                                 &89:;;;<<<<<<=
>::988897735/                                 &89:;;;<<<<<<=
>;;;;;;::997564'        '                       8:;;;<<<<<<=
><;;;;;;::::9875&      .3                       *9;;;<<<<<<=
><<<<;;;;;:::972456-567763                      +9;;<<<<<<<=
>=<<<<<<<<;;;:599999999886                    %78:;;<<<<<<==
>>=<<<<<<<<<<<;;;::::::999752                 *79:;<<<<<<===
>>==<<<<<<<<<<<<<;;;;::::996. &2           45335:;<<<<<<====
>>>==<<<<<<<<<<<<<<<;;;;;;:98888764     5789999:;;<<<<<=====
>>>>===<<<<<<<<<<<<<<<;;;;;;;::9974    (.9::::;;<<<<<=======
>>>>>===<<<<<<<<<<<<<<<<;;;;;;;:::873*079::;;;;<<<<<========
>>>>>>=====<<<<<<<<<<<<<<<;;;;;;:::96032:;;;;<<<<===========

PureBasic[edit]

PureBasic forum: discussion

EnableExplicit

#Window1   = 0
#Image1    = 0
#ImgGadget = 0

#max_iteration =  64
#width         = 800
#height        = 600
Define.d x0 ,y0 ,xtemp ,cr, ci
Define.i i, n, x, y ,Event ,color

Dim Color.l (255)
For n = 0 To 63
  Color(   0 + n ) = RGB(  n*4+128, 4 * n, 0 )
  Color(  64 + n ) = RGB(  64, 255, 4 * n )
  Color( 128 + n ) = RGB(  64, 255 - 4 * n , 255 )
  Color( 192 + n ) = RGB(  64, 0, 255 - 4 * n )
Next

If OpenWindow(#Window1, 0, 0, #width, #height, "'Mandelbrot set' PureBasic Example", #PB_Window_SystemMenu )
    If CreateImage(#Image1, #width, #height)
       ImageGadget(#ImgGadget, 0, 0, #width, #height, ImageID(#Image1))
       For y.i = 1 To #height -1
         StartDrawing(ImageOutput(#Image1))
         For x.i = 1 To  #width -1
           x0 = 0
           y0 = 0;
           cr = (x / #width)*2.5 -2
           ci = (y / #height)*2.5 -1.25
           i = 0
           While  (x0*x0 + y0*y0 <= 4.0) And i < #max_iteration
             i +1
             xtemp = x0*x0 - y0*y0 + cr
             y0    = 2*x0*y0 + ci
             x0    = xtemp
           Wend
           If i >= #max_iteration
              Plot(x, y,  0 )
           Else
              Plot(x, y,  Color(i & 255))
           EndIf
           
         Next
         StopDrawing()
         SetGadgetState(#ImgGadget, ImageID(#Image1))
         Repeat
           Event = WindowEvent()
           If Event = #PB_Event_CloseWindow
             End
           EndIf
         Until Event = 0 
       Next
    EndIf
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf
Example:

Mandelbrot-PureBasic.png

QBasic[edit]

This is almost exactly the same as the pseudocode from the Wikipedia entry's "For programmers" section (which it's closely based on, of course). The image generated is very blocky ("low-res") due to the selected video mode, but it's fairly accurate.

SCREEN 13
WINDOW (-2, 1.5)-(2, -1.5)
FOR x0 = -2 TO 2 STEP .01
    FOR y0 = -1.5 TO 1.5 STEP .01
        x = 0
        y = 0

        iteration = 0
        maxIteration = 223

        WHILE (x * x + y * y <= (2 * 2) AND iteration < maxIteration)
            xtemp = x * x - y * y + x0
            y = 2 * x * y + y0

            x = xtemp

            iteration = iteration + 1
        WEND

        IF iteration <> maxIteration THEN
            c = iteration
        ELSE
            c = 0
        END IF

        PSET (x0, y0), c + 32
    NEXT
NEXT

Quite BASIC[edit]

      
1000 REM Mandelbrot Set Project
1010 REM Quite BASIC Math Project
1015 REM 'http://www.quitebasic.com/prj/math/mandelbrot/
1020 REM ------------------------ 
1030 CLS
1040 PRINT "This program plots a graphical representation of the famous Mandelbrot set.  It takes a while to finish so have patience and don't have too high expectations;  the graphics resolution is not very high on our canvas."
2000 REM Initialize the color palette
2010 GOSUB 3000
2020 REM L is the maximum iterations to try
2030 LET L = 100
2040 FOR I = 0 TO 100
2050 FOR J = 0 TO 100
2060 REM Map from pixel coordinates (I,J) to math (U,V)
2060 LET U = I / 50 - 1.5
2070 LET V = J / 50 - 1
2080 LET X = U
2090 LET Y = V
2100 LET N = 0
2110 REM Inner iteration loop starts here 
2120 LET R = X * X
2130 LET Q = Y * Y
2140 IF R + Q > 4 OR N >= L THEN GOTO 2190
2150 LET Y = 2 * X * Y + V
2160 LET X = R - Q + U
2170 LET N = N + 1
2180 GOTO 2120
2190 REM Compute the color to plot
2200 IF N < 10 THEN LET C = "black" ELSE LET C = P[ROUND(8 * (N-10) / (L-10))]
2210 PLOT I, J, C 
2220 NEXT J
2230 NEXT I
2240 END
3000 REM Subroutine -- Set up Palette
3010 ARRAY P
3020 LET P[0] = "black"
3030 LET P[1] = "magenta"
3040 LET P[2] = "blue"
3050 LET P[3] = "green"
3060 LET P[4] = "cyan"
3070 LET P[5] = "red"
3080 LET P[6] = "orange"
3090 LET P[7] = "yellow"
3090 LET P[8] = "white"
3100 RETURN

Run BASIC[edit]

'Mandelbrot V4 for RunBasic
'Based on LibertyBasic solution
'copy the code and go to runbasic.com
'http://rosettacode.org/wiki/Mandelbrot_set#Liberty_BASIC
'May 2015 (updated 29 Apr 2018)
'
'Note - we only get so much processing time on the server, so the
'graph is computed in three or four pieces
'
WindowWidth  = 320  'RunBasic max size 800 x 600
WindowHeight = 320
'print zone -2 to 1 (X)
'print zone -1.5 to 1.5 (Y)  
a = -1.5  'graph -1.5 to -0.75, first "loop" 
b = -0.75  'adjust for max processor time (y0 for loop below)

'open "Mandelbrot Set" for graphics_nsb_nf as #w  not used in RunBasic
 
graphic #w, WindowWidth, WindowHeight
'#w "trapclose [quit]"       not used in RunBasic
'#w "down"                   not used in RunBasic
 
cls 
'#w flush() 
#w cls("black")
render #w
 '#w flush()
input "OK, hit enter to continue"; guess
cls
 
[man_calc]
'3/screen size 3/800 = 0.00375  ** 3/790 = 0.0037974
'3/screen size (y) 3/600 = .005 ** 3/590 = 0.0050847
'3/215 = .0139 .0068 = 3/440
cc = 3/299
'
    for x0 = -2 to 1 step cc    
    for y0 = a to b step  cc 
        x = 0
        y = 0
 
        iteration    =   0
        maxIteration = 255 
 
        while ( ( x *x +y *y) <=4) and ( iteration <maxIteration)
            xtemp      =x *x -y *y +x0
            y          =2 *x *y +y0
            x          = xtemp
            iteration  = iteration + 1
        wend
 
        if iteration <>maxIteration then
            c =iteration
        else
            c =0
        end if
 
        call pSet x0, y0, c
        'scan why scan? (wait for user input) with RunBasic ?
    next
next
 
'#w flush()  'what is flush? RunBasic uses the render command.
render #w
 
input "OK, hit enter to continue"; guess
cls
a = a + 0.75
b = b + 0.75
if b > 1.6 then goto[quit] else goto[man_calc]
 
sub pSet x, y, c
    xScreen = 5+(x +2)   /3 * 300 'need positive screen number
    yScreen = 5+(y +1.5) /3 * 300 'and 5x5 boarder
    if c =0 then
        col$ ="red"
    else
        if c mod 2 =1 then col$ ="lightgray" else col$ ="white"
    end if
    #w "color "; col$
    #w "set "; xScreen; " "; yScreen
end sub
 
[quit]
'cls
print
print "This is a Mandelbrot Graph output from www.runbasic.com" 
render #w
print "All done, good bye."
end

Sinclair ZX81 BASIC[edit]

Translation of: QBasic

Requires at least 2k of RAM.

Glacially slow, but does eventually produce a tolerable low-resolution image (screenshot here). You can adjust the constants in lines 30 and 40 to zoom in on a particular area, if you like.

 10 FOR I=0 TO 63
 20 FOR J=43 TO 0 STEP -1
 30 LET X=(I-52)/31
 40 LET Y=(J-22)/31
 50 LET XA=0
 60 LET YA=0
 70 LET ITER=0
 80 LET XTEMP=XA*XA-YA*YA+X
 90 LET YA=2*XA*YA+Y
100 LET XA=XTEMP
110 LET ITER=ITER+1
120 IF XA*XA+YA*YA<=4 AND ITER<200 THEN GOTO 80
130 IF ITER=200 THEN PLOT I, J
140 NEXT J
150 NEXT I

SmileBASIC[edit]

Generates the points at random, gradually building up the image.

X = RNDF()*4-2
Y = RNDF()*4-2@N
N = N+16
I = X+S*S-T*T
T = Y+S*T*2
S = I
IF N < #L&&S*S+T*T < 4 GOTO @N
GPSET X*50+99, Y*50+99, RGB(99 XOR N,N,N)
EXEC.

Alternative, based on the QBasic and other BASIC samples.
The 3DS screen is 400 x 240 pixels. SmileBASIC doesn't have +=, -=, etc. but there are INC and DEC statements.

OPTION STRICT
VAR XP, YP, X, Y, X0, Y0, X2, Y2
VAR NEXT_X, IT, C
FOR XP = -200 TO 199
  FOR YP = -120 TO 119
    X = 0: Y = 0
    X0 = XP / 100: Y0 = YP / 100
    IT = 0
    X2 = X * X: Y2 = Y * Y
    WHILE X2 + Y2 <= 4 AND IT < 100
      NEXT_X = X2 - Y2 + X0
      Y = 2 * X * Y + Y0
      X = NEXT_X
      X2 = X * X: Y2 = Y * Y
      INC IT
    WEND
    IF IT == 100 THEN C = 0 ELSE C = IT
    GPSET XP + 200, YP + 120, RGB((C * 3) MOD 200 + 50, FLOOR(C * 1.2) + 20, C)
  NEXT
NEXT

TI-Basic Color[edit]

ClrDraw
~2->Xmin:1->Xmax:~1->Ymin:1->Ymax
AxesOff
FnOff 
For(A,~2,1,.034
	For(B,~1,1,.036
		A+B[i]->C
		DelVar Z9->N
		While abs(Z)<=2 and N<24
			Z^^2+C->Z
			N+1->N
		End
		Pt-On(real(C),imag(C),N
	End
End

Visual BASIC for Applications on Excel[edit]

Works with: Excel 2013

Based on the BBC BASIC version. Create a spreadsheet with -2 to 2 in row 1 and -2 to 2 in the A column (in steps of your choosing). In the cell B2, call the function with =mandel(B$1,$A2) and copy the cell to all others in the range. Conditionally format the cells to make the colours pleasing (eg based on values, 3-color scale, min value 2 [colour red], midpoint number 10 [green] and highest value black. Then format the cells with the custom type "";"";"" to remove the numbers.

Function mandel(xi As Double, yi As Double)

maxiter = 256
x = 0
y = 0

For i = 1 To maxiter
    If ((x * x) + (y * y)) > 4 Then Exit For
    xt = xi + ((x * x) - (y * y))
    y = yi + (2 * x * y)
    x = xt
    Next
    
mandel = i
End Function

File:Vbamandel.png Edit: I don't seem to be able to upload the screenshot, so I've shared it here: https://goo.gl/photos/LkezpuQziJPAtdnd9

Yabasic[edit]

open window 640, 320
wid = 4
xcenter = -1: ycenter = 0
ms = 0
for xcoord = 0 to 639
   for ycoord = 0 to 160
       ms = 0
       ca =(xcoord-320)/640*wid+xcenter
       cb =(ycoord-160)/640*wid+ycenter
       x = 0: y=0

       for t = 1 to 20
           xnew = x*x-y*y+ca
           ynew = 2*x*y+cb
           x=xnew:y=ynew
           magnitudesquared=x*x+y*y
           ms = magnitudesquared
           if (magnitudesquared > 100) break
           //if(magnitudesquared < 100) then : color 0,0,0 : dot xcoord, ycoord : end if
       next t
       ms = ms+1
       if(ms > 250) then
       	    color 32,64,mod(ms,255)
            dot xcoord, ycoord
            dot xcoord, 320- ycoord
        elseif (ms > 150) then
            color mod(ms,255),64,32
            dot xcoord, ycoord
            dot xcoord, 320-ycoord
        else
            color 0,0,0
            dot xcoord, ycoord
            dot xcoord, 320-ycoord
        end if
    next ycoord
next xcoord

Befunge[edit]

Using 14-bit fixed point arithmetic for simplicity and portability. It should work in most interpreters, but the exact output is implementation dependent, and some will be unbearably slow.

X scale is (-2.0, 0.5); Y scale is (-1, 1); Max iterations 94 with the ASCII character set as the "palette".

0>:00p58*`#@_0>:01p78vv$$<
@^+1g00,+55_v# !`\+*9<>4v$
@v30p20"?~^"< ^+1g10,+*8<$
@>p0\>\::*::882**02g*0v >^
`*:*" d":+*:-*"[Z"+g3 < |<
v-*"[Z"+g30*g20**288\--\<#
>2**5#>8*:*/00g"P"*58*:*v^
v*288 p20/**288:+*"[Z"+-<:
>*%03 p58*:*/01g"3"* v>::^
   \_^#!:-1\+-*2*:*85<^
Output:
}}}}}}}}}|||||||{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzyyyyxwusjuthwyzzzzzzz{{{{{{{
}}}}}}}}|||||||{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzyyyyxwwvtqptvwxyyzzzzzzz{{{{{
}}}}}}}||||||{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzyyyyxwvuqaZlnvwxyyyzzzzzzz{{{{
}}}}}}|||||{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzyyyyxxvqXp^g Ynslvxyyyyyzzzzz{{{
}}}}}}||||{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzyyyxxxxwvtp      6puwxyyyyyyzzzz{{
}}}}}||||{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzyyyxxxxxwwvvqc      &8uvwxxxyyyyyzzz{
}}}}|||{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzyyyywwvtvvvvuutsp      Hrtuuvwxxxxwqxyzz
}}}}||{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzyyyyyxwvqemrttj m id+    PRUiPp_rvvvvudwxyz
}}}||{{{{{{{{{{{{{{{{{{{{{zzzzzzyyyyyyyxxxwurf  ZnW                4nrslnobgwyy
}}}||{{{{{{{{{{{{{{{{{{{zzzzyyyyyyyyyyxxxwvusg                        N  Uquxyy
}}||{{{{{{{{{{{{{{{{{zzzzyyyyyyyyyyyxxxxwvrrrkC                          grwxxy
}}|{{{{{{{{{{{{{{{zzzzyxxxxxyyyyyxxxxxwwukM!f                            ptvwxy
}}|{{{{{{{{{{zzzzzzyyxwsuwwwwwwwwwwwwwvvurn[                              ptuox
}|{{{{{{{zzzzzzzzyyyxxvptuuvvumsuvvvvvvu`                                   hjx
}|{{{{zzzzzzzzzyyyyyxxwusogoqsqg]pptuuttlc                                 ntwx
}{{{zzzzzzzzzyyyyyyxxwwuto  -    O jpssrO                                  nsvx
}{{zzzzzzzzzyyyyyyxwwwvrrT4          TonR                                  Ufwy
}{zzzzzzzzyyyyyxxwttuutqe             Dj                                   $uxy
}zzzzzzzzyxxxxxwwvuppnpn               `                                   twxy
}yyyxxwvwwwxwvvvrtppc  Y                                                 auwxxy
                                                                       dqtvwxyy
}yyyxxwvwwwxwvvvrtppc  Y                                                 auwxxy
}zzzzzzzzyxxxxxwwvuppnpn               `                                   twxy
}{zzzzzzzzyyyyyxxwttuutqe             Dj                                   $uxy
}{{zzzzzzzzzyyyyyyxwwwvrrT4          TonR                                  Ufwy
}{{{zzzzzzzzzyyyyyyxxwwuto  -    O jpssrO                                  nsvx
}|{{{{zzzzzzzzzyyyyyxxwusogoqsqg]pptuuttlc                                 ntwx
}|{{{{{{{zzzzzzzzyyyxxvptuuvvumsuvvvvvvu`                                   hjx
}}|{{{{{{{{{{zzzzzzyyxwsuwwwwwwwwwwwwwvvurn[                              ptuox
}}|{{{{{{{{{{{{{{{zzzzyxxxxxyyyyyxxxxxwwukM!f                            ptvwxy
}}||{{{{{{{{{{{{{{{{{zzzzyyyyyyyyyyyxxxxwvrrrkC                          grwxxy
}}}||{{{{{{{{{{{{{{{{{{{zzzzyyyyyyyyyyxxxwvusg                        N  Uquxyy
}}}||{{{{{{{{{{{{{{{{{{{{{zzzzzzyyyyyyyxxxwurf  ZnW                4nrslnobgwyy
}}}}||{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzyyyyyxwvqemrttj m id+    PRUiPp_rvvvvudwxyz
}}}}|||{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzyyyywwvtvvvvuutsp      Hrtuuvwxxxxwqxyzz
}}}}}||||{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzyyyxxxxxwwvvqc      &8uvwxxxyyyyyzzz{
}}}}}}||||{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzyyyxxxxwvtp      6puwxyyyyyyzzzz{{
}}}}}}|||||{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzyyyyxxvqXp^g Ynslvxyyyyyzzzzz{{{
}}}}}}}||||||{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzyyyyxwvuqaZlnvwxyyyzzzzzzz{{{{
}}}}}}}}|||||||{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzyyyyxwwvtqptvwxyyzzzzzzz{{{{{
}}}}}}}}}|||||||{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzyyyyxwusjuthwyzzzzzzz{{{{{{{

Brace[edit]

This is a simple Mandelbrot plotter. A longer version based on this smooths colors, and avoids calculating the time-consuming black pixels: http://sam.ai.ki/brace/examples/mandelbrot.d/1

#!/usr/bin/env bx
use b

Main():
	num outside = 16, ox = -0.5, oy = 0, r = 1.5
	long i, max_i = 100, rb_i = 30
	space()
	uint32_t *px = pixel()
	num d = 2*r/h, x0 = ox-d*w_2, y0 = oy+d*h_2
	for(y, 0, h):
		cmplx c = x0 + (y0-d*y)*I
		repeat(w):
			cmplx w = 0
			for i=0; i < max_i && cabs(w) < outside; ++i
				w = w*w + c
			*px++ = i < max_i ? rainbow(i*359 / rb_i % 360) : black
			c += d

An example plot from the longer version:

Brace-mandelbrot-small.png

Brainf***[edit]

     A mandelbrot set fractal viewer in brainf*ck written by Erik Bosman
+++++++++++++[->++>>>+++++>++>+<<<<<<]>>>>>++++++>--->>>>>>>>>>+++++++++++++++[[
>>>>>>>>>]+[<<<<<<<<<]>>>>>>>>>-]+[>>>>>>>>[-]>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>[-]+
<<<<<<<+++++[-[->>>>>>>>>+<<<<<<<<<]>>>>>>>>>]>>>>>>>+>>>>>>>>>>>>>>>>>>>>>>>>>>
>+<<<<<<<<<<<<<<<<<[<<<<<<<<<]>>>[-]+[>>>>>>[>>>>>>>[-]>>]<<<<<<<<<[<<<<<<<<<]>>
>>>>>[-]+<<<<<<++++[-[->>>>>>>>>+<<<<<<<<<]>>>>>>>>>]>>>>>>+<<<<<<+++++++[-[->>>
>>>>>>+<<<<<<<<<]>>>>>>>>>]>>>>>>+<<<<<<<<<<<<<<<<[<<<<<<<<<]>>>[[-]>>>>>>[>>>>>
>>[-<<<<<<+>>>>>>]<<<<<<[->>>>>>+<<+<<<+<]>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>
[>>>>>>>>[-<<<<<<<+>>>>>>>]<<<<<<<[->>>>>>>+<<+<<<+<<]>>>>>>>>]<<<<<<<<<[<<<<<<<
<<]>>>>>>>[-<<<<<<<+>>>>>>>]<<<<<<<[->>>>>>>+<<+<<<<<]>>>>>>>>>+++++++++++++++[[
>>>>>>>>>]+>[-]>[-]>[-]>[-]>[-]>[-]>[-]>[-]>[-]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>-]+[
>+>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>->>>>[-<<<<+>>>>]<<<<[->>>>+<<<<<[->>[
-<<+>>]<<[->>+>>+<<<<]+>>>>>>>>>]<<<<<<<<[<<<<<<<<<]]>>>>>>>>>[>>>>>>>>>]<<<<<<<
<<[>[->>>>>>>>>+<<<<<<<<<]<<<<<<<<<<]>[->>>>>>>>>+<<<<<<<<<]<+>>>>>>>>]<<<<<<<<<
[>[-]<->>>>[-<<<<+>[<->-<<<<<<+>>>>>>]<[->+<]>>>>]<<<[->>>+<<<]<+<<<<<<<<<]>>>>>
>>>>[>+>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>->>>>>[-<<<<<+>>>>>]<<<<<[->>>>>+
<<<<<<[->>>[-<<<+>>>]<<<[->>>+>+<<<<]+>>>>>>>>>]<<<<<<<<[<<<<<<<<<]]>>>>>>>>>[>>
>>>>>>>]<<<<<<<<<[>>[->>>>>>>>>+<<<<<<<<<]<<<<<<<<<<<]>>[->>>>>>>>>+<<<<<<<<<]<<
+>>>>>>>>]<<<<<<<<<[>[-]<->>>>[-<<<<+>[<->-<<<<<<+>>>>>>]<[->+<]>>>>]<<<[->>>+<<
<]<+<<<<<<<<<]>>>>>>>>>[>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>]>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>+++++++++++++++[[>>>>
>>>>>]<<<<<<<<<-<<<<<<<<<[<<<<<<<<<]>>>>>>>>>-]+>>>>>>>>>>>>>>>>>>>>>+<<<[<<<<<<
<<<]>>>>>>>>>[>>>[-<<<->>>]+<<<[->>>->[-<<<<+>>>>]<<<<[->>>>+<<<<<<<<<<<<<[<<<<<
<<<<]>>>>[-]+>>>>>[>>>>>>>>>]>+<]]+>>>>[-<<<<->>>>]+<<<<[->>>>-<[-<<<+>>>]<<<[->
>>+<<<<<<<<<<<<[<<<<<<<<<]>>>[-]+>>>>>>[>>>>>>>>>]>[-]+<]]+>[-<[>>>>>>>>>]<<<<<<
<<]>>>>>>>>]<<<<<<<<<[<<<<<<<<<]<<<<<<<[->+>>>-<<<<]>>>>>>>>>+++++++++++++++++++
+++++++>>[-<<<<+>>>>]<<<<[->>>>+<<[-]<<]>>[<<<<<<<+<[-<+>>>>+<<[-]]>[-<<[->+>>>-
<<<<]>>>]>>>>>>>>>>>>>[>>[-]>[-]>[-]>>>>>]<<<<<<<<<[<<<<<<<<<]>>>[-]>>>>>>[>>>>>
[-<<<<+>>>>]<<<<[->>>>+<<<+<]>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>>[-<<<<<<<<
<+>>>>>>>>>]>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>+++++++++++++++[[>>>>>>>>>]+>[-
]>[-]>[-]>[-]>[-]>[-]>[-]>[-]>[-]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>-]+[>+>>>>>>>>]<<<
<<<<<<[<<<<<<<<<]>>>>>>>>>[>->>>>>[-<<<<<+>>>>>]<<<<<[->>>>>+<<<<<<[->>[-<<+>>]<
<[->>+>+<<<]+>>>>>>>>>]<<<<<<<<[<<<<<<<<<]]>>>>>>>>>[>>>>>>>>>]<<<<<<<<<[>[->>>>
>>>>>+<<<<<<<<<]<<<<<<<<<<]>[->>>>>>>>>+<<<<<<<<<]<+>>>>>>>>]<<<<<<<<<[>[-]<->>>
[-<<<+>[<->-<<<<<<<+>>>>>>>]<[->+<]>>>]<<[->>+<<]<+<<<<<<<<<]>>>>>>>>>[>>>>>>[-<
<<<<+>>>>>]<<<<<[->>>>>+<<<<+<]>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>+>>>>>>>>
]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>->>>>>[-<<<<<+>>>>>]<<<<<[->>>>>+<<<<<<[->>[-<<+
>>]<<[->>+>>+<<<<]+>>>>>>>>>]<<<<<<<<[<<<<<<<<<]]>>>>>>>>>[>>>>>>>>>]<<<<<<<<<[>
[->>>>>>>>>+<<<<<<<<<]<<<<<<<<<<]>[->>>>>>>>>+<<<<<<<<<]<+>>>>>>>>]<<<<<<<<<[>[-
]<->>>>[-<<<<+>[<->-<<<<<<+>>>>>>]<[->+<]>>>>]<<<[->>>+<<<]<+<<<<<<<<<]>>>>>>>>>
[>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
]>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>++++++++
+++++++[[>>>>>>>>>]<<<<<<<<<-<<<<<<<<<[<<<<<<<<<]>>>>>>>>>-]+[>>>>>>>>[-<<<<<<<+
>>>>>>>]<<<<<<<[->>>>>>>+<<<<<<+<]>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>>>>>>[
-]>>>]<<<<<<<<<[<<<<<<<<<]>>>>+>[-<-<<<<+>>>>>]>[-<<<<<<[->>>>>+<++<<<<]>>>>>[-<
<<<<+>>>>>]<->+>]<[->+<]<<<<<[->>>>>+<<<<<]>>>>>>[-]<<<<<<+>>>>[-<<<<->>>>]+<<<<
[->>>>->>>>>[>>[-<<->>]+<<[->>->[-<<<+>>>]<<<[->>>+<<<<<<<<<<<<[<<<<<<<<<]>>>[-]
+>>>>>>[>>>>>>>>>]>+<]]+>>>[-<<<->>>]+<<<[->>>-<[-<<+>>]<<[->>+<<<<<<<<<<<[<<<<<
<<<<]>>>>[-]+>>>>>[>>>>>>>>>]>[-]+<]]+>[-<[>>>>>>>>>]<<<<<<<<]>>>>>>>>]<<<<<<<<<
[<<<<<<<<<]>>>>[-<<<<+>>>>]<<<<[->>>>+>>>>>[>+>>[-<<->>]<<[->>+<<]>>>>>>>>]<<<<<
<<<+<[>[->>>>>+<<<<[->>>>-<<<<<<<<<<<<<<+>>>>>>>>>>>[->>>+<<<]<]>[->>>-<<<<<<<<<
<<<<<+>>>>>>>>>>>]<<]>[->>>>+<<<[->>>-<<<<<<<<<<<<<<+>>>>>>>>>>>]<]>[->>>+<<<]<<
<<<<<<<<<<]>>>>[-]<<<<]>>>[-<<<+>>>]<<<[->>>+>>>>>>[>+>[-<->]<[->+<]>>>>>>>>]<<<
<<<<<+<[>[->>>>>+<<<[->>>-<<<<<<<<<<<<<<+>>>>>>>>>>[->>>>+<<<<]>]<[->>>>-<<<<<<<
<<<<<<<+>>>>>>>>>>]<]>>[->>>+<<<<[->>>>-<<<<<<<<<<<<<<+>>>>>>>>>>]>]<[->>>>+<<<<
]<<<<<<<<<<<]>>>>>>+<<<<<<]]>>>>[-<<<<+>>>>]<<<<[->>>>+>>>>>[>>>>>>>>>]<<<<<<<<<
[>[->>>>>+<<<<[->>>>-<<<<<<<<<<<<<<+>>>>>>>>>>>[->>>+<<<]<]>[->>>-<<<<<<<<<<<<<<
+>>>>>>>>>>>]<<]>[->>>>+<<<[->>>-<<<<<<<<<<<<<<+>>>>>>>>>>>]<]>[->>>+<<<]<<<<<<<
<<<<<]]>[-]>>[-]>[-]>>>>>[>>[-]>[-]>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>>>>>[-<
<<<+>>>>]<<<<[->>>>+<<<+<]>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>+++++++++++++++[
[>>>>>>>>>]+>[-]>[-]>[-]>[-]>[-]>[-]>[-]>[-]>[-]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>-]+
[>+>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>->>>>[-<<<<+>>>>]<<<<[->>>>+<<<<<[->>
[-<<+>>]<<[->>+>+<<<]+>>>>>>>>>]<<<<<<<<[<<<<<<<<<]]>>>>>>>>>[>>>>>>>>>]<<<<<<<<
<[>[->>>>>>>>>+<<<<<<<<<]<<<<<<<<<<]>[->>>>>>>>>+<<<<<<<<<]<+>>>>>>>>]<<<<<<<<<[
>[-]<->>>[-<<<+>[<->-<<<<<<<+>>>>>>>]<[->+<]>>>]<<[->>+<<]<+<<<<<<<<<]>>>>>>>>>[
>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]>
>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>[-]>>>>+++++++++++++++[[>>>>>>>>>]<<<<<<<<<-<<<<<
<<<<[<<<<<<<<<]>>>>>>>>>-]+[>>>[-<<<->>>]+<<<[->>>->[-<<<<+>>>>]<<<<[->>>>+<<<<<
<<<<<<<<[<<<<<<<<<]>>>>[-]+>>>>>[>>>>>>>>>]>+<]]+>>>>[-<<<<->>>>]+<<<<[->>>>-<[-
<<<+>>>]<<<[->>>+<<<<<<<<<<<<[<<<<<<<<<]>>>[-]+>>>>>>[>>>>>>>>>]>[-]+<]]+>[-<[>>
>>>>>>>]<<<<<<<<]>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>[-<<<+>>>]<<<[->>>+>>>>>>[>+>>>
[-<<<->>>]<<<[->>>+<<<]>>>>>>>>]<<<<<<<<+<[>[->+>[-<-<<<<<<<<<<+>>>>>>>>>>>>[-<<
+>>]<]>[-<<-<<<<<<<<<<+>>>>>>>>>>>>]<<<]>>[-<+>>[-<<-<<<<<<<<<<+>>>>>>>>>>>>]<]>
[-<<+>>]<<<<<<<<<<<<<]]>>>>[-<<<<+>>>>]<<<<[->>>>+>>>>>[>+>>[-<<->>]<<[->>+<<]>>
>>>>>>]<<<<<<<<+<[>[->+>>[-<<-<<<<<<<<<<+>>>>>>>>>>>[-<+>]>]<[-<-<<<<<<<<<<+>>>>
>>>>>>>]<<]>>>[-<<+>[-<-<<<<<<<<<<+>>>>>>>>>>>]>]<[-<+>]<<<<<<<<<<<<]>>>>>+<<<<<
]>>>>>>>>>[>>>[-]>[-]>[-]>>>>]<<<<<<<<<[<<<<<<<<<]>>>[-]>[-]>>>>>[>>>>>>>[-<<<<<
<+>>>>>>]<<<<<<[->>>>>>+<<<<+<<]>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>+>[-<-<<<<+>>>>
>]>>[-<<<<<<<[->>>>>+<++<<<<]>>>>>[-<<<<<+>>>>>]<->+>>]<<[->>+<<]<<<<<[->>>>>+<<
<<<]+>>>>[-<<<<->>>>]+<<<<[->>>>->>>>>[>>>[-<<<->>>]+<<<[->>>-<[-<<+>>]<<[->>+<<
<<<<<<<<<[<<<<<<<<<]>>>>[-]+>>>>>[>>>>>>>>>]>+<]]+>>[-<<->>]+<<[->>->[-<<<+>>>]<
<<[->>>+<<<<<<<<<<<<[<<<<<<<<<]>>>[-]+>>>>>>[>>>>>>>>>]>[-]+<]]+>[-<[>>>>>>>>>]<
<<<<<<<]>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>[-<<<+>>>]<<<[->>>+>>>>>>[>+>[-<->]<[->+
<]>>>>>>>>]<<<<<<<<+<[>[->>>>+<<[->>-<<<<<<<<<<<<<+>>>>>>>>>>[->>>+<<<]>]<[->>>-
<<<<<<<<<<<<<+>>>>>>>>>>]<]>>[->>+<<<[->>>-<<<<<<<<<<<<<+>>>>>>>>>>]>]<[->>>+<<<
]<<<<<<<<<<<]>>>>>[-]>>[-<<<<<<<+>>>>>>>]<<<<<<<[->>>>>>>+<<+<<<<<]]>>>>[-<<<<+>
>>>]<<<<[->>>>+>>>>>[>+>>[-<<->>]<<[->>+<<]>>>>>>>>]<<<<<<<<+<[>[->>>>+<<<[->>>-
<<<<<<<<<<<<<+>>>>>>>>>>>[->>+<<]<]>[->>-<<<<<<<<<<<<<+>>>>>>>>>>>]<<]>[->>>+<<[
->>-<<<<<<<<<<<<<+>>>>>>>>>>>]<]>[->>+<<]<<<<<<<<<<<<]]>>>>[-]<<<<]>>>>[-<<<<+>>
>>]<<<<[->>>>+>[-]>>[-<<<<<<<+>>>>>>>]<<<<<<<[->>>>>>>+<<+<<<<<]>>>>>>>>>[>>>>>>
>>>]<<<<<<<<<[>[->>>>+<<<[->>>-<<<<<<<<<<<<<+>>>>>>>>>>>[->>+<<]<]>[->>-<<<<<<<<
<<<<<+>>>>>>>>>>>]<<]>[->>>+<<[->>-<<<<<<<<<<<<<+>>>>>>>>>>>]<]>[->>+<<]<<<<<<<<
<<<<]]>>>>>>>>>[>>[-]>[-]>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>[-]>[-]>>>>>[>>>>>[-<<<<+
>>>>]<<<<[->>>>+<<<+<]>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>>>>>>[-<<<<<+>>>>>
]<<<<<[->>>>>+<<<+<<]>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>+++++++++++++++[[>>>>
>>>>>]+>[-]>[-]>[-]>[-]>[-]>[-]>[-]>[-]>[-]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>-]+[>+>>
>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>->>>>[-<<<<+>>>>]<<<<[->>>>+<<<<<[->>[-<<+
>>]<<[->>+>>+<<<<]+>>>>>>>>>]<<<<<<<<[<<<<<<<<<]]>>>>>>>>>[>>>>>>>>>]<<<<<<<<<[>
[->>>>>>>>>+<<<<<<<<<]<<<<<<<<<<]>[->>>>>>>>>+<<<<<<<<<]<+>>>>>>>>]<<<<<<<<<[>[-
]<->>>>[-<<<<+>[<->-<<<<<<+>>>>>>]<[->+<]>>>>]<<<[->>>+<<<]<+<<<<<<<<<]>>>>>>>>>
[>+>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>->>>>>[-<<<<<+>>>>>]<<<<<[->>>>>+<<<<
<<[->>>[-<<<+>>>]<<<[->>>+>+<<<<]+>>>>>>>>>]<<<<<<<<[<<<<<<<<<]]>>>>>>>>>[>>>>>>
>>>]<<<<<<<<<[>>[->>>>>>>>>+<<<<<<<<<]<<<<<<<<<<<]>>[->>>>>>>>>+<<<<<<<<<]<<+>>>
>>>>>]<<<<<<<<<[>[-]<->>>>[-<<<<+>[<->-<<<<<<+>>>>>>]<[->+<]>>>>]<<<[->>>+<<<]<+
<<<<<<<<<]>>>>>>>>>[>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>]>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>+++++++++++++++[[>>>>>>>>
>]<<<<<<<<<-<<<<<<<<<[<<<<<<<<<]>>>>>>>>>-]+>>>>>>>>>>>>>>>>>>>>>+<<<[<<<<<<<<<]
>>>>>>>>>[>>>[-<<<->>>]+<<<[->>>->[-<<<<+>>>>]<<<<[->>>>+<<<<<<<<<<<<<[<<<<<<<<<
]>>>>[-]+>>>>>[>>>>>>>>>]>+<]]+>>>>[-<<<<->>>>]+<<<<[->>>>-<[-<<<+>>>]<<<[->>>+<
<<<<<<<<<<<[<<<<<<<<<]>>>[-]+>>>>>>[>>>>>>>>>]>[-]+<]]+>[-<[>>>>>>>>>]<<<<<<<<]>
>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>->>[-<<<<+>>>>]<<<<[->>>>+<<[-]<<]>>]<<+>>>>[-<<<<
->>>>]+<<<<[->>>>-<<<<<<.>>]>>>>[-<<<<<<<.>>>>>>>]<<<[-]>[-]>[-]>[-]>[-]>[-]>>>[
>[-]>[-]>[-]>[-]>[-]>[-]>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>>>>>[-]>>>>]<<<<<<<<<
[<<<<<<<<<]>+++++++++++[-[->>>>>>>>>+<<<<<<<<<]>>>>>>>>>]>>>>+>>>>>>>>>+<<<<<<<<
<<<<<<[<<<<<<<<<]>>>>>>>[-<<<<<<<+>>>>>>>]<<<<<<<[->>>>>>>+[-]>>[>>>>>>>>>]<<<<<
<<<<[>>>>>>>[-<<<<<<+>>>>>>]<<<<<<[->>>>>>+<<<<<<<[<<<<<<<<<]>>>>>>>[-]+>>>]<<<<
<<<<<<]]>>>>>>>[-<<<<<<<+>>>>>>>]<<<<<<<[->>>>>>>+>>[>+>>>>[-<<<<->>>>]<<<<[->>>
>+<<<<]>>>>>>>>]<<+<<<<<<<[>>>>>[->>+<<]<<<<<<<<<<<<<<]>>>>>>>>>[>>>>>>>>>]<<<<<
<<<<[>[-]<->>>>>>>[-<<<<<<<+>[<->-<<<+>>>]<[->+<]>>>>>>>]<<<<<<[->>>>>>+<<<<<<]<
+<<<<<<<<<]>>>>>>>-<<<<[-]+<<<]+>>>>>>>[-<<<<<<<->>>>>>>]+<<<<<<<[->>>>>>>->>[>>
>>>[->>+<<]>>>>]<<<<<<<<<[>[-]<->>>>>>>[-<<<<<<<+>[<->-<<<+>>>]<[->+<]>>>>>>>]<<
<<<<[->>>>>>+<<<<<<]<+<<<<<<<<<]>+++++[-[->>>>>>>>>+<<<<<<<<<]>>>>>>>>>]>>>>+<<<
<<[<<<<<<<<<]>>>>>>>>>[>>>>>[-<<<<<->>>>>]+<<<<<[->>>>>->>[-<<<<<<<+>>>>>>>]<<<<
<<<[->>>>>>>+<<<<<<<<<<<<<<<<[<<<<<<<<<]>>>>[-]+>>>>>[>>>>>>>>>]>+<]]+>>>>>>>[-<
<<<<<<->>>>>>>]+<<<<<<<[->>>>>>>-<<[-<<<<<+>>>>>]<<<<<[->>>>>+<<<<<<<<<<<<<<[<<<
<<<<<<]>>>[-]+>>>>>>[>>>>>>>>>]>[-]+<]]+>[-<[>>>>>>>>>]<<<<<<<<]>>>>>>>>]<<<<<<<
<<[<<<<<<<<<]>>>>[-]<<<+++++[-[->>>>>>>>>+<<<<<<<<<]>>>>>>>>>]>>>>-<<<<<[<<<<<<<
<<]]>>>]<<<<.>>>>>>>>>>[>>>>>>[-]>>>]<<<<<<<<<[<<<<<<<<<]>++++++++++[-[->>>>>>>>
>+<<<<<<<<<]>>>>>>>>>]>>>>>+>>>>>>>>>+<<<<<<<<<<<<<<<[<<<<<<<<<]>>>>>>>>[-<<<<<<
<<+>>>>>>>>]<<<<<<<<[->>>>>>>>+[-]>[>>>>>>>>>]<<<<<<<<<[>>>>>>>>[-<<<<<<<+>>>>>>
>]<<<<<<<[->>>>>>>+<<<<<<<<[<<<<<<<<<]>>>>>>>>[-]+>>]<<<<<<<<<<]]>>>>>>>>[-<<<<<
<<<+>>>>>>>>]<<<<<<<<[->>>>>>>>+>[>+>>>>>[-<<<<<->>>>>]<<<<<[->>>>>+<<<<<]>>>>>>
>>]<+<<<<<<<<[>>>>>>[->>+<<]<<<<<<<<<<<<<<<]>>>>>>>>>[>>>>>>>>>]<<<<<<<<<[>[-]<-
>>>>>>>>[-<<<<<<<<+>[<->-<<+>>]<[->+<]>>>>>>>>]<<<<<<<[->>>>>>>+<<<<<<<]<+<<<<<<
<<<]>>>>>>>>-<<<<<[-]+<<<]+>>>>>>>>[-<<<<<<<<->>>>>>>>]+<<<<<<<<[->>>>>>>>->[>>>
>>>[->>+<<]>>>]<<<<<<<<<[>[-]<->>>>>>>>[-<<<<<<<<+>[<->-<<+>>]<[->+<]>>>>>>>>]<<
<<<<<[->>>>>>>+<<<<<<<]<+<<<<<<<<<]>+++++[-[->>>>>>>>>+<<<<<<<<<]>>>>>>>>>]>>>>>
+>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<[<<<<<<<<<]>>>>>>>>>[>>>>>>[-<<<<<<->>>>>>]+<
<<<<<[->>>>>>->>[-<<<<<<<<+>>>>>>>>]<<<<<<<<[->>>>>>>>+<<<<<<<<<<<<<<<<<[<<<<<<<
<<]>>>>[-]+>>>>>[>>>>>>>>>]>+<]]+>>>>>>>>[-<<<<<<<<->>>>>>>>]+<<<<<<<<[->>>>>>>>
-<<[-<<<<<<+>>>>>>]<<<<<<[->>>>>>+<<<<<<<<<<<<<<<[<<<<<<<<<]>>>[-]+>>>>>>[>>>>>>
>>>]>[-]+<]]+>[-<[>>>>>>>>>]<<<<<<<<]>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>[-]<<<++++
+[-[->>>>>>>>>+<<<<<<<<<]>>>>>>>>>]>>>>>->>>>>>>>>>>>>>>>>>>>>>>>>>>-<<<<<<[<<<<
<<<<<]]>>>]
Output:
AAAAAAAAAAAAAAAABBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDEGFFEEEEDDDDDDCCCCCCCCCBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
AAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDEEEFGIIGFFEEEDDDDDDDDCCCCCCCCCBBBBBBBBBBBBBBBBBBBBBBBBBB
AAAAAAAAAAAAABBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDEEEEFFFI KHGGGHGEDDDDDDDDDCCCCCCCCCBBBBBBBBBBBBBBBBBBBBBBB
AAAAAAAAAAAABBBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDEEEEEFFGHIMTKLZOGFEEDDDDDDDDDCCCCCCCCCBBBBBBBBBBBBBBBBBBBBB
AAAAAAAAAAABBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDEEEEEEFGGHHIKPPKIHGFFEEEDDDDDDDDDCCCCCCCCCCBBBBBBBBBBBBBBBBBB
AAAAAAAAAABBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDEEEEEEFFGHIJKS  X KHHGFEEEEEDDDDDDDDDCCCCCCCCCCBBBBBBBBBBBBBBBB
AAAAAAAAABBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDEEEEEEFFGQPUVOTY   ZQL[MHFEEEEEEEDDDDDDDCCCCCCCCCCCBBBBBBBBBBBBBB
AAAAAAAABBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDEEEEEFFFFFGGHJLZ         UKHGFFEEEEEEEEDDDDDCCCCCCCCCCCCBBBBBBBBBBBB
AAAAAAABBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDEEEEFFFFFFGGGGHIKP           KHHGGFFFFEEEEEEDDDDDCCCCCCCCCCCBBBBBBBBBBB
AAAAAAABBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDEEEEEFGGHIIHHHHHIIIJKMR        VMKJIHHHGFFFFFFGSGEDDDDCCCCCCCCCCCCBBBBBBBBB
AAAAAABBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDEEEEEEFFGHK   MKJIJO  N R  X      YUSR PLV LHHHGGHIOJGFEDDDCCCCCCCCCCCCBBBBBBBB
AAAAABBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDEEEEEEEEEFFFFGH O    TN S                       NKJKR LLQMNHEEDDDCCCCCCCCCCCCBBBBBBB
AAAAABBCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDEEEEEEEEEEEEFFFFFGHHIN                                 Q     UMWGEEEDDDCCCCCCCCCCCCBBBBBB
AAAABBCCCCCCCCCCCCCCCCCCCCCCCCCDDDDEEEEEEEEEEEEEEEFFFFFFGHIJKLOT                                     [JGFFEEEDDCCCCCCCCCCCCCBBBBB
AAAABCCCCCCCCCCCCCCCCCCCCCCDDDDEEEEEEEEEEEEEEEEFFFFFFGGHYV RQU                                     QMJHGGFEEEDDDCCCCCCCCCCCCCBBBB
AAABCCCCCCCCCCCCCCCCCDDDDDDDEEFJIHFFFFFFFFFFFFFFGGGGGGHIJN                                            JHHGFEEDDDDCCCCCCCCCCCCCBBB
AAABCCCCCCCCCCCDDDDDDDDDDEEEEFFHLKHHGGGGHHMJHGGGGGGHHHIKRR                                           UQ L HFEDDDDCCCCCCCCCCCCCCBB
AABCCCCCCCCDDDDDDDDDDDEEEEEEFFFHKQMRKNJIJLVS JJKIIIIIIJLR                                               YNHFEDDDDDCCCCCCCCCCCCCBB
AABCCCCCDDDDDDDDDDDDEEEEEEEFFGGHIJKOU  O O   PR LLJJJKL                                                OIHFFEDDDDDCCCCCCCCCCCCCCB
AACCCDDDDDDDDDDDDDEEEEEEEEEFGGGHIJMR              RMLMN                                                 NTFEEDDDDDDCCCCCCCCCCCCCB
AACCDDDDDDDDDDDDEEEEEEEEEFGGGHHKONSZ                QPR                                                NJGFEEDDDDDDCCCCCCCCCCCCCC
ABCDDDDDDDDDDDEEEEEFFFFFGIPJIIJKMQ                   VX                                                 HFFEEDDDDDDCCCCCCCCCCCCCC
ACDDDDDDDDDDEFFFFFFFGGGGHIKZOOPPS                                                                      HGFEEEDDDDDDCCCCCCCCCCCCCC
ADEEEEFFFGHIGGGGGGHHHHIJJLNY                                                                        TJHGFFEEEDDDDDDDCCCCCCCCCCCCC
A                                                                                                 PLJHGGFFEEEDDDDDDDCCCCCCCCCCCCC
ADEEEEFFFGHIGGGGGGHHHHIJJLNY                                                                        TJHGFFEEEDDDDDDDCCCCCCCCCCCCC
ACDDDDDDDDDDEFFFFFFFGGGGHIKZOOPPS                                                                      HGFEEEDDDDDDCCCCCCCCCCCCCC
ABCDDDDDDDDDDDEEEEEFFFFFGIPJIIJKMQ                   VX                                                 HFFEEDDDDDDCCCCCCCCCCCCCC
AACCDDDDDDDDDDDDEEEEEEEEEFGGGHHKONSZ                QPR                                                NJGFEEDDDDDDCCCCCCCCCCCCCC
AACCCDDDDDDDDDDDDDEEEEEEEEEFGGGHIJMR              RMLMN                                                 NTFEEDDDDDDCCCCCCCCCCCCCB
AABCCCCCDDDDDDDDDDDDEEEEEEEFFGGHIJKOU  O O   PR LLJJJKL                                                OIHFFEDDDDDCCCCCCCCCCCCCCB
AABCCCCCCCCDDDDDDDDDDDEEEEEEFFFHKQMRKNJIJLVS JJKIIIIIIJLR                                               YNHFEDDDDDCCCCCCCCCCCCCBB
AAABCCCCCCCCCCCDDDDDDDDDDEEEEFFHLKHHGGGGHHMJHGGGGGGHHHIKRR                                           UQ L HFEDDDDCCCCCCCCCCCCCCBB
AAABCCCCCCCCCCCCCCCCCDDDDDDDEEFJIHFFFFFFFFFFFFFFGGGGGGHIJN                                            JHHGFEEDDDDCCCCCCCCCCCCCBBB
AAAABCCCCCCCCCCCCCCCCCCCCCCDDDDEEEEEEEEEEEEEEEEFFFFFFGGHYV RQU                                     QMJHGGFEEEDDDCCCCCCCCCCCCCBBBB
AAAABBCCCCCCCCCCCCCCCCCCCCCCCCCDDDDEEEEEEEEEEEEEEEFFFFFFGHIJKLOT                                     [JGFFEEEDDCCCCCCCCCCCCCBBBBB
AAAAABBCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDEEEEEEEEEEEEFFFFFGHHIN                                 Q     UMWGEEEDDDCCCCCCCCCCCCBBBBBB
AAAAABBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDEEEEEEEEEFFFFGH O    TN S                       NKJKR LLQMNHEEDDDCCCCCCCCCCCCBBBBBBB
AAAAAABBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDEEEEEEFFGHK   MKJIJO  N R  X      YUSR PLV LHHHGGHIOJGFEDDDCCCCCCCCCCCCBBBBBBBB
AAAAAAABBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDEEEEEFGGHIIHHHHHIIIJKMR        VMKJIHHHGFFFFFFGSGEDDDDCCCCCCCCCCCCBBBBBBBBB
AAAAAAABBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDEEEEFFFFFFGGGGHIKP           KHHGGFFFFEEEEEEDDDDDCCCCCCCCCCCBBBBBBBBBBB
AAAAAAAABBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDEEEEEFFFFFGGHJLZ         UKHGFFEEEEEEEEDDDDDCCCCCCCCCCCCBBBBBBBBBBBB
AAAAAAAAABBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDEEEEEEFFGQPUVOTY   ZQL[MHFEEEEEEEDDDDDDDCCCCCCCCCCCBBBBBBBBBBBBBB
AAAAAAAAAABBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDEEEEEEFFGHIJKS  X KHHGFEEEEEDDDDDDDDDCCCCCCCCCCBBBBBBBBBBBBBBBB
AAAAAAAAAAABBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDEEEEEEFGGHHIKPPKIHGFFEEEDDDDDDDDDCCCCCCCCCCBBBBBBBBBBBBBBBBBB
AAAAAAAAAAAABBBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDEEEEEFFGHIMTKLZOGFEEDDDDDDDDDCCCCCCCCCBBBBBBBBBBBBBBBBBBBBB
AAAAAAAAAAAAABBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDEEEEFFFI KHGGGHGEDDDDDDDDDCCCCCCCCCBBBBBBBBBBBBBBBBBBBBBBB
AAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDEEEFGIIGFFEEEDDDDDDDDCCCCCCCCCBBBBBBBBBBBBBBBBBBBBBBBBBB

C[edit]

PPM non interactive[edit]

Here is one file program. It directly creates ppm file.

 /* 
 c program:
 --------------------------------
  1. draws Mandelbrot set for Fc(z)=z*z +c
  using Mandelbrot algorithm ( boolean escape time )
 -------------------------------         
 2. technique of creating ppm file is  based on the code of Claudio Rocchini
 http://en.wikipedia.org/wiki/Image:Color_complex_plot.jpg
 create 24 bit color graphic file ,  portable pixmap file = PPM 
 see http://en.wikipedia.org/wiki/Portable_pixmap
 to see the file use external application ( graphic viewer)
  */
 #include <stdio.h>
 #include <math.h>
 int main()
 {
          /* screen ( integer) coordinate */
        int iX,iY;
        const int iXmax = 800; 
        const int iYmax = 800;
        /* world ( double) coordinate = parameter plane*/
        double Cx,Cy;
        const double CxMin=-2.5;
        const double CxMax=1.5;
        const double CyMin=-2.0;
        const double CyMax=2.0;
        /* */
        double PixelWidth=(CxMax-CxMin)/iXmax;
        double PixelHeight=(CyMax-CyMin)/iYmax;
        /* color component ( R or G or B) is coded from 0 to 255 */
        /* it is 24 bit color RGB file */
        const int MaxColorComponentValue=255; 
        FILE * fp;
        char *filename="new1.ppm";
        char *comment="# ";/* comment should start with # */
        static unsigned char color[3];
        /* Z=Zx+Zy*i  ;   Z0 = 0 */
        double Zx, Zy;
        double Zx2, Zy2; /* Zx2=Zx*Zx;  Zy2=Zy*Zy  */
        /*  */
        int Iteration;
        const int IterationMax=200;
        /* bail-out value , radius of circle ;  */
        const double EscapeRadius=2;
        double ER2=EscapeRadius*EscapeRadius;
        /*create new file,give it a name and open it in binary mode  */
        fp= fopen(filename,"wb"); /* b -  binary mode */
        /*write ASCII header to the file*/
        fprintf(fp,"P6\n %s\n %d\n %d\n %d\n",comment,iXmax,iYmax,MaxColorComponentValue);
        /* compute and write image data bytes to the file*/
        for(iY=0;iY<iYmax;iY++)
        {
             Cy=CyMin + iY*PixelHeight;
             if (fabs(Cy)< PixelHeight/2) Cy=0.0; /* Main antenna */
             for(iX=0;iX<iXmax;iX++)
             {         
                        Cx=CxMin + iX*PixelWidth;
                        /* initial value of orbit = critical point Z= 0 */
                        Zx=0.0;
                        Zy=0.0;
                        Zx2=Zx*Zx;
                        Zy2=Zy*Zy;
                        /* */
                        for (Iteration=0;Iteration<IterationMax && ((Zx2+Zy2)<ER2);Iteration++)
                        {
                            Zy=2*Zx*Zy + Cy;
                            Zx=Zx2-Zy2 +Cx;
                            Zx2=Zx*Zx;
                            Zy2=Zy*Zy;
                        };
                        /* compute  pixel color (24 bit = 3 bytes) */
                        if (Iteration==IterationMax)
                        { /*  interior of Mandelbrot set = black */
                           color[0]=0;
                           color[1]=0;
                           color[2]=0;                           
                        }
                     else 
                        { /* exterior of Mandelbrot set = white */
                             color[0]=255; /* Red*/
                             color[1]=255;  /* Green */ 
                             color[2]=255;/* Blue */
                        };
                        /*write color to the file*/
                        fwrite(color,1,3,fp);
                }
        }
        fclose(fp);
        return 0;
 }

PPM Interactive[edit]

Mandel-C-GL.png

Infinitely zoomable OpenGL program. Adjustable colors, max iteration, black and white, screen dump, etc. Compile with gcc mandelbrot.c -lglut -lGLU -lGL -lm

  • OpenBSD users, install freeglut package, and compile with make mandelbrot CPPFLAGS='-I/usr/local/include `pkg-config glu --cflags`' LDLIBS='-L/usr/local/lib -lglut `pkg-config glu --libs` -lm'
Library: GLUT
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glu.h>
 
void set_texture();
 
typedef struct {unsigned char r, g, b;} rgb_t;
rgb_t **tex = 0;
int gwin;
GLuint texture;
int width, height;
int tex_w, tex_h;
double scale = 1./256;
double cx = -.6, cy = 0;
int color_rotate = 0;
int saturation = 1;
int invert = 0;
int max_iter = 256;
 
void render()
{
	double	x = (double)width /tex_w,
		y = (double)height/tex_h;
 
	glClear(GL_COLOR_BUFFER_BIT);
	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
 
	glBindTexture(GL_TEXTURE_2D, texture);
 
	glBegin(GL_QUADS);
 
	glTexCoord2f(0, 0); glVertex2i(0, 0);
	glTexCoord2f(x, 0); glVertex2i(width, 0);
	glTexCoord2f(x, y); glVertex2i(width, height);
	glTexCoord2f(0, y); glVertex2i(0, height);
 
	glEnd();
 
	glFlush();
	glFinish();
}
 
int dump = 1;
void screen_dump()
{
	char fn[100];
	int i;
	sprintf(fn, "screen%03d.ppm", dump++);
	FILE *fp = fopen(fn, "w");
	fprintf(fp, "P6\n%d %d\n255\n", width, height);
	for (i = height - 1; i >= 0; i--)
		fwrite(tex[i], 1, width * 3, fp);
	fclose(fp);
	printf("%s written\n", fn);
}
 
void keypress(unsigned char key, int x, int y)
{
	switch(key) {
	case 'q':	glFinish();
			glutDestroyWindow(gwin);
			return;
	case 27:	scale = 1./256; cx = -.6; cy = 0; break;
 
	case 'r':	color_rotate = (color_rotate + 1) % 6;
			break;
 
	case '>': case '.':
			max_iter += 128;
			if (max_iter > 1 << 15) max_iter = 1 << 15;
			printf("max iter: %d\n", max_iter);
			break;
 
	case '<': case ',':
			max_iter -= 128;
			if (max_iter < 128) max_iter = 128;
			printf("max iter: %d\n", max_iter);
			break;
 
	case 'c':	saturation = 1 - saturation;
			break;
 
	case 's':	screen_dump(); return;
	case 'z':	max_iter = 4096; break;
	case 'x':	max_iter = 128; break;
	case ' ':	invert = !invert;
	}
	set_texture();
}
 
void hsv_to_rgb(int hue, int min, int max, rgb_t *p)
{
	if (min == max) max = min + 1;
	if (invert) hue = max - (hue - min);
	if (!saturation) {
		p->r = p->g = p->b = 255 * (max - hue) / (max - min);
		return;
	}
	double h = fmod(color_rotate + 1e-4 + 4.0 * (hue - min) / (max - min), 6);
#	define VAL 255
	double c = VAL * saturation;
	double X = c * (1 - fabs(fmod(h, 2) - 1));
 
	p->r = p->g = p->b = 0;
 
	switch((int)h) {
	case 0: p->r = c; p->g = X; return;
	case 1:	p->r = X; p->g = c; return;
	case 2: p->g = c; p->b = X; return;
	case 3: p->g = X; p->b = c; return;
	case 4: p->r = X; p->b = c; return;
	default:p->r = c; p->b = X;
	}
}
 
void calc_mandel()
{
	int i, j, iter, min, max;
	rgb_t *px;
	double x, y, zx, zy, zx2, zy2;
	min = max_iter; max = 0;
	for (i = 0; i < height; i++) {
		px = tex[i];
		y = (i - height/2) * scale + cy;
		for (j = 0; j  < width; j++, px++) {
			x = (j - width/2) * scale + cx;
			iter = 0;
 
			zx = hypot(x - .25, y);
			if (x < zx - 2 * zx * zx + .25) iter = max_iter;
			if ((x + 1)*(x + 1) + y * y < 1/16) iter = max_iter;
 
			zx = zy = zx2 = zy2 = 0;
			for (; iter < max_iter && zx2 + zy2 < 4; iter++) {
				zy = 2 * zx * zy + y;
				zx = zx2 - zy2 + x;
				zx2 = zx * zx;
				zy2 = zy * zy;
			}
			if (iter < min) min = iter;
			if (iter > max) max = iter;
			*(unsigned short *)px = iter;
		}
	}
 
	for (i = 0; i < height; i++)
		for (j = 0, px = tex[i]; j  < width; j++, px++)
			hsv_to_rgb(*(unsigned short*)px, min, max, px);
}
 
void alloc_tex()
{
	int i, ow = tex_w, oh = tex_h;
 
	for (tex_w = 1; tex_w < width;  tex_w <<= 1);
	for (tex_h = 1; tex_h < height; tex_h <<= 1);
 
	if (tex_h != oh || tex_w != ow)
		tex = realloc(tex, tex_h * tex_w * 3 + tex_h * sizeof(rgb_t*));
 
	for (tex[0] = (rgb_t *)(tex + tex_h), i = 1; i < tex_h; i++)
		tex[i] = tex[i - 1] + tex_w;
}
 
void set_texture()
{
	alloc_tex();
	calc_mandel();
 
	glEnable(GL_TEXTURE_2D);
	glBindTexture(GL_TEXTURE_2D, texture);
	glTexImage2D(GL_TEXTURE_2D, 0, 3, tex_w, tex_h,
		0, GL_RGB, GL_UNSIGNED_BYTE, tex[0]);
 
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
	render();
}
 
void mouseclick(int button, int state, int x, int y)
{
	if (state != GLUT_UP) return;
 
	cx += (x - width / 2) * scale;
	cy -= (y - height/ 2) * scale;
 
	switch(button) {
	case GLUT_LEFT_BUTTON: /* zoom in */
		if (scale > fabs(x) * 1e-16 && scale > fabs(y) * 1e-16)
			scale /= 2;
		break;
	case GLUT_RIGHT_BUTTON: /* zoom out */
		scale *= 2;
		break;
	/* any other button recenters */
	}
	set_texture();
}
 
 
void resize(int w, int h)
{
	printf("resize %d %d\n", w, h);
	width = w;
	height = h;
 
	glViewport(0, 0, w, h);
	glOrtho(0, w, 0, h, -1, 1);
 
	set_texture();
}
 
void init_gfx(int *c, char **v)
{
	glutInit(c, v);
	glutInitDisplayMode(GLUT_RGB);
	glutInitWindowSize(640, 480);
	
	gwin = glutCreateWindow("Mandelbrot");
	glutDisplayFunc(render);
 
	glutKeyboardFunc(keypress);
	glutMouseFunc(mouseclick);
	glutReshapeFunc(resize);
	glGenTextures(1, &texture);
	set_texture();
}
 
int main(int c, char **v)
{
	init_gfx(&c, v);
	printf("keys:\n\tr: color rotation\n\tc: monochrome\n\ts: screen dump\n\t"
		"<, >: decrease/increase max iteration\n\tq: quit\n\tmouse buttons to zoom\n");
 
	glutMainLoop();
	return 0;
}

ASCII[edit]

Not mine, found it on Ken Perlin's homepage, this deserves a place here to illustrate how awesome C can be:

main(k){float i,j,r,x,y=-16;while(puts(""),y++<15)for(x
=0;x++<84;putchar(" .:-;!/>)|&IH%*#"[k&15]))for(i=k=r=0;
j=r*r-i*i-2+x/25,i=2*r*i+y/10,j*j+i*i<11&&k++<111;r=j);}

There may be warnings on compiling but disregard them, the output will be produced nevertheless. Such programs are called obfuscated and C excels when it comes to writing such cryptic programs. Google IOCCC for more.

.............::::::::::::::::::::::::::::::::::::::::::::::::.......................
.........::::::::::::::::::::::::::::::::::::::::::::::::::::::::...................
.....::::::::::::::::::::::::::::::::::-----------:::::::::::::::::::...............
...:::::::::::::::::::::::::::::------------------------:::::::::::::::.............
:::::::::::::::::::::::::::-------------;;;!:H!!;;;--------:::::::::::::::..........
::::::::::::::::::::::::-------------;;;;!!/>&*|I !;;;--------::::::::::::::........
::::::::::::::::::::-------------;;;;;;!!/>)|.*#|>/!!;;;;-------::::::::::::::......
::::::::::::::::-------------;;;;;;!!!!//>|:    !:|//!!!;;;;-----::::::::::::::.....
::::::::::::------------;;;;;;;!!/>)I>>)||I#     H&))>////*!;;-----:::::::::::::....
::::::::----------;;;;;;;;;;!!!//)H:  #|              IH&*I#/;;-----:::::::::::::...
:::::---------;;;;!!!!!!!!!!!//>|.H:                     #I>/!;;-----:::::::::::::..
:----------;;;;!/||>//>>>>//>>)|%                         %|&/!;;----::::::::::::::.
--------;;;;;!!//)& .;I*-H#&||&/                           *)/!;;-----::::::::::::::
-----;;;;;!!!//>)IH:-        ##                            #&!!;;-----::::::::::::::
;;;;!!!!!///>)H%.**           *                            )/!;;;------:::::::::::::
                                                         &)/!!;;;------:::::::::::::
;;;;!!!!!///>)H%.**           *                            )/!;;;------:::::::::::::
-----;;;;;!!!//>)IH:-        ##                            #&!!;;-----::::::::::::::
--------;;;;;!!//)& .;I*-H#&||&/                           *)/!;;-----::::::::::::::
:----------;;;;!/||>//>>>>//>>)|%                         %|&/!;;----::::::::::::::.
:::::---------;;;;!!!!!!!!!!!//>|.H:                     #I>/!;;-----:::::::::::::..
::::::::----------;;;;;;;;;;!!!//)H:  #|              IH&*I#/;;-----:::::::::::::...
::::::::::::------------;;;;;;;!!/>)I>>)||I#     H&))>////*!;;-----:::::::::::::....
::::::::::::::::-------------;;;;;;!!!!//>|:    !:|//!!!;;;;-----::::::::::::::.....
::::::::::::::::::::-------------;;;;;;!!/>)|.*#|>/!!;;;;-------::::::::::::::......
::::::::::::::::::::::::-------------;;;;!!/>&*|I !;;;--------::::::::::::::........
:::::::::::::::::::::::::::-------------;;;!:H!!;;;--------:::::::::::::::..........
...:::::::::::::::::::::::::::::------------------------:::::::::::::::.............
.....::::::::::::::::::::::::::::::::::-----------:::::::::::::::::::...............
.........::::::::::::::::::::::::::::::::::::::::::::::::::::::::...................
.............::::::::::::::::::::::::::::::::::::::::::::::::.......................

Fixed point 16 bit arithmetic[edit]

/**
  ascii Mandelbrot using 16 bits of fixed point integer maths with a selectable fractional precision in bits.

  This is still only 16 bits mathc and allocating more than 6 bits of fractional precision leads to an overflow that adds noise to the plot..

  This code frequently casts to short to ensure we're not accidentally benefitting from GCC promotion from short 16 bits to int.

  gcc fixedPoint.c  -lm

 */

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stdint.h>
#include <string.h>

short s(short i);
short toPrec(double f, int bitsPrecision);

int main(int argc, char* argv[])
{
  // chosen to match https://www.youtube.com/watch?v=DC5wi6iv9io
  int width = 32; // basic width of a zx81
  int height = 22; // basic width of a zx81
  int zoom=3;  // bigger with finer detail ie a smaller step size - leave at 1 for 32x22

  // params
  short bitsPrecision = 6;
  printf("PRECISION=%d\n", bitsPrecision);

  short X1 = toPrec(3.5,bitsPrecision) / zoom;
  short X2 = toPrec(2.25,bitsPrecision) ;
  short Y1 = toPrec(3,bitsPrecision)/zoom ;   // horiz pos
  short Y2 = toPrec(1.5,bitsPrecision) ; // vert pos
  short LIMIT = toPrec(4,bitsPrecision);


  // fractal
  //char * chr = ".:-=X$#@.";
  char * chr = "abcdefghijklmnopqr ";
  //char * chr = ".,'~=+:;[/<&?oxOX#.";
  short maxIters = strlen(chr);

  short py=0;
  while (py < height*zoom) {
    short px=0;
    while (px < width*zoom) {

      short x0 = s(s(px*X1) / width) - X2;
      short y0 = s(s(py*Y1) / height) - Y2;

      short x=0;
      short y=0;

      short i=0;

      short xSqr;
      short ySqr;
      while (i < maxIters) {
        xSqr = s(x * x) >> bitsPrecision;
        ySqr = s(y * y) >> bitsPrecision;

        // Breakout if sum is > the limit OR breakout also if sum is negative which indicates overflow of the addition has occurred
        // The overflow check is only needed for precisions of over 6 bits because for 7 and above the sums come out overflowed and negative therefore we always run to maxIters and we see nothing.
        // By including the overflow break out we can see the fractal again though with noise.
        if ((xSqr + ySqr) >= LIMIT || (xSqr+ySqr) < 0) {
          break;
        }

        short xt = xSqr - ySqr + x0;
        y = s(s(s(x * y) >> bitsPrecision) * 2) + y0;
        x=xt;

        i = i + 1;
      }
      i = i - 1;

      printf("%c", chr[i]);

      px = px + 1;
    }

    printf("\n");
    py = py + 1;
  }
}

// convert decimal value to a fixed point value in the given precision
short toPrec(double f, int bitsPrecision) {
  short whole = ((short)floor(f) << (bitsPrecision));
  short part = (f-floor(f))*(pow(2,bitsPrecision));
  short ret = whole + part;
  return ret;
}

// convenient casting
short s(short i) {
  return i;
}
$ gcc fixedPoint.c  -lm && ./a.out

PRECISION=6
aaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcdcccbbbbbb
aaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccddcbbbbb
aaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbegfcdbbb
aaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbdccedbb
aaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbdcccb
aaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbcfdddcccccccccccccccbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbdded
aaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbcccccddfcccccccccccccccccccccccbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccc
aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbcccccdeccccccccccccccccccccccccccccccbbbbbbbbbbbbbbbbbbbbbbbbbbcc
aaaaaaaaaaaaaaaaabbbbbbbbbbfcccccddeccccccccccccccccdddddeeeddddccccccbbbbbbbbbbbbbbbbbbbbbbbbbe
aaaaaaaaaaaaaaaabbbbbbbbbbcccccdddccccccccccccccdeddddeefigeeeddddecccccbbbbbbbbbbbbbbbbbbbbbbbb
aaaaaaaaaaaaaaaabbbbbbbecccccdddcccccccccccccdddddddddeefhmgfffddddedcccccbbbbbbbbbbbbbbbbbbbbbb
aaaaaaaaaaaaaaabbbbbbbcccccccdcccccccccccccccdgddddddfeefgjpijjfdddddedccccccbbbbbbbbbbbbbbbbbbb
aaaaaaaaaaaaaaabbbbbccccccdedccccccccccccccdddddddddeeefgkj ojgfedddddeccccccbbbbbbbbbbbbbbbbbbb
aaaaaaaaaaaaaabbbbbcccccegeccccccccccccccdeedddddddeeeeghhkp hgheefddddecccccccbbbbbbbbbbbbbbbbb
aaaaaaaaaaaaabbbbccccceddcccccccccccccccfddddddddeeeeefmlkr  ihheeeedddddgccccccbbbbbbbbbbbbbbbb
aaaaaaaaaaaaabbbccccddfcccccccccccccccedddddddddeeegffhnp    rpjffeeeiddddcccccccbbbbbbbbbbbbbbb
aaaaaaaaaaaabbbcccddecccccccccccccccddddddddddeeffffgghm       jgffeeeegdddccccccccbbbbbbbbbbbbb
aaaaaaaaaaabbbccdedccccccccccccccccdddddddddeefffffgghil       khggffffeeeddccccccccbbbbbbbbbbbb
aaaaaaaaaaabbccdeccccccccccccccccddddddddeeef ijjhhhkijlo     qkihjhgffgngeddcccccccbbbbbbbbbbbb
aaaaaaaaaabbcddccccccccccccccccdddddddfeeeefgjq  lkk p           n khhhiqifedcccccccdbbbbbbbbbbb
aaaaaaaaaabbccccccccccccccccccddddddefeeeeffgilq                   plk rrqgeddcccccccdbbbbbbbbbb
aaaaaaaaaabdccccccccccccccccdddhegeeeeeefffghiq                          mfeeddcccccccdbbbbbbbbb
aaaaaaaaaaccccccccccccccccdddeeeeeeeeeeffffhjklp                        phfeeddcccccccdcbbbbbbbb
aaaaaaaaabcccccccccccccddddegeeeeeeeeeffffhppp                          jgggedddccccccccbbbbbbbb
aaaaaaaaabccccccccccddddeefpifffffffffggggik                             hgfedddcccccccdcbbbbbbb
aaaaaaaaaccccccceddddddeeifl hgggjrhggggghj p                            qjnfdddcccccccdcbbbbbbb
aaaaaaaabccccddedddddefeefghqnokkloqiqhhhik                                ifdddcccccccdcbbbbbbb
aaaaaaaaccceddddddddgfeeffghir o n  qmjiijo                               igfedddcccccccccbbbbbb
aaaaaaaaccddedddddeeeeeefgghkq         lll                                lgfddddcccccccdcbbbbbb
aaaaaaaacddddddddeeeeeefhgjol           rn                                 geddddcccccccdcbbbbbb
aaaaaaaaedddddddeeeffggojjll                                              hfeddddeccccccdcbbbbbb
aaaaaaaaddddddefffffggmkopmop                                            ngfefdddfccccccdcbbbbbb
aaaaaaaaeeffgihggiihikk                                                  hfeefdddeccccccddbbbbbb
aaaaaaaa                                                               kigfgefdddecccccceebbbbbb
aaaaaaaaeeffhgjggghhhklqm                                              ligfhefdddeccccccddbbbbbb
aaaaaaaaddddddefffffgggirq                                               hffefdddeccccccdebbbbbb
aaaaaaaahdddddddeefgfggilkjk                                              hfeedddeccccccddbbbbbb
aaaaaaaacddddddddeeeeeefhhhkl                                             lfefdddeccccccdcbbbbbb
aaaaaaaaccddedddddefeeeeffgijo           on                                qfedddcccccccdcbbbbbb
aaaaaaaabcceddddddddegeeefggik       r  kko                               jhfedddcccccccdcbbbbbb
aaaaaaaabccccddddddddefeeefijmk jkp  kmiijlq                              qhfedddcccccccccbbbbbb
aaaaaaaaacccccccdddddddeeefh hhghi kjggghil                               r geddcccccccdcbbbbbbb
aaaaaaaaabccccccccccdddddefgnfgffghggggggghjm                            lj feddcccccccdcbbbbbbb
aaaaaaaaabccccccccccccccdddeffggeeeefffffggm                             igfefddcccccccdbbbbbbbb
aaaaaaaaaaccccccccccccccccdddeeeeeeeeeeffffhjm                           kgfeddcccccccdcbbbbbbbb
aaaaaaaaaabdccccccccccccccccdddfeeeeeeeegffgiikq                          feeddcccccccebbbbbbbbb
aaaaaaaaaabbccccccccccccccccccdddddegeeeegffgho                     p    nheeddcccccchfbbbbbbbbb
aaaaaaaaaabbbddcccccccccccccccccdddddeeeeeefhm     l                ki jlnjeddcccccccdbbbbbbbbbb
aaaaaaaaaaabbccecccccccccccccccccdddddddfeeefir  jii npm         k ohgggineedcccccccdbbbbbbbbbbb
aaaaaaaaaaabbbccdddccccccccccccccccddddddddeeefggggggiik       mjhhgfffffedddcccccccbbbbbbbbbbbb
aaaaaaaaaaaabbbcccedfcccccccccccccccdddddddddeegffffgghp        hgffgeeeedddccccccccbbbbbbbbbbbb
aaaaaaaaaaaabbbbccccdddcccccccccccccccgdddddddddeegffgil        ggfeeeeddddcccccccbbbbbbbbbbbbbb
aaaaaaaaaaaaabbbbbccccdddccccccccccccccfeddddddddeeeefgi l   nkqgeeegeddddcccccccbbbbbbbbbbbbbbb
aaaaaaaaaaaaabbbbbbcccccdedccccccccccccccdedddddddeeeeeghik  khhfeefdddddeccccccbbbbbbbbbbbbbbbb
aaaaaaaaaaaaaabbbbbbccccccdddcccccccccccccddedddddddeeefigil jggfedddddddcccccbbbbbbbbbbbbbbbbbb
aaaaaaaaaaaaaaabbbbbbbcccccccdccccccccccccccdefdddddeeeffhlliimfdddddedccccccbbbbbbbbbbbbbbbbbbb
aaaaaaaaaaaaaaaabbbbbbbccccccdddccccccccccccccdddddddeeefg jggheddddedccccccbbbbbbbbbbbbbbbbbbbb
aaaaaaaaaaaaaaaabbbbbbbbbccccccdddccccccccccccccdedddddefgiffeeddddeccccccbbbbbbbbbbbbbbbbbbbbbb
aaaaaaaaaaaaaaaaabbbbbbbbbbecccccdeeccccccccccccccceddddeffegddddgcccccbbbbbbbbbbbbbbbbbbbbbbbbb
aaaaaaaaaaaaaaaaaabbbbbbbbbbbbcccccdddcccccccccccccccccddddddddccccccbbbbbbbbbbbbbbbbbbbbbbbbbbc
aaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbccccddeccccccccccccccccccccccccccbbbbbbbbbbbbbbbbbbbbbbbbbbbbed
aaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbccceddcccccccccccccccccccbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccd
aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbdcccccccccbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbecccc
aaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccdebb
aaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbdfccbbb
aaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcgdccbbbb

C#[edit]

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Threading;
using System.Windows.Forms;

/// <summary>
/// Generates bitmap of Mandelbrot Set and display it on the form.
/// </summary>
public class MandelbrotSetForm : Form
{
    const double MaxValueExtent = 2.0;
    Thread thread;

    static double CalcMandelbrotSetColor(ComplexNumber c)
    {
        // from http://en.wikipedia.org/w/index.php?title=Mandelbrot_set
        const int MaxIterations = 1000;
        const double MaxNorm = MaxValueExtent * MaxValueExtent;

        int iteration = 0;
        ComplexNumber z = new ComplexNumber();
        do
        {
            z = z * z + c;
            iteration++;
        } while (z.Norm() < MaxNorm && iteration < MaxIterations);
        if (iteration < MaxIterations)
            return (double)iteration / MaxIterations;
        else
            return 0; // black
    }

    static void GenerateBitmap(Bitmap bitmap)
    {
        double scale = 2 * MaxValueExtent / Math.Min(bitmap.Width, bitmap.Height);
        for (int i = 0; i < bitmap.Height; i++)
        {
            double y = (bitmap.Height / 2 - i) * scale;
            for (int j = 0; j < bitmap.Width; j++)
            {
                double x = (j - bitmap.Width / 2) * scale;
                double color = CalcMandelbrotSetColor(new ComplexNumber(x, y));
                bitmap.SetPixel(j, i, GetColor(color));
            }
        }
    }

    static Color GetColor(double value)
    {
        const double MaxColor = 256;
        const double ContrastValue = 0.2;
        return Color.FromArgb(0, 0,
            (int)(MaxColor * Math.Pow(value, ContrastValue)));
    }
    
    public MandelbrotSetForm()
    {
        // form creation
        this.Text = "Mandelbrot Set Drawing";
        this.BackColor = System.Drawing.Color.Black;
        this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
        this.MaximizeBox = false;
        this.StartPosition = FormStartPosition.CenterScreen;
        this.FormBorderStyle = FormBorderStyle.FixedDialog;
        this.ClientSize = new Size(640, 640);
        this.Load += new System.EventHandler(this.MainForm_Load);
    }

    void MainForm_Load(object sender, EventArgs e)
    {
        thread = new Thread(thread_Proc);
        thread.IsBackground = true;
        thread.Start(this.ClientSize);
    }

    void thread_Proc(object args)
    {
        // start from small image to provide instant display for user
        Size size = (Size)args;
        int width = 16;
        while (width * 2 < size.Width)
        {
            int height = width * size.Height / size.Width;
            Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format24bppRgb);
            GenerateBitmap(bitmap);
            this.BeginInvoke(new SetNewBitmapDelegate(SetNewBitmap), bitmap);
            width *= 2;
            Thread.Sleep(200);
        }
        // then generate final image
        Bitmap finalBitmap = new Bitmap(size.Width, size.Height, PixelFormat.Format24bppRgb);
        GenerateBitmap(finalBitmap);
        this.BeginInvoke(new SetNewBitmapDelegate(SetNewBitmap), finalBitmap);
    }

    void SetNewBitmap(Bitmap image)
    {
        if (this.BackgroundImage != null)
            this.BackgroundImage.Dispose();
        this.BackgroundImage = image;
    }

    delegate void SetNewBitmapDelegate(Bitmap image);

    static void Main()
    {
        Application.Run(new MandelbrotSetForm());
    }
}

struct ComplexNumber
{
    public double Re;
    public double Im;

    public ComplexNumber(double re, double im)
    {
        this.Re = re;
        this.Im = im;
    }

    public static ComplexNumber operator +(ComplexNumber x, ComplexNumber y)
    {
        return new ComplexNumber(x.Re + y.Re, x.Im + y.Im);
    }

    public static ComplexNumber operator *(ComplexNumber x, ComplexNumber y)
    {
        return new ComplexNumber(x.Re * y.Re - x.Im * y.Im,
            x.Re * y.Im + x.Im * y.Re);
    }

    public double Norm()
    {
        return Re * Re + Im * Im;
    }
}

C++[edit]

This generic function assumes that the image can be accessed like a two-dimensional array of colors. It may be passed a true array (in which case the Mandelbrot set will simply be drawn into that array, which then might be saved as image file), or a class which maps the subscript operator to the pixel drawing routine of some graphics library. In the latter case, there must be functions get_first_dimension and get_second_dimension defined for that type, to be found by argument dependent lookup. The code provides those functions for built-in arrays.

#include <cstdlib>
#include <complex>

// get dimensions for arrays
template<typename ElementType, std::size_t dim1, std::size_t dim2>
 std::size_t get_first_dimension(ElementType (&a)[dim1][dim2])
{
  return dim1;
}

template<typename ElementType, std::size_t dim1, std::size_t dim2>
 std::size_t get_second_dimension(ElementType (&a)[dim1][dim2])
{
  return dim2;
}


template<typename ColorType, typename ImageType>
 void draw_Mandelbrot(ImageType& image,                                   //where to draw the image
                      ColorType set_color, ColorType non_set_color,       //which colors to use for set/non-set points
                      double cxmin, double cxmax, double cymin, double cymax,//the rect to draw in the complex plane
                      unsigned int max_iterations)                          //the maximum number of iterations
{
  std::size_t const ixsize = get_first_dimension(image);
  std::size_t const iysize = get_first_dimension(image);
  for (std::size_t ix = 0; ix < ixsize; ++ix)
    for (std::size_t iy = 0; iy < iysize; ++iy)
    {
      std::complex<double> c(cxmin + ix/(ixsize-1.0)*(cxmax-cxmin), cymin + iy/(iysize-1.0)*(cymax-cymin));
      std::complex<double> z = 0;
      unsigned int iterations;

      for (iterations = 0; iterations < max_iterations && std::abs(z) < 2.0; ++iterations) 
        z = z*z + c;

      image[ix][iy] = (iterations == max_iterations) ? set_color : non_set_color;

    }
}

Note this code has not been executed.



A Simple version in CPP. Definitely not as crazy good as the ASCII one in C above.

#include <stdio.h>

int f(float X, float Y, float x, float y, int n){
return (x*x+y*y<4 && n<100)?1+f(X, Y, x*x-y*y+X, 2*x*y+Y, n+1):0;
}

main(){
for(float j=1; j>=-1; j-=.015)
for(float i=-2, x; i<=.5; i+=.015, x=f(i, j, 0, 0, 0))
printf("%c%s", x<10?' ':x<20?'.':x<50?':':x<80?'*':'#', i>-2?" ":"\n");
}

C3[edit]

This program produces a BMP as output.

module mandelbrot;

extern fn int atoi(char *s);
extern fn int printf(char *s, ...);
extern fn void putchar(int c);

fn void main(int argc, char **argv)
{
  int w = atoi(argv[1]);
  int h = w;

  const LIMIT = 2.0;
  const SQUARE_LIMIT = LIMIT * LIMIT;

  printf("P4\n%d %d\n", w, h);
 
  int iter = 50;
  int bit_num = 0;
  char byte_acc = 0;
  for (double y = 0; y < h; y++)
  {
    for (double x = 0; x < w; x++)
    {
      double zr;
      double zi;
      double ti;
      double tr;
      double cr = (2.0 * x / w - 1.5);
      double ci = (2.0 * y / h - 1.0);
      for (int i = 0; i < iter && (tr + ti <= SQUARE_LIMIT); i++)
      {
        zi = 2.0 * zr * zi + ci;
        zr = tr - ti + cr;
        tr = zr * zr;
        ti = zi * zi;
      }

      byte_acc <<= 1;
      if (tr + ti <= SQUARE_LIMIT) byte_acc |= 0x01;

      ++bit_num;

      if (bit_num == 8)
      {
        putchar(byte_acc);
        byte_acc = 0;
        bit_num = 0;
      }
      else if (x == w - 1)
      {
        byte_acc <<= (8 - w % 8);
        putchar(byte_acc);
        byte_acc = 0;
        bit_num = 0;
      }
    }
  }
}

Cixl[edit]

Displays a zooming Mandelbrot using ANSI graphics.

use: cx;

define: max 4.0;
define: max-iter 570;

let: (max-x max-y) screen-size;
let: max-cx $max-x 2.0 /;
let: max-cy $max-y 2.0 /;
let: rows Stack<Str> new;
let: buf Buf new;
let: zoom 0 ref;

func: render()()
  $rows clear
  
  $max-y 2 / {
    let: y;
    $buf 0 seek

    $max-x {
      let: x;
      let: (zx zy) 0.0 ref %%;
      let: cx $x $max-cx - $zoom deref /;
      let: cy $y $max-cy - $zoom deref /;
      let: i #max-iter ref;

      {
        let: nzx $zx deref ** $zy deref ** - $cx +;
	$zy $zx deref *2 $zy deref * $cy + set
	$zx $nzx set
        $i &-- set-call	
        $nzx ** $zy deref ** + #max < $i deref and
      } while

      let: c $i deref % -7 bsh bor 256 mod;
      $c {$x 256 mod $y 256 mod} {0 0} if-else $c new-rgb $buf set-bg
      @@s $buf print
    } for

    $rows $buf str push   
  } for

  1 1 #out move-to
  $rows {#out print} for
  $rows riter {#out print} for;

#out hide-cursor
raw-mode

let: poll Poll new;
let: is-done #f ref;

$poll #in {
  #in read-char _
  $is-done #t set
} on-read

{
  $zoom &++ set-call
  render
  $poll 0 wait _
  $is-done deref !
} while

#out reset-style
#out clear-screen
1 1 #out move-to
#out show-cursor
normal-mode

Clojure[edit]

Translation of: Perl
(ns mandelbrot
  (:refer-clojure :exclude [+ * <])
  (:use (clojure.contrib complex-numbers)
        (clojure.contrib.generic [arithmetic :only [+ *]]
                                 [comparison :only [<]]
                                 [math-functions :only [abs]])))
(defn mandelbrot? [z]
  (loop [c 1
         m (iterate #(+ z (* % %)) 0)]
    (if (and (> 20 c)
             (< (abs (first m)) 2) )
      (recur (inc c)
             (rest m))
      (if (= 20 c) true false))))

(defn mandelbrot []
  (for [y (range 1 -1 -0.05)
	x (range -2 0.5 0.0315)] 
    (if (mandelbrot? (complex x y)) "#" " ")))

(println (interpose \newline (map #(apply str %) (partition 80 (mandelbrot)))))

COBOL[edit]

EBCDIC art.

IDENTIFICATION DIVISION.
PROGRAM-ID. MANDELBROT-SET-PROGRAM.
DATA DIVISION.
WORKING-STORAGE SECTION.
01  COMPLEX-ARITHMETIC.
    05 X               PIC S9V9(9).
    05 Y               PIC S9V9(9).
    05 X-A             PIC S9V9(6).
    05 X-B             PIC S9V9(6).
    05 Y-A             PIC S9V9(6).
    05 X-A-SQUARED     PIC S9V9(6).
    05 Y-A-SQUARED     PIC S9V9(6).
    05 SUM-OF-SQUARES  PIC S9V9(6).
    05 ROOT            PIC S9V9(6).
01  LOOP-COUNTERS.
    05 I               PIC 99.
    05 J               PIC 99.
    05 K               PIC 999.
77  PLOT-CHARACTER     PIC X.
PROCEDURE DIVISION.
CONTROL-PARAGRAPH.
    PERFORM OUTER-LOOP-PARAGRAPH
    VARYING I FROM 1 BY 1 UNTIL I IS GREATER THAN 24.
    STOP RUN.
OUTER-LOOP-PARAGRAPH.
    PERFORM INNER-LOOP-PARAGRAPH
    VARYING J FROM 1 BY 1 UNTIL J IS GREATER THAN 64.
    DISPLAY ''.
INNER-LOOP-PARAGRAPH.
    MOVE SPACE TO PLOT-CHARACTER.
    MOVE ZERO  TO X-A.
    MOVE ZERO  TO Y-A.
    MULTIPLY J   BY   0.0390625   GIVING X.
    SUBTRACT 1.5 FROM X.
    MULTIPLY I   BY   0.083333333 GIVING Y.
    SUBTRACT 1 FROM Y.
    PERFORM ITERATION-PARAGRAPH VARYING K FROM 1 BY 1
    UNTIL K IS GREATER THAN 100 OR PLOT-CHARACTER IS EQUAL TO '#'.
    DISPLAY PLOT-CHARACTER WITH NO ADVANCING.
ITERATION-PARAGRAPH.
    MULTIPLY X-A BY X-A GIVING X-A-SQUARED.
    MULTIPLY Y-A BY Y-A GIVING Y-A-SQUARED.
    SUBTRACT Y-A-SQUARED FROM X-A-SQUARED GIVING X-B.
    ADD      X   TO X-B.
    MULTIPLY X-A BY Y-A GIVING Y-A.
    MULTIPLY Y-A BY 2   GIVING Y-A.
    SUBTRACT Y   FROM Y-A.
    MOVE     X-B TO   X-A.
    ADD X-A-SQUARED TO Y-A-SQUARED GIVING SUM-OF-SQUARES.
    MOVE FUNCTION SQRT (SUM-OF-SQUARES) TO ROOT.
    IF ROOT IS GREATER THAN 2 THEN MOVE '#' TO PLOT-CHARACTER.
Output:
################################################################
#################################   ############################
################################     ###########################
############################## ##   ############################
########################  #               ######################
########################                      ##################
#####################                          #################
####################                             ###############
######## ##    #####                            ################
#######           #                             ################
######            #                            #################
                                            ####################
######            #                            #################
#######           #                             ################
######## ##    #####                            ################
####################                             ###############
#####################                          #################
########################                      ##################
########################  #               ######################
############################## ##   ############################
################################     ###########################
#################################   ############################
################################################################
################################################################

Common Lisp[edit]

(defpackage #:mandelbrot
  (:use #:cl))

(in-package #:mandelbrot)

(deftype pixel () '(unsigned-byte 8))
(deftype image () '(array pixel))

(defun write-pgm (image filespec)
  (declare (image image))
  (with-open-file (s filespec :direction :output :element-type 'pixel :if-exists :supersede)
    (let* ((width  (array-dimension image 1))
           (height (array-dimension image 0))
           (header (format nil "P5~A~D ~D~A255~A" #\Newline width height #\Newline #\Newline)))
      (loop for c across header
            do (write-byte (char-code c) s))
      (dotimes (row height)
        (dotimes (col width)
          (write-byte (aref image row col) s))))))

(defparameter *x-max* 800)
(defparameter *y-max* 800)
(defparameter *cx-min* -2.5)
(defparameter *cx-max* 1.5)
(defparameter *cy-min* -2.0)
(defparameter *cy-max* 2.0)
(defparameter *escape-radius* 2)
(defparameter *iteration-max* 40)

(defun mandelbrot (filespec)
  (let ((pixel-width  (/ (- *cx-max* *cx-min*) *x-max*))
        (pixel-height (/ (- *cy-max* *cy-min*) *y-max*))
        (image (make-array (list *y-max* *x-max*) :element-type 'pixel :initial-element 0)))
    (loop for y from 0 below *y-max*
          for cy from *cy-min* by pixel-height
          do (loop for x from 0 below *x-max*
                   for cx from *cx-min* by pixel-width
                   for iteration = (loop with c = (complex cx cy)
                                         for iteration from 0 below *iteration-max*
                                         for z = c then (+ (* z z) c)
                                         while (< (abs z) *escape-radius*)
                                         finally (return iteration))
                   for pixel = (round (* 255 (/ (- *iteration-max* iteration) *iteration-max*)))
                   do (setf (aref image y x) pixel)))
    (write-pgm image filespec)))

Cowgol[edit]

Translation of: B
include "cowgol.coh";

const xmin := -8601;
const xmax := 2867;
const ymin := -4915;
const ymax := 4915;
const maxiter := 32;

const dx := (xmax-xmin)/79;
const dy := (ymax-ymin)/24;

var cy: int16 := ymin;
while cy <= ymax loop
    var cx: int16 := xmin;
    while cx <= xmax loop
        var x: int32 := 0;
        var y: int32 := 0;
        var x2: int32 := 0;
        var y2: int32 := 0;
        var iter: uint8 := 0;
        
        while iter < maxiter and x2 + y2 <= 16384 loop
            y := ((x*y)>>11)+cy as int32;
            x := x2-y2+cx as int32;
            x2 := (x*x)>>12;
            y2 := (y*y)>>12;
            iter := iter + 1;
        end loop;
        
        print_char(' ' + iter);
        cx := cx + dx;
    end loop;
    print_nl();
    cy := cy + dy;
end loop;
Output:
!!!!!!!!!!!!!!!"""""""""""""####################################""""""""""""""""
!!!!!!!!!!!!!"""""""""#######################$$$$$$$%'+)%%%$$$$$#####"""""""""""
!!!!!!!!!!!"""""""#######################$$$$$$$$%%%&&(+,)++&%$$$$$$######""""""
!!!!!!!!!"""""#######################$$$$$$$$$$%%%%&')*5:/+('&%%$$$$$$#######"""
!!!!!!!!""""#####################$$$$$$$$$$%%%&&&''),@@@@@@@,'&%%%%%$$$$########
!!!!!!!"""####################$$$$$$$$%%%&'())((())*,@@@@@@/+))('&&&&)'%$$######
!!!!!!""###################$$$$$%%%%%%&&&'+.@@=/<@@@@@@@@@@@@@@@/++@..93%%$#####
!!!!!"################$$$%%%%%%%%%%&&&&'),+2@@@@@@@@@@@@@@@@@@@@@@@@@1(&&%$$####
!!!!"##########$$$$$%%&(-(''''''''''''(*,5@@@@@@@@@@@@@@@@@@@@@@@@@@@@+)-&%$$###
!!!!####$$$$$$$$%%%%%&'(*-@1.+.@-4+))**@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@4-(&%$$$##
!!!!#$$$$$$$$$%%%%%%'''++.6@@@@@@@@@8/0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@3(%%$$$$#
!!!#$$$$$$$%&&&&''()/-5.5@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?'&%%$$$$#
!!!(**+/+<523/80/46@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@4+)'&&%%$$$$#
!!!#$$$$$$$%&&&&''().-2.@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@'&%%$$$$#
!!!!#$$$$$$$$$%%%%%&'''/,.7@@@@@@@@@;/0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0'%%$$$$#
!!!!####$$$$$$$$%%%%%&'(*-:2.,/?-5+))**@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@4+(&%$$$##
!!!!"##########$$$$$%%&(-(''''(''''''((*,4@@@@@@@@@@@@@@@@@@@@@@@@@@@4+).&%$$###
!!!!!"################$$$%%%%%%%%%%&&&&')<,4@@@@@@@@@@@@@@@@@@@@@@@@@/('&%%$####
!!!!!!""##################$$$$$$%%%%%%&&&'*.@@@0@@@@@@@@@@@@@@@@1,,@//9)%%$#####
!!!!!!!"""####################$$$$$$$$%%%&(())((()**-@@@@@@/+)))'&&&')'%$$######
!!!!!!!!""""#####################$$$$$$$$$$%%%&&&''(,@@@@@@@+'&&%%%%%$$$########
!!!!!!!!!"""""#######################$$$$$$$$$$%%%%&')*7@0+('&%%%$$$$$#######"""
!!!!!!!!!!!"""""""######################$$$$$$$$$%%%&&(+-).*&%$$$$$$######""""""
!!!!!!!!!!!!!"""""""""#######################$$$$$$%%'3(%%%$$$$$######""""""""""
!!!!!!!!!!!!!!!""""""""""""#####################################""""""""""""""""

D[edit]

Textual Version[edit]

This uses std.complex because D built-in complex numbers are deprecated.

void main() {
    import std.stdio, std.complex;

    for (real y = -1.2; y < 1.2; y += 0.05) {
        for (real x = -2.05; x < 0.55; x += 0.03) {
            auto z = 0.complex;
            foreach (_; 0 .. 100)
                z = z ^^ 2 + complex(x, y);
            write(z.abs < 2 ? '#' : '.');
        }
        writeln;
    }
}
Output:
.......................................................................................
.......................................................................................
.......................................................................................
.......................................................................................
.......................................................................................
.......................................................................................
.......................................................................................
................................................................##.....................
.............................................................######....................
.............................................................#######...................
..............................................................######...................
..........................................................#.#.###..#.#.................
...................................................##....################..............
..................................................###.######################.###.......
...................................................############################........
................................................###############################........
................................................################################.......
.............................................#####################################.....
..............................................###################################......
..............................##.####.#......####################################......
..............................###########....####################################......
............................###############.######################################.....
............................###############.#####################################......
........................##.#####################################################.......
......#.#####################################################################..........
........................##.#####################################################.......
............................###############.#####################################......
............................###############.######################################.....
..............................###########....####################################......
..............................##.####.#......####################################......
..............................................###################################......
.............................................#####################################.....
................................................################################.......
................................................###############################........
...................................................############################........
..................................................###.######################.###.......
...................................................##....################..............
..........................................................#.#.###..#.#.................
..............................................................######...................
.............................................................#######...................
.............................................................######....................
................................................................##.....................
.......................................................................................
.......................................................................................
.......................................................................................
.......................................................................................
.......................................................................................
.......................................................................................
.......................................................................................

More Functional Textual Version[edit]

The output is similar.

void main() {
    import std.stdio, std.complex, std.range, std.algorithm;

    foreach (immutable y; iota(-1.2, 1.2, 0.05))
        iota(-2.05, 0.55, 0.03).map!(x => 0.complex
            .recurrence!((a, n) => a[n - 1] ^^ 2 + complex(x, y))
            .drop(100).front.abs < 2 ? '#' : '.').writeln;
}

Graphical Version[edit]

Library: QD
Library: SDL
Library: Phobos
import qd;

double lensqr(cdouble c) { return c.re * c.re + c.im * c.im; }

const Limit = 150;

void main() {
  screen(640, 480);
  for (int y = 0; y < screen.h; ++y) {
    flip; events;
    for (int x = 0; x < screen.w; ++x) {
      auto
        c_x = x * 1.0 / screen.w - 0.5,
        c_y = y * 1.0 / screen.h - 0.5,
        c = c_y * 2.0i + c_x * 3.0 - 1.0,
        z = 0.0i + 0.0,
        i = 0;
      for (; i < Limit; ++i) {
        z = z * z + c;
        if (lensqr(z) > 4) break;
      }
      auto value = cast(ubyte) (i * 255.0 / Limit);
      pset(x, y, rgb(value, value, value));
    }
  }
  while (true) { flip; events; }
}

Dart[edit]

Implementation in Google Dart works on http://try.dartlang.org/ (as of 10/18/2011) since the language is very new, it may break in the future. The implementation uses a incomplete Complex class supporting operator overloading.

class Complex {
  double _r,_i;

  Complex(this._r,this._i);
  double get r => _r;
  double get i => _i;
  String toString() => "($r,$i)";

  Complex operator +(Complex other) => new Complex(r+other.r,i+other.i);
  Complex operator *(Complex other) =>
      new Complex(r*other.r-i*other.i,r*other.i+other.r*i);
  double abs() => r*r+i*i;
}

void main() {
  double start_x=-1.5;
  double start_y=-1.0;
  double step_x=0.03;
  double step_y=0.1;

  for(int y=0;y<20;y++) {
    String line="";
    for(int x=0;x<70;x++) {
      Complex c=new Complex(start_x+step_x*x,start_y+step_y*y);
      Complex z=new Complex(0.0, 0.0);
      for(int i=0;i<100;i++) {
        z=z*(z)+c;
        if(z.abs()>2) {
          break;
        }
      }
      line+=z.abs()>2 ? " " : "*";
    }
    print(line);
  }
}

Dc[edit]

ASCII output[edit]

Works with: GNU Dc
Works with: OpenBSD Dc

This can be done in a more Dc-ish way, e.g. by moving the loop macros' definitions to the initialisations in the top instead of saving the macro definition of inner loops over and over again in outer loops.

 _2.1 sx # xmin = -2.1
  0.7 sX # xmax =  0.7

 _1.2 sy # ymin = -1.2
  1.2 sY # ymax =  1.2

   32 sM # maxiter = 32

   80 sW # image width
   25 sH # image height

    8 k  # precision

[ q ] sq # quitter helper macro

# for h from 0 to H-1
0 sh
[
  lh lH =q # quit if H reached

  # for w from 0 to W-1
  0 sw
  [
    lw lW =q # quit if W reached

    # (w,h) -> (R,I)
    #           | |
    #           | ymin + h*(ymax-ymin)/(height-1)
    #           xmin + w*(xmax-xmin)/(width-1)

    lX lx - lW 1 - / lw * lx + sR
    lY ly - lH 1 - / lh * ly + sI

    # iterate for (R,I)

    0 sr #     r:=0
    0 si #     i:=0
    0 sa #     a:=0 (r squared)
    0 sb #     b:=0 (i squared)
    0 sm #     m:=0

    # do while m!=M and a+b=<4
    [
      lm lM =q # exit if m==M
      la lb + 4<q # exit if >4

      2 lr * li * lI + si # i:=2*r*i+I
      la lb - lR + sr     # r:=a-b+R
      lm 1 + sm           # m+=1
      lr 2 ^ sa           # a:=r*r
      li 2 ^ sb           # b:=i*i

      l0 x                # loop
    ] s0
    l0 x

    lm 32 + P             # print "pixel"

    lw 1 + sw             # w+=1
    l1 x                  # loop
  ] s1
  l1 x

  A P                     # linefeed

  lh 1 + sh               # h+=1
  l2 x                    # loop
] s2
l2 x
Output:
!!!!!!!!!!!!!!!"""""""""""""####################################""""""""""""""""
!!!!!!!!!!!!!"""""""""#######################$$$$$$$%'0(%%%$$$$$#####"""""""""""
!!!!!!!!!!!"""""""#######################$$$$$$$$%%%&&(++)++&$$$$$$$######""""""
!!!!!!!!!"""""#######################$$$$$$$$$$%%%%&')*@;/*('&%%$$$$$$#######"""
!!!!!!!!""""#####################$$$$$$$$$$%%%&&&''),@@@@@@@+'&%%%%%$$$$########
!!!!!!!"""####################$$$$$$$$%%%&'())((())*-@@@@@@.+))('&&&&+&%$$######
!!!!!!""###################$$$$$%%%%%%&&&'+.@@@08@@@@@@@@@@@@@@@/+,@//@)%%$#####
!!!!!"################$$$%%%%%%%%%%&&&&')-+7@@@@@@@@@@@@@@@@@@@@@@@@@4(&&%$$####
!!!!"##########$$$$$%%&(,('''''''''''((*-5@@@@@@@@@@@@@@@@@@@@@@@@@@@3+)4&%$$###
!!!!####$$$$$$$$%%%%%&'(*-@1.+/@-4+))**@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@3+'&%$$$##
!!!!#$$$$$$$$$%%%%%%'''++.7@@@@@@@@@9/0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<6'%%$$$$#
!!!#$$$$$$$%&&&&''().-2.6@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@'&%%$$$$#
!!!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@2+)'&&%%$$$$#
!!!#$$$$$$$%&&&&''().-2.6@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@'&%%$$$$#
!!!!#$$$$$$$$$%%%%%%'''++.7@@@@@@@@@9/0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<6'%%$$$$#
!!!!####$$$$$$$$%%%%%&'(*-@1.+/@-4+))**@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@3+'&%$$$##
!!!!"##########$$$$$%%&(,('''''''''''((*-5@@@@@@@@@@@@@@@@@@@@@@@@@@@3+)4&%$$###
!!!!!"################$$$%%%%%%%%%%&&&&')-+7@@@@@@@@@@@@@@@@@@@@@@@@@4(&&%$$####
!!!!!!""###################$$$$$%%%%%%&&&'+.@@@08@@@@@@@@@@@@@@@/+,@//@)%%$#####
!!!!!!!"""####################$$$$$$$$%%%&'())((())*-@@@@@@.+))('&&&&+&%$$######
!!!!!!!!""""#####################$$$$$$$$$$%%%&&&''),@@@@@@@+'&%%%%%$$$$########
!!!!!!!!!"""""#######################$$$$$$$$$$%%%%&')*@;/*('&%%$$$$$$#######"""
!!!!!!!!!!!"""""""#######################$$$$$$$$%%%&&(++)++&$$$$$$$######""""""
!!!!!!!!!!!!!"""""""""#######################$$$$$$$%'0(%%%$$$$$#####"""""""""""
!!!!!!!!!!!!!!!"""""""""""""####################################""""""""""""""""

PGM (P5) output[edit]

This is a condensed version of the ASCII output variant modified to generate a PGM (P5) image.

_2.1 sx   0.7 sX  _1.2 sy   1.2 sY
32 sM
640 sW 480 sH
8 k
[P5] P A P
lW n 32 P lH n A P
lM 1 - n A P
[ q ] sq
0 sh
[
  lh lH =q
  0 sw
  [
    lw lW =q
    lX lx - lW 1 - / lw * lx + sR
    lY ly - lH 1 - / lh * ly + sI
    0 sr 0 si 0 sa 0 sb 0 sm
    [
      lm lM =q
      la lb + 4<q
      2 lr * li * lI + si
      la lb - lR + sr
      lm 1 + sm
      lr 2 ^ sa
      li 2 ^ sb
      l0 x
    ] s0
    l0 x
    lm 1 - P
    lw 1 + sw
    l1 x
  ] s1
  l1 x
  lh 1 + sh
  l2 x
] s2
l2 x


Delphi[edit]

See Pascal.

DWScript[edit]

Translation of: D
const maxIter = 256;

var x, y, i : Integer;
for y:=-39 to 39 do begin
   for x:=-39 to 39 do begin
      var c := Complex(y/40-0.5, x/40);
      var z := Complex(0, 0);
      for i:=1 to maxIter do begin
         z := z*z + c;
         if Abs(z)>=4 then Break;
      end;
      if i>=maxIter then
         Print('#')
      else Print('.');
    end;
    PrintLn('');
end;

EasyLang[edit]

Run it

for y0 range 300
  cy = (y0 - 150) / 120
  for x0 range 300
    cx = (x0 - 220) / 120
    x = 0
    y = 0
    color3 0 0 0
    for n range 128
      if x * x + y * y > 4
        color3 n / 16 0 0
        break 1
      .
      h = x * x - y * y + cx
      y = 2 * x * y + cy
      x = h
    .
    move x0 / 3 y0 / 3
    rect 0.4 0.4
  .
.

eC[edit]

Mandelbrot4.png

(Try it in a WebApp)

Drawing code:

void drawMandelbrot(Bitmap bmp, float range, Complex center, ColorAlpha * palette, int nPalEntries, int nIterations, float scale)
{
   int x, y;
   int w = bmp.width, h = bmp.height;
   ColorAlpha * picture = (ColorAlpha *)bmp.picture;
   double logOf2 = log(2);
   Complex d
   {
      w > h ? range : range * w / h,
      h > w ? range : range * h / w
   };
   Complex C0 { center.a - d.a/2, center.b - d.b/2 };
   Complex C = C0;
   double delta = d.a / w;

   for(y = 0; y < h; y++, C.a = C0.a, C.b += delta)
   {
      for(x = 0; x < w; x++, picture++, C.a += delta)
      {
         Complex Z { };
         int i;
         double ii = 0;
         bool out = false;
         double Za2 = Z.a * Z.a, Zb2 = Z.b * Z.b;
         for(i = 0; i < nIterations; i++)
         {
            double z2;
            Z = { Za2 - Zb2, 2*Z.a*Z.b };
            Z.a += C.a;
            Z.b += C.b;
            Za2 = Z.a * Z.a, Zb2 = Z.b * Z.b;
            z2 = Za2 + Zb2;

            if(z2 >= 2*2)
            {
               ii = (double)(i + 1 - log(0.5 * log(z2)) / logOf2);
               out = true;
               break;
            }
         }
         if(out)
         {
            float si = (float)(ii * scale);
            int i0 = ((int)si) % nPalEntries;
            *picture = palette[i0];
         }
         else
            *picture = black;
      }
   }
}

Interactive class with Rubberband Zoom:

class Mandelbrot : Window
{
   caption = $"Mandelbrot";
   borderStyle = sizable;
   hasMaximize = true;
   hasMinimize = true;
   hasClose = true;
   clientSize = { 600, 600 };

   Point mouseStart, mouseEnd;
   bool dragging;
   bool needUpdate;

   float scale;
   int nIterations; nIterations = 256;
   ColorAlpha * palette;
   int nPalEntries;
   Complex center { -0.75, 0 };

   float range; range = 4;
   Bitmap bmp { };

   Mandelbrot()
   {
      static ColorKey keys[] =
      {
         { navy, 0.0f },
         { Color { 146, 213, 237 }, 0.198606268f },
         { white, 0.3f },
         { Color { 255, 255, 124 }, 0.444250882f },
         { Color { 255, 100, 0 }, 0.634146333f },
         { navy, 1 }
      };

      nPalEntries = 30000;
      palette = new ColorAlpha[nPalEntries];
      scale = nPalEntries / 175.0f;
      PaletteGradient(palette, nPalEntries, keys, sizeof(keys)/sizeof(keys[0]), 1.0);
      needUpdate = true;
   }

   ~Mandelbrot() { delete palette; }

   void OnRedraw(Surface surface)
   {
      if(needUpdate)
      {
         drawMandelbrot(bmp, range, center, palette, nPalEntries, nIterations, scale);
         needUpdate = false;
      }
      surface.Blit(bmp, 0,0, 0,0, bmp.width, bmp.height);

      if(dragging)
      {
         surface.foreground = lime;
         surface.Rectangle(mouseStart.x, mouseStart.y, mouseEnd.x, mouseEnd.y);
      }
   }

   bool OnLeftButtonDown(int x, int y, Modifiers mods)
   {
      mouseEnd = mouseStart = { x, y };
      Capture();
      dragging = true;
      Update(null);
      return true;
   }

   bool OnLeftButtonUp(int x, int y, Modifiers mods)
   {
      if(dragging)
      {
         int dx = Abs(mouseEnd.x - mouseStart.x), dy = Abs(mouseEnd.y - mouseStart.y);
         if(dx > 4 && dy > 4)
         {
            int w = clientSize.w, h = clientSize.h;
            float rangeX = w > h ? range : range * w / h;
            float rangeY = h > w ? range : range * h / w;

            center.a += ((mouseStart.x + mouseEnd.x) - w) / 2.0f * rangeX / w;
            center.b += ((mouseStart.y + mouseEnd.y) - h) / 2.0f * rangeY / h;

            range = dy > dx ? dy * range / h : dx * range / w;

            needUpdate = true;
            Update(null);
         }
         ReleaseCapture();
         dragging = false;
      }
      return true;
   }

   bool OnMouseMove(int x, int y, Modifiers mods)
   {
      if(dragging)
      {
         mouseEnd = { x, y };
         Update(null);
      }
      return true;
   }

   bool OnRightButtonDown(int x, int y, Modifiers mods)
   {
      range = 4;
      nIterations = 256;
      center = { -0.75, 0 };
      needUpdate = true;
      Update(null);
      return true;
   }

   void OnResize(int width, int height)
   {
      bmp.Allocate(null, width, height, 0, pixelFormat888, false);
      needUpdate = true;
      Update(null);
   }

   bool OnKeyHit(Key key, unichar ch)
   {
      switch(key)
      {
         case space: case keyPadPlus: case plus:
            nIterations += 256;
            needUpdate = true;
            Update(null);
            break;
      }
      return true;
   }
}

Mandelbrot mandelbrotForm {};

EchoLisp[edit]

(lib 'math) ;; fractal function
(lib 'plot)

;; (fractal z zc n) iterates z := z^2 + c, n times
;; 100 iterations
(define (mset z) (if (= Infinity (fractal 0 z 100)) Infinity z))

;; plot function argument inside square (-2 -2), (2,2)
(plot-z-arg mset -2 -2)

;; result here [http://www.echolalie.org/echolisp/help.html#fractal]

Elixir[edit]

defmodule Mandelbrot do
  def set do
    xsize = 59
    ysize = 21
    minIm = -1.0
    maxIm = 1.0
    minRe = -2.0
    maxRe = 1.0
    stepX = (maxRe - minRe) / xsize
    stepY = (maxIm - minIm) / ysize
    Enum.each(0..ysize, fn y ->
      im = minIm + stepY * y
      Enum.map(0..xsize, fn x ->
        re = minRe + stepX * x
        62 - loop(0, re, im, re, im, re*re+im*im)
      end) |> IO.puts
    end)
  end
  
  defp loop(n, _, _, _, _, _) when n>=30, do: n
  defp loop(n, _, _, _, _, v) when v>4.0, do: n-1
  defp loop(n, re, im, zr, zi, _) do
    a = zr * zr
    b = zi * zi
    loop(n+1, re, im, a-b+re, 2*zr*zi+im, a+b)
  end
end

Mandelbrot.set
Output:
??????=====<<<<<<<<<<<<<<<;;;;;;:::96032:;;;;<<<<===========
?????===<<<<<<<<<<<<<<<<;;;;;;;:::873*079::;;;;<<<<<========
????===<<<<<<<<<<<<<<<;;;;;;;::9974    (.9::::;;<<<<<=======
???==<<<<<<<<<<<<<<<;;;;;;:98888764     5789999:;;<<<<<=====
??==<<<<<<<<<<<<<;;;;::::996. &2           45335:;<<<<<<====
??=<<<<<<<<<<<;;;::::::999752                 *79:;<<<<<<===
?=<<<<<<<<;;;:599999999886                    %78:;;<<<<<<==
?<<<<;;;;;:::972456-567763                      +9;;<<<<<<<=
?<;;;;;;::::9875&      .3                       *9;;;<<<<<<=
?;;;;;;::997564'        '                       8:;;;<<<<<<=
?::988897735/                                 &89:;;;<<<<<<=
?::988897735/                                 &89:;;;<<<<<<=
?;;;;;;::997564'        '                       8:;;;<<<<<<=
?<;;;;;;::::9875&      .3                       *9;;;<<<<<<=
?<<<<;;;;;:::972456-567763                      +9;;<<<<<<<=
?=<<<<<<<<;;;:599999999886                    %78:;;<<<<<<==
??=<<<<<<<<<<<;;;::::::999752                 *79:;<<<<<<===
??==<<<<<<<<<<<<<;;;;::::996. &2           45335:;<<<<<<====
???==<<<<<<<<<<<<<<<;;;;;;:98888764     5789999:;;<<<<<=====
????===<<<<<<<<<<<<<<<;;;;;;;::9974    (.9::::;;<<<<<=======
?????===<<<<<<<<<<<<<<<<;;;;;;;:::873*079::;;;;<<<<<========
??????=====<<<<<<<<<<<<<<<;;;;;;:::96032:;;;;<<<<===========

Emacs Lisp[edit]

Text mode[edit]

; === Mandelbrot ============================================

(setq mandel-size (cons 76 34))
(setq xmin -2)
(setq xmax .5)
(setq ymin -1.2)
(setq ymax 1.2)
(setq max-iter 20)

(defun mandel-iter-point (x y)
  "Run the actual iteration for each point."
  (let ((xp 0)
        (yp 0)
        (it 0)
        (xt 0))
    (while (and (< (+ (* xp xp) (* yp yp)) 4) (< it max-iter))
      (setq xt (+ (* xp xp) (* -1 yp yp) x))
      (setq yp (+ (* 2 xp yp) y))
      (setq xp xt)
      (setq it (1+ it)))
    it))

(defun mandel-iter (p)
  "Return string for point based on whether inside/outside the set."
  (let ((it (mandel-iter-point (car p) (cdr p))))
    (if (= it max-iter) "*" "-")))

(defun mandel-pos (x y)
  "Convert screen coordinates to input coordinates."
  (let ((xp (+ xmin (* (- xmax xmin) (/ (float x) (car mandel-size)))))
        (yp (+ ymin (* (- ymax ymin) (/ (float y) (cdr mandel-size))))))
       (cons xp yp)))

(defun mandel ()
  "Plot the Mandelbrot set."
  (dotimes (y (cdr mandel-size))
    (dotimes (x (car mandel-size))
      (if (= x 0)
        (insert(format "\n%s" (mandel-iter (mandel-pos x y))))
        (insert(format "%s" (mandel-iter (mandel-pos x y))))))))

(mandel)
Output:
----------------------------------------------------------------------------
----------------------------------------------------------------------------
----------------------------------------------------------------------------
---------------------------------------------------------*------------------
----------------------------------------------------------------------------
----------------------------------------------------**--***--*--------------
-----------------------------------------------------********---------------
------------------------------------------------------*******---------------
--------------------------------------------*-*--******************---------
--------------------------------------------****************************----
-----------------------------------------*-****************************-----
-----------------------------------------*******************************----
---------------------------------------************************************-
--------------------------**--**-*-----**********************************---
-------------------------***********---************************************-
------------------*-----**************************************************--
-------------------*****************************************************----
-*********************************************************************------
-------------------*****************************************************----
------------------*-----**************************************************--
-------------------------***********---************************************-
--------------------------**--**-*-----**********************************---
---------------------------------------************************************-
-----------------------------------------*******************************----
-----------------------------------------*-****************************-----
--------------------------------------------****************************----
--------------------------------------------*-*--******************---------
------------------------------------------------------*******---------------
-----------------------------------------------------********---------------
----------------------------------------------------**--***--*--------------
----------------------------------------------------------------------------
---------------------------------------------------------*------------------
----------------------------------------------------------------------------
----------------------------------------------------------------------------

Graphical version[edit]

With a few modifications (mandel-size, mandel-iter, string-to-image, mandel-pic), the code above can also render the Mandelbrot fractal to an XPM image and display it directly in the buffer. (You might have to scroll up in Emacs after the function has run to see its output.)

; === Graphical Mandelbrot ============================================

(setq mandel-size (cons 320 300))
(setq xmin -2)
(setq xmax .5)
(setq ymin -1.2)
(setq ymax 1.2)
(setq max-iter 20)

(defun mandel-iter-point (x y)
  "Run the actual iteration for each point."
  (let ((xp 0)
        (yp 0)
        (it 0)
        (xt 0))
    (while (and (< (+ (* xp xp) (* yp yp)) 4) (< it max-iter))
      (setq xt (+ (* xp xp) (* -1 yp yp) x))
      (setq yp (+ (* 2 xp yp) y))
      (setq xp xt)
      (setq it (1+ it)))
    it))

(defun mandel-iter (p)
  "Return string for point based on whether inside/outside the set."
  (let ((it (mandel-iter-point (car p) (cdr p))))
    (if (= it max-iter) "*" (if (cl-oddp it) "+" "-"))))

(defun mandel-pos (x y)
  "Convert screen coordinates to input coordinates."
  (let ((xp (+ xmin (* (- xmax xmin) (/ (float x) (car mandel-size)))))
        (yp (+ ymin (* (- ymax ymin) (/ (float y) (cdr mandel-size))))))
       (cons xp yp)))

(defun string-to-image (str)
  "Convert image data string to XPM image."
  (create-image (concat (format "/* XPM */
static char * mandel[] = {
\"%i %i 3 1\",
\"+      c #ff0000\",
\"-      c #0000ff\",
\"*      c #000000\"," (car mandel-size) (cdr mandel-size))
    str "};") 'xpm t))

(defun mandel-pic ()
  "Plot the Mandelbrot set."
  (setq all "")
  (dotimes (y (cdr mandel-size))
    (setq line "")
    (dotimes (x (car mandel-size))
      (setq line (concat line (mandel-iter (mandel-pos x y)))))
    (setq all (concat all "\"" line "\",\n")))
  (insert-image (string-to-image all)))

(mandel-pic)

Erlang[edit]

Translation of: Haskell

Function seq_float/2 is copied from Andrew Fecheyr's GitHubGist.

Using module complex from Geoff Hulette's GitHub repository

Geoff Hulette's GitHub repository provides two alternative implementations which are very interesting.

-module(mandelbrot).

-export([test/0]).

magnitude(Z) ->
  R = complex:real(Z),
  I = complex:imaginary(Z),
  R * R + I * I.

mandelbrot(A, MaxI, Z, I) ->
    case (I < MaxI) and (magnitude(Z) < 2.0) of
        true ->
            NZ = complex:add(complex:mult(Z, Z), A),
            mandelbrot(A, MaxI, NZ, I + 1);
        false ->
            case I of 
                MaxI ->
                    $*;
                _ ->
                    $ 
            end
    end.

test() ->
    lists:map(
        fun(S) -> io:format("~s",[S]) end, 
        [
            [
                begin 
                    Z = complex:make(X, Y),
                    mandelbrot(Z, 50, Z, 1)
                end
            || X <- seq_float(-2, 0.5, 0.0315)
            ] ++ "\n"
        || Y <- seq_float(-1,1, 0.05)
        ] ),
    ok.

% **************************************************
% Copied from https://gist.github.com/andruby/241489
% **************************************************

seq_float(Min, Max, Inc, Counter, Acc) when (Counter*Inc + Min) >= Max -> 
  lists:reverse([Max|Acc]);
seq_float(Min, Max, Inc, Counter, Acc) -> 
  seq_float(Min, Max, Inc, Counter+1, [Inc * Counter + Min|Acc]).
seq_float(Min, Max, Inc) -> 
  seq_float(Min, Max, Inc, 0, []).

% **************************************************

Output:

                                                                                 
                                                                                 
                                                                                 
                                                           **                    
                                                         ******                  
                                                       ********                  
                                                         ******                  
                                                      ******** **   *            
                                              ***   *****************            
                                              ************************  ***      
                                              ****************************       
                                           ******************************        
                                            ******************************       
                                         ************************************    
                                *         **********************************     
                           ** ***** *     **********************************     
                           ***********   ************************************    
                         ************** ************************************     
                         ***************************************************     
                     *****************************************************       
                   *****************************************************         
                     *****************************************************       
                         ***************************************************     
                         ************** ************************************     
                           ***********   ************************************    
                           ** ***** *     **********************************     
                                *         **********************************     
                                         ************************************    
                                            ******************************       
                                           ******************************        
                                              ****************************       
                                              ************************  ***      
                                              ***   *****************            
                                                      ******** **   *            
                                                         ******                  
                                                       ********                  
                                                         ******                  
                                                           **                    
                                                                                 
                                                                                 
                                                                                 

ERRE[edit]

PROGRAM MANDELBROT

!$KEY
!$INCLUDE="PC.LIB"

BEGIN

SCREEN(7)
GR_WINDOW(-2,1.5,2,-1.5)
FOR X0=-2 TO 2 STEP 0.01 DO
    FOR Y0=-1.5 TO 1.5 STEP 0.01 DO
        X=0
        Y=0

        ITERATION=0
        MAX_ITERATION=223

        WHILE (X*X+Y*Y<=(2*2) AND ITERATION<MAX_ITERATION) DO
            X_TEMP=X*X-Y*Y+X0
            Y=2*X*Y+Y0

            X=X_TEMP

            ITERATION=ITERATION+1
        END WHILE

        IF ITERATION<>MAX_ITERATION THEN
            C=ITERATION
          ELSE
            C=0
        END IF

        PSET(X0,Y0,C)
    END FOR
END FOR
END PROGRAM

Note: This is a PC version which uses EGA 16-color 320x200. Graphic commands are taken from PC.LIB library.

F#[edit]

open System.Drawing 
open System.Windows.Forms
type Complex =
    { 
        re : float;
        im : float
    }
let cplus (x:Complex) (y:Complex) : Complex = 
    {
        re = x.re + y.re;
        im = x.im + y.im
    }
let cmult (x:Complex) (y:Complex) : Complex = 
    {
        re = x.re * y.re - x.im * y.im;
        im = x.re * y.im + x.im * y.re;
    }

let norm (x:Complex) : float =
    x.re*x.re + x.im*x.im

type Mandel = class
    inherit Form
    static member xPixels = 500
    static member yPixels = 500
    val mutable bmp : Bitmap
    member x.mandelbrot xMin xMax yMin yMax maxIter =
        let rec mandelbrotIterator z c n =
            if (norm z) > 2.0 then false else
                match n with
                    | 0 -> true
                    | n -> let z' = cplus ( cmult z z ) c in
                            mandelbrotIterator z' c (n-1)
        let dx = (xMax - xMin) / (float (Mandel.xPixels))
        let dy = (yMax - yMin) / (float (Mandel.yPixels))
        in
        for xi = 0 to Mandel.xPixels-1 do
            for yi = 0 to Mandel.yPixels-1 do
                let c = {re = xMin + (dx * float(xi) ) ;
                         im = yMin + (dy * float(yi) )} in
                if (mandelbrotIterator {re=0.;im=0.;} c maxIter) then
                    x.bmp.SetPixel(xi,yi,Color.Azure)
                else
                    x.bmp.SetPixel(xi,yi,Color.Black)
            done
        done

    member public x.generate () = x.mandelbrot (-1.5) 0.5 (-1.0) 1.0 200 ; x.Refresh()

    new() as x = {bmp = new Bitmap(Mandel.xPixels , Mandel.yPixels)} then
        x.Text <- "Mandelbrot set" ;
        x.Width <- Mandel.xPixels ;
        x.Height <- Mandel.yPixels ;
        x.BackgroundImage <- x.bmp;
        x.generate();
        x.Show();   
end

let f = new Mandel()
do Application.Run(f)

Alternate version, applicable to text and GUI[edit]

Basic generation code

let getMandelbrotValues width height maxIter ((xMin,xMax),(yMin,yMax)) =
  let mandIter (cr:float,ci:float) =
    let next (zr,zi) = (cr + (zr * zr - zi * zi)), (ci + (zr * zi + zi * zr))
    let rec loop = function
      | step,_ when step=maxIter->0
      | step,(zr,zi) when ((zr * zr + zi * zi) > 2.0) -> step
      | step,z -> loop ((step + 1), (next z))
    loop (0,(0.0, 0.0))
  let forPos =
    let dx, dy = (xMax - xMin) / (float width), (yMax - yMin) / (float height)
    fun y x -> mandIter ((xMin + dx * float(x)), (yMin + dy * float(y)))
  [0..height-1] |> List.map(fun y->[0..width-1] |> List.map (forPos y))

Text display

getMandelbrotValues 80 25 50 ((-2.0,1.0),(-1.0,1.0))
|> List.map(fun row-> row |> List.map (function | 0 ->" " |_->".") |> String.concat "")
|> List.iter (printfn "%s")

Results:

Output:
................................................................................
................................................................................
.................................................  .............................
................................................     ...........................
.................................................    ...........................
.......................................   .               ......................
........................................                       .................
....................................                          ..................
....................................                           .................
..........................  ......                              ................
.......................         ...                             ................
.....................            .                              ................
.................                                              .................
.................                                              .................
.....................            .                              ................
.......................         ...                             ................
..........................  ......                              ................
....................................                           .................
....................................                          ..................
........................................                       .................
.......................................   .               ......................
.................................................    ...........................
................................................     ...........................
.................................................  .............................
................................................................................

Graphics display

open System.Drawing 
open System.Windows.Forms

let showGraphic (colorForIter: int -> Color) (width: int) (height:int) maxIter view =
  new Form()
  |> fun frm ->
    frm.Width <- width
    frm.Height <- height
    frm.BackgroundImage <- 
      new Bitmap(width,height)
      |> fun bmp ->
        getMandelbrotValues width height maxIter view
        |> List.mapi (fun y row->row |> List.mapi (fun x v->((x,y),v))) |> List.collect id
        |> List.iter (fun ((x,y),v) -> bmp.SetPixel(x,y,(colorForIter v)))
        bmp
    frm.Show()

let toColor = (function | 0 -> (0,0,0) | n -> ((31 &&& n) |> fun x->(0, 18 + x * 5, 36 + x * 7))) >> Color.FromArgb

showGraphic toColor 640 480 5000 ((-2.0,1.0),(-1.0,1.0))

Factor[edit]

! with ("::") or without (":") generalizations:
! : [a..b] ( steps a b -- a..b ) 2dup swap - 4 nrot 1 - / <range> ;
::  [a..b] ( steps a b -- a..b ) a b b a - steps 1 - / <range> ;

: >char ( n -- c )
    dup -1 = [ drop 32 ] [ 26 mod CHAR: a + ] if ;

! iterates z' = z^2 + c, Factor does complex numbers!
: iter ( c z -- z' ) dup * + ;

: unbound ( c -- ? ) absq 4 > ;

:: mz ( c max i z -- n )
  {
    { [ i max >= ] [ -1 ] }
    { [ z unbound ] [ i ] }
    [ c max i 1 + c z iter mz ]
  } cond ;

: mandelzahl ( c max -- n ) 0 0 mz ;

:: mandel ( w h max -- )
    h -1. 1. [a..b] ! range over y
    [   w -2. 1. [a..b] ! range over x
        [ dupd swap rect> max mandelzahl >char ] map
        >string print
        drop ! old y
    ] each
    ;

70 25 1000 mandel
Output:
bbbbbbbcccccdddddddddddddddddddeeeeeeeffghjpjl feeeeedddddcccccccccccc
bbbbbbccccddddddddddddddddddeeeeeeeefffghikopjhgffeeeeedddddcccccccccc
bbbbbcccddddddddddddddddddeeeeeeeefffggjotx etiigfffeeeeddddddcccccccc
bbbbccddddddddddddddddddeeeeeeeffgggghhjq     iihgggfffeedddddddcccccc
bbbccddddddddddddddddeeeeeefffghvasjjqqyqt   upqlrjhhhkhfedddddddccccc
bbbcdddddddddddddddeeeeffffffgghks  c             qnbpfmgfedddddddcccc
bbcdddddddddddddeefffffffffgggipmt                    qhgfeedddddddccc
bbdddddddddeeeefhlggggggghhhhils                      ljigfeedddddddcc
bcddddeeeeeefffghmllkjiljjiijle                         yhfeedddddddcc
bddeeeeeeeffffghhjoj do   clmq                         qlgfeeedddddddc
bdeeeeeefffffhiijpu         sm                         ohffeeedddddddc
beffeefgggghhjocsu                                    higffeeedddddddc
                                                    cmihgffeeedddddddd
beffeefgggghhjocsu                                    higffeeedddddddc
bdeeeeeefffffhiijpu         sd                         ohffeeedddddddc
bddeeeeeeeffffghhjoj do   clmq                         qlgfeeedddddddc
bcddddeeeeeefffghmllkjiljjiijle                         yhfeedddddddcc
bbdddddddddeeeefhlggggggghhhhils                      ljigfeedddddddcc
bbcdddddddddddddeefffffffffgggipmt                    qhgfeedddddddccc
bbbcdddddddddddddddeeeeffffffgghks  c             qnbpfmgfedddddddcccc
bbbccddddddddddddddddeeeeeefffghvasjjqqyqt   upqlrjhhhkhfedddddddccccc
bbbbccddddddddddddddddddeeeeeeeffgggghhjq     iihgggfffeedddddddcccccc
bbbbbcccddddddddddddddddddeeeeeeeefffggjotx etiigfffeeeeddddddcccccccc
bbbbbbccccddddddddddddddddddeeeeeeeefffghikopjhgffeeeeedddddcccccccccc
bbbbbbbcccccdddddddddddddddddddeeeeeeeffghjpjl feeeeedddddcccccccccccc



Fennel[edit]

#!/usr/bin/env fennel

(fn mandelzahl [cr ci max i tr ti tr2 ti2]
  "Calculates the Mandelbrot escape number of a complex point c"
  (if (>= i max)         -1
      (>= (+ tr2 ti2) 4)  i
      (let [(tr ti) (values (+ (- tr2 ti2) cr)
                            (+ (* tr ti 2) ci))]
        (mandelzahl cr ci max (+ i 1)
                    tr ti (* tr tr) (* ti ti)))))

(fn mandel [w h max]
  "Entry point, generate a 'graphical' representation of the Mandelbrot set"
  (for [y -1.0 1.0 (/ 2.0 h)]
    (var line {})
    (for [x -2.0 1.0 (/ 3.0 w)]
      (let [mz (mandelzahl x y max 0 0 0 0 0)]
        (tset line (+ (length line) 1)
              (or (and (< mz 0) " ")
                  (string.char (+ (string.byte :a) (% mz 26)))))))
    (print (table.concat line))))

(fn arg-def [pos default]
  "A helper fn to extract command line parameter with defaults" 
  (or (tonumber (and arg (. arg pos))) default))

(let [width  (arg-def 1 140)
      height (arg-def 2 50)
      max    (arg-def 3 1e5)]
  (mandel width height max))

FOCAL[edit]

1.1 S I1=-1.2; S I2=1.2; S R1=-2; S R2=.5
1.2 S MIT=30
1.3 F Y=1,24; D 2
1.4 Q

2.1 T !
2.2 F X=1,70; D 3

3.1 S R=X*(R2-R1)/70+R1
3.2 S I=Y*(I2-I1)/24+I1
3.3 S C1=R; S C2=I
3.4 F T=1,MIT; D 4

4.1 S C3=C1
4.2 S C1=C1*C1 - C2*C2
4.3 S C2=C3*C2 + C2*C3
4.4 S C1=C1+R
4.5 S C2=C2+I
4.6 I (-FABS(C1)+2)5.1
4.7 I (-FABS(C2)+2)5.1
4.8 I (MIT-T-1)6.1

5.1 S T=MIT; T "*"; R

6.1 T " "; R
Output:
**********************************************************************
**********************************************************************
**************************************************** *****************
*************************************************      ***************
*************************************************      ***************
****************************************    *               **********
*************************************** *                       ******
*************************************                            *****
********************** **** *******                               ****
***********************          **                                 **
*********************                                             ****
*** *                                                          *******
*********************                                             ****
***********************          **                                 **
********************** **** *******                               ****
*************************************                            *****
*************************************** *                       ******
****************************************    *               **********
*************************************************      ***************
*************************************************      ***************
**************************************************** *****************
**********************************************************************
**********************************************************************
**********************************************************************

Forth[edit]

This uses grayscale image utilities.

500 value max-iter

: mandel ( gmp  F: imin imax rmin rmax -- )
  0e 0e { F: imin F: imax F: rmin F: rmax F: Zr F: Zi }
  dup bheight 0 do
    i s>f dup bheight s>f f/ imax imin f- f* imin f+ TO Zi
    dup bwidth 0 do
      i s>f dup bwidth s>f f/ rmax rmin f- f* rmin f+ TO Zr
      Zr Zi max-iter
      begin  1- dup
      while  fover fdup f* fover fdup f*
             fover fover f+ 4e f<
      while  f- Zr f+
             frot frot f* 2e f* Zi f+
      repeat fdrop fdrop
             drop 0        \ for a pretty grayscale image, replace with: 255 max-iter */
      else   drop 255
      then   fdrop fdrop
      over i j rot g!
    loop
  loop    drop ;

80 24 graymap
dup -1e 1e -2e 1e mandel
Works with: 4tH v3.64

This is a completely integer version without local variables, which uses 4tH's native graphics library.

include lib/graphics.4th               \ graphics support is needed

640 pic_width !                        \ width of the image
480 pic_height !                       \ height of the image

create shade                           \ map the shades of the image
  ' black ,                            \ this is the colorscheme
  ' blue ,
  ' cyan ,
  ' green ,
  ' yellow ,
  ' red ,
  ' magenta ,
  ' blue ,
  ' cyan ,
  ' green ,
  ' yellow ,
  ' white ,
does> swap cells + @c execute ;        \ loop through the shades available

color_image                            \ we're making a color image

15121 -15120 do                        \ do y-coordinate
  15481 -21000 do                      \ do x-coordinate
    j 0 0 0                            ( l u v i)
    200 0 do                           \ get color
      >r
      over dup 10 / * 1000 /           \ calculate X and Y
      over dup 10 / * 1000 /           \ if X+Y > 40000
      over over + r> swap 40000 >      \ use the color in the loop
      if
        drop drop drop i 11 min leave
      else                             \ otherwise try the next one
        j swap >r - - >r * 5000 / over + r> swap r>
      then
    loop                               \ drop all parameters and set the shade
    shade drop drop drop               \ now set the proper pixel
    j 15120 + 63 / i 21000 + 57 / set_pixel
  57 +loop                             \ we're scaling the x-coordinate
63 +loop                               \ we're scaling the y-coordinate

s" mandelbt.ppm" save_image            \ done, save the image
dup gshow
free bye

Fortran[edit]

Works with: Fortran version 90 and later
program mandelbrot

  implicit none
  integer  , parameter :: rk       = selected_real_kind (9, 99)
  integer  , parameter :: i_max    =  800
  integer  , parameter :: j_max    =  600
  integer  , parameter :: n_max    =  100
  real (rk), parameter :: x_centre = -0.5_rk
  real (rk), parameter :: y_centre =  0.0_rk
  real (rk), parameter :: width    =  4.0_rk
  real (rk), parameter :: height   =  3.0_rk
  real (rk), parameter :: dx_di    =   width / i_max
  real (rk), parameter :: dy_dj    = -height / j_max
  real (rk), parameter :: x_offset = x_centre - 0.5_rk * (i_max + 1) * dx_di
  real (rk), parameter :: y_offset = y_centre - 0.5_rk * (j_max + 1) * dy_dj
  integer, dimension (i_max, j_max) :: image
  integer   :: i
  integer   :: j
  integer   :: n
  real (rk) :: x
  real (rk) :: y
  real (rk) :: x_0
  real (rk) :: y_0
  real (rk) :: x_sqr
  real (rk) :: y_sqr

  do j = 1, j_max
    y_0 = y_offset + dy_dj * j
    do i = 1, i_max
      x_0 = x_offset + dx_di * i
      x = 0.0_rk
      y = 0.0_rk
      n = 0
      do
        x_sqr = x ** 2
        y_sqr = y ** 2
        if (x_sqr + y_sqr > 4.0_rk) then
          image (i, j) = 255
          exit
        end if
        if (n == n_max) then
          image (i, j) = 0
          exit
        end if
        y = y_0 + 2.0_rk * x * y
        x = x_0 + x_sqr - y_sqr
        n = n + 1
      end do
    end do
  end do
  open  (10, file = 'out.pgm')
  write (10, '(a/ i0, 1x, i0/ i0)') 'P2', i_max, j_max, 255
  write (10, '(i0)') image
  close (10)

end program mandelbrot
bs

Frink[edit]

This draws a graphical Mandelbrot set using Frink's built-in graphics and complex arithmetic.

// Maximum levels for each pixel.
levels = 60

// Create a random color for each level.
colors = new array[[levels]]
for a = 0 to levels-1
   colors@a = new color[randomFloat[0,1], randomFloat[0,1], randomFloat[0,1]]

// Make this number smaller for higher resolution.
stepsize = .005

g = new graphics
g.antialiased[false]

for im = -1.2 to 1.2 step stepsize
{
   imag = i * im
   for real = -2 to 1 step stepsize
   {  
      C = real + imag
      z = 0
      count = -1

      do
      {
         z = z^2 + C
         count=count+1;
      } while abs[z] < 4 and count < levels

      g.color[colors@((count-1) mod levels)]
      g.fillRectSize[real, im, stepsize, stepsize]
   }
}

g.show[]

Furor[edit]

###sysinclude X.uh
$ff0000 sto szin
300 sto maxiter
maxypixel sto YRES
maxxpixel sto XRES
myscreen "Mandelbrot" @YRES @XRES graphic
@YRES 2 / (#d) sto y2
@YRES 2 / (#d) sto x2
#g 0. @XRES (#d) 1.  i: {#d
#g 0. @YRES (#d) 1. {#d
#d
{#d}§i 400. - @x2 - @x2 /
sto x
{#d}  @y2 - @y2 /
sto y
zero#d xa zero#d ya zero iter
(( #d
@x @xa dup* @ya dup* -+
@y @xa *2 @ya *+ sto ya
sto xa #g inc iter
@iter @maxiter >= then((>))
#d ( @xa dup* @ya dup* + 4. > )))
#g @iter @maxiter == { #d
myscreen {d} {d}§i @szin [][]
}{ #d
myscreen {d} {d}§i #g @iter 64 * [][]
}
#d}
#d}
(( ( myscreen key? 10000 usleep )))
myscreen !graphic
end
{ „x” }
{ „x2” }
{ „y” }
{ „y2” }
{ „xa” }
{ „ya” }
{ „iter” }
{ „maxiter” }
{ „szin” }
{ „YRES” }
{ „XRES” }
{ „myscreen” }


Futhark[edit]

This example is incorrect. Please fix the code and remove this message.
Details: Futhark's syntax has changed, so this example will not compile

Computes escapes for each pixel, but not the colour.

default(f32)

type complex = (f32, f32)

fun dot(c: complex): f32 =
  let (r, i) = c
  in r * r + i * i

fun multComplex(x: complex, y: complex): complex =
  let (a, b) = x
  let (c, d) = y
  in (a*c - b * d,
      a*d + b * c)

fun addComplex(x: complex, y: complex): complex =
  let (a, b) = x
  let (c, d) = y
  in (a + c,
      b + d)

fun divergence(depth: int, c0: complex): int =
  loop ((c, i) = (c0, 0)) = while i < depth && dot(c) < 4.0 do
    (addComplex(c0, multComplex(c, c)),
     i + 1)
  in i

fun mandelbrot(screenX: int, screenY: int, depth: int, view: (f32,f32,f32,f32)): [screenX][screenY]int =
  let (xmin, ymin, xmax, ymax) = view
  let sizex = xmax - xmin
  let sizey = ymax - ymin
  in map (fn (x: int): [screenY]int  =>
           map  (fn (y: int): int  =>
                  let c0 = (xmin + (f32(x) * sizex) / f32(screenX),
                            ymin + (f32(y) * sizey) / f32(screenY))
                  in divergence(depth, c0))
                (iota screenY))
         (iota screenX)

fun main(screenX: int, screenY: int, depth: int, xmin: f32, ymin: f32, xmax: f32, ymax: f32): [screenX][screenY]int =
  mandelbrot(screenX, screenY, depth, (xmin, ymin, xmax, ymax))


FutureBasic[edit]

_xmin    = -8601
_xmax    =  2867
_ymin    = -4915
_ymax    =  4915
_maxiter =  32
_dx = ( _xmax - _xmin ) / 79
_dy = ( _ymax - _ymin ) / 24

void local fn MandelbrotSet
  printf @"\n"
  SInt32 cy = _ymin
  while ( cy <= _ymax )
    SInt32 cx = _xmin
    while ( cx <= _xmax )
      SInt32   x = 0
      SInt32   y = 0
      SInt32  x2 = 0
      SInt32  y2 = 0
      SInt32 iter = 0
      while ( iter < _maxiter )
        if ( x2 + y2 > 16384 ) then break
        y = ( ( x  * y ) >> 11 ) + (SInt32)cy
        x = x2 - y2 + (SInt32)cx
        x2 = ( x * x ) >> 12
        y2 = ( y * y ) >> 12
        iter++
      wend
      print fn StringWithFormat( @"%3c", iter + 32 );
      cx += _dx
    wend
    printf @"\n"
    cy += _dy
  wend
end fn

window 1, @"Mandelbrot Set", ( 0, 0, 820, 650 )
WindowSetBackgroundColor( 1, fn ColorBlack )
text @"Impact", 10.0, fn ColorWithRGB( 1.000, 0.800, 0.000, 1.0 )

fn MandelbrotSet

HandleEvents
Output:

!!!!!!!!!!!!!!!"""""""""""""####################################""""""""""""""""
!!!!!!!!!!!!!"""""""""#######################$$$$$$$%'+)%%%$$$$$#####"""""""""""
!!!!!!!!!!!"""""""#######################$$$$$$$$%%%&&(+,)++&%$$$$$$######""""""
!!!!!!!!!"""""#######################$$$$$$$$$$%%%%&')*5:/+('&%%$$$$$$#######"""
!!!!!!!!""""#####################$$$$$$$$$$%%%&&&''),@@@@@@@,'&%%%%%$$$$########
!!!!!!!"""####################$$$$$$$$%%%&'())((())*,@@@@@@/+))('&&&&)'%$$######
!!!!!!""###################$$$$$%%%%%%&&&'+.@@=/<@@@@@@@@@@@@@@@/++@..93%%$#####
!!!!!"################$$$%%%%%%%%%%&&&&'),+2@@@@@@@@@@@@@@@@@@@@@@@@@1(&&%$$####
!!!!"##########$$$$$%%&(-(''''''''''''(*,5@@@@@@@@@@@@@@@@@@@@@@@@@@@@+)-&%$$###
!!!!####$$$$$$$$%%%%%&'(*-@1.+.@-4+))**@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@4-(&%$$$##
!!!!#$$$$$$$$$%%%%%%'''++.6@@@@@@@@@8/0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@3(%%$$$$#
!!!#$$$$$$$%&&&&''()/-5.5@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?'&%%$$$$#
!!!(**+/+<523/80/46@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@4+)'&&%%$$$$#
!!!#$$$$$$$%&&&&''().-2.@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@'&%%$$$$#
!!!!#$$$$$$$$$%%%%%&'''/,.7@@@@@@@@@;/0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0'%%$$$$#
!!!!####$$$$$$$$%%%%%&'(*-:2.,/?-5+))**@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@4+(&%$$$##
!!!!"##########$$$$$%%&(-(''''(''''''((*,4@@@@@@@@@@@@@@@@@@@@@@@@@@@4+).&%$$###
!!!!!"################$$$%%%%%%%%%%&&&&')<,4@@@@@@@@@@@@@@@@@@@@@@@@@/('&%%$####
!!!!!!""##################$$$$$$%%%%%%&&&'*.@@@0@@@@@@@@@@@@@@@@1,,@//9)%%$#####
!!!!!!!"""####################$$$$$$$$%%%&(())((()**-@@@@@@/+)))'&&&')'%$$######
!!!!!!!!""""#####################$$$$$$$$$$%%%&&&''(,@@@@@@@+'&&%%%%%$$$########
!!!!!!!!!"""""#######################$$$$$$$$$$%%%%&')*7@0+('&%%%$$$$$#######"""
!!!!!!!!!!!"""""""######################$$$$$$$$$%%%&&(+-).*&%$$$$$$######""""""
!!!!!!!!!!!!!"""""""""#######################$$$$$$%%'3(%%%$$$$$######""""""""""
!!!!!!!!!!!!!!!""""""""""""#####################################"""""""""""""""


Fōrmulæ[edit]

Fōrmulæ programs are not textual, visualization/edition of programs is done showing/manipulating structures but not text. Moreover, there can be multiple visual representations of the same program. Even though it is possible to have textual representation —i.e. XML, JSON— they are intended for storage and transfer purposes more than visualization and edition.

Programs in Fōrmulæ are created/edited online in its website, However they run on execution servers. By default remote servers are used, but they are limited in memory and processing power, since they are intended for demonstration and casual use. A local server can be downloaded and installed, it has no limitations (it runs in your own computer). Because of that, example programs can be fully visualized and edited, but some of them will not run if they require a moderate or heavy computation/memory resources, and no local server is being used.

In this page you can see the program(s) related to this task and their results.

GLSL[edit]

Uses smooth coloring.

const int MaxIterations = 1000;
const vec2 Focus = vec2(-0.51, 0.54);
const float Zoom = 1.0;

vec3
color(int iteration, float sqLengthZ) {
    // If the point is within the mandlebrot set
    // just color it black
    if(iteration == MaxIterations)
        return vec3(0.0);
    
    // Else we give it a smoothed color
   	float ratio = (float(iteration) - log2(log2(sqLengthZ))) / float(MaxIterations);
    
    // Procedurally generated colors
    return mix(vec3(1.0, 0.0, 0.0), vec3(1.0, 1.0, 0.0), sqrt(ratio));
}

void
mainImage(out vec4 fragColor, in vec2 fragCoord) {      
    // C is the aspect-ratio corrected UV coordinate.
    vec2 c = (-1.0 + 2.0 * fragCoord / iResolution.xy) * vec2(iResolution.x / iResolution.y, 1.0);
    
    // Apply scaling, then offset to get a zoom effect
    c = (c * exp(-Zoom)) + Focus;
	vec2 z = c;
    
    int iteration = 0;
    
    while(iteration < MaxIterations) {
        // Precompute for efficiency
   	float zr2 = z.x * z.x;
        float zi2 = z.y * z.y;

        // The larger the square length of Z,
        // the smoother the shading
        if(zr2 + zi2 > 32.0) break;

        // Complex multiplication, then addition
    	z = vec2(zr2 - zi2, 2.0 * z.x * z.y) + c;
        ++iteration;
    }
    
    // Generate the colors
    fragColor = vec4(color(iteration, dot(z,z)), 1.0);
    
    // Apply gamma correction
    fragColor.rgb = pow(fragColor.rgb, vec3(0.5));
}

gnuplot[edit]

The output from gnuplot is controlled by setting the appropriate values for the options terminal and output.

set terminal png
set output 'mandelbrot.png'

The following script draws an image of the number of iterations it takes to escape the circle with radius rmax with a maximum of nmax.

rmax = 2
nmax = 100
complex (x, y) = x * {1, 0} + y * {0, 1}
mandelbrot (z, z0, n) = n == nmax || abs (z) > rmax ? n : mandelbrot (z ** 2 + z0, z0, n + 1)
set samples 200
set isosamples 200
set pm3d map
set size square
splot [-2 : .8] [-1.4 : 1.4] mandelbrot (complex (0, 0), complex (x, y), 0) notitle
Output:

Mandelbrot.png

Go[edit]

Text

Prints an 80-char by 41-line depiction.

package main

import "fmt"
import "math/cmplx"

func mandelbrot(a complex128) (z complex128) {
    for i := 0; i < 50; i++ {
        z = z*z + a
    }
    return
}

func main() {
    for y := 1.0; y >= -1.0; y -= 0.05 {
        for x := -2.0; x <= 0.5; x += 0.0315 {
            if cmplx.Abs(mandelbrot(complex(x, y))) < 2 {
                fmt.Print("*")
            } else {
                fmt.Print(" ")
            }
        }
        fmt.Println("")
    }
}
Graphical
.png image
package main

import (
    "fmt"
    "image"
    "image/color"
    "image/draw"
    "image/png"
    "math/cmplx"
    "os"
)

const (
    maxEsc = 100
    rMin   = -2.
    rMax   = .5
    iMin   = -1.
    iMax   = 1.
    width  = 750
    red    = 230
    green  = 235
    blue   = 255
)

func mandelbrot(a complex128) float64 {
    i := 0
    for z := a; cmplx.Abs(z) < 2 && i < maxEsc; i++ {
        z = z*z + a
    }
    return float64(maxEsc-i) / maxEsc
}

func main() {
    scale := width / (rMax - rMin)
    height := int(scale * (iMax - iMin))
    bounds := image.Rect(0, 0, width, height)
    b := image.NewNRGBA(bounds)
    draw.Draw(b, bounds, image.NewUniform(color.Black), image.ZP, draw.Src)
    for x := 0; x < width; x++ {
        for y := 0; y < height; y++ {
            fEsc := mandelbrot(complex(
                float64(x)/scale+rMin,
                float64(y)/scale+iMin))
            b.Set(x, y, color.NRGBA{uint8(red * fEsc),
                uint8(green * fEsc), uint8(blue * fEsc), 255})

        }
    }
    f, err := os.Create("mandelbrot.png")
    if err != nil {
        fmt.Println(err)
        return
    }
    if err = png.Encode(f, b); err != nil {
        fmt.Println(err)
    }
    if err = f.Close(); err != nil {
        fmt.Println(err)
    }
}


Golfscript[edit]

Código sacado de https://codegolf.stackexchange.com/

20{40{0.1{.{;..*2$.*\- 
20/3$-@@*10/3$-..*2$.*+1600<}*}32*' 
*'=\;\;@@(}60*;(n\}40*;]''+
Output:
000000000000000000000000000000000000000010000000000000000000
000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000001000000000000000000000000
000000000000000000000000000000000000001000000000000000000000
000000000000000000000000000000000000111000000000000000000000
000000000000000000000000000000000000111110000000000000000000
000000000000000000000000000000000000011100000000000000000000
000000000000000000000000000001000110111100010000000000000000
000000000000000000000000000000100111111111110000000000000000
000000000000000000000000000001011111111111110111000000000000
000000000000000000000000000001111111111111111110000000000000
000000000000000000000000000000111111111111111110000000000000
000000000000001000000000000011111111111111111111000000000000
000000000000000000000000000011111111111111111111000000000000
000000000000000000000000000111111111111111111111000000000000
000000000000000000000000001111111111111111111111100000000000
000000000000000001111110001111111111111111111111100000000000
000000000000000011111111101111111111111111111111100000000000
000000000000100111111111111111111111111111111111000000000000
000000000001101111111111111111111111111111111111000000000000
011111111111111111111111111111111111111111111100000000000000
000000000000001111111111111111111111111111111110000000000000
000000000000000111111111111111111111111111111111000000000000
000000000000000001111111111111111111111111111111100000000000
000000000000000001111111101111111111111111111111000000000000
000000000000000001011100000111111111111111111111100000000000
000000000000000000000100000111111111111111111111000000000000
000000000000000100000000001111111111111111111111100000000000
000000000000000100000000000011111111111111111111000000000000
000000000000000000000000000011111111111111111110000000000000
000000000000000000000000000001111111111111111111000000000000
000000000000000000000000000000111111111111111111000000000000
000000000000000000000000000001101111111111111000000000000000
000000000000000000000000000011000011111110100000000000000000
000000000000000000000000000000000000111100000000000000000000
000000000000000000000000000000000000111110000000000000000000
000000000000000000000000000000000000111100000000000000000000
000000000000000000000000000000000000011000000000000000000000
000000000000000000000000000000000000001000000000000000000000
000000000000000000000000000000000000000000000000000000000000

Hare[edit]

Translation of: D
use fmt;
use math;

type complex = struct {
	re: f64,
	im: f64
};

export fn main() void = {
	for (let y = -1.2; y < 1.2; y += 0.05) {
		for (let x = -2.05; x < 0.55; x += 0.03) {
			let z = complex {re = 0.0, im = 0.0};

			for (let m = 0z; m < 100; m += 1) {
				let tz = z;

				z.re = tz.re*tz.re - tz.im*tz.im;
				z.im = tz.re*tz.im + tz.im*tz.re;
				z.re += x;
				z.im += y;
			};
			fmt::print(if (abs(z) < 2f64) '#' else '.')!;
		};
		fmt::println()!;
	};
};

fn abs(z: complex) f64 = {
	return math::sqrtf64(z.re*z.re + z.im*z.im);
};
Output:
.......................................................................................
.......................................................................................
.......................................................................................
.......................................................................................
.......................................................................................
.......................................................................................
.......................................................................................
................................................................##.....................
.............................................................######....................
.............................................................#######...................
..............................................................######...................
..........................................................#.#.###..#.#.................
...................................................##....################..............
..................................................###.######################.###.......
...................................................############################........
................................................###############################........
................................................################################.......
.............................................#####################################.....
..............................................###################################......
..............................##.####.#......####################################......
..............................###########....####################################......
............................###############.######################################.....
............................###############.#####################################......
........................##.#####################################################.......
......#.###...#.#############################################################..........
........................##.#####################################################.......
............................###############.#####################################......
............................###############.######################################.....
..............................###########....####################################......
..............................##.####.#......####################################......
..............................................###################################......
.............................................#####################################.....
................................................################################.......
................................................###############################........
...................................................############################........
..................................................###.######################.###.......
...................................................##....################..............
..........................................................#.#.###..#.#.................
..............................................................######...................
.............................................................#######...................
.............................................................######....................
................................................................##.....................
.......................................................................................
.......................................................................................
.......................................................................................
.......................................................................................
.......................................................................................
.......................................................................................

Haskell[edit]

Translation of: Ruby
import Data.Bool ( bool )
import Data.Complex (Complex ((:+)), magnitude)

mandelbrot :: RealFloat a => Complex a -> Complex a
mandelbrot a = iterate ((a +) . (^ 2)) 0 !! 50

main :: IO ()
main =
  mapM_
    putStrLn
    [ [ bool ' ' '*' (2 > magnitude (mandelbrot (x :+ y)))
        | x <- [-2, -1.9685 .. 0.5]
      ]
      | y <- [1, 0.95 .. -1]
    ]
Output:
                            
                                                           **                   
                                                         ******                 
                                                       ********                 
                                                         ******                 
                                                      ******** **   *           
                                              ***   *****************           
                                              ************************  ***     
                                              ****************************      
                                           ******************************       
                                            ******************************      
                                         ************************************   
                                *         **********************************    
                           ** ***** *     **********************************    
                           ***********   ************************************   
                         ************** ************************************    
                         ***************************************************    
                     *****************************************************      
 ***********************************************************************        
                     *****************************************************      
                         ***************************************************    
                         ************** ************************************    
                           ***********   ************************************   
                           ** ***** *     **********************************    
                                *         **********************************    
                                         ************************************   
                                            ******************************      
                                           ******************************       
                                              ****************************      
                                              ************************  ***     
                                              ***   *****************           
                                                      ******** **   *           
                                                         ******                 
                                                       ********                 
                                                         ******                 
                                                           **  

haskell one-liners :

-- first attempt
-- putStrLn $ foldr (++) "" [ if x==(-2) then "\n" else let (a, b) = iterate (\(x', y') -> (x'^2-y'^2+x, 2*x'*y'+y)) (0, 0) !! 500 in (snd.head.filter (\(v, c)->v) $ zip ([(<0.01), (<0.025), (<0.05), (<0.1), (<0.5), (<1), (<4), (\_ -> True)] <*> [a^2 + b^2]) [".", "\'", ":", "!", "|", "}", "#", " "]) | y <- [1, 0.98 .. -1], x <- [-2, -1.98 .. 0.5]]

-- replaced iterate with foldr, modified the snd.head part and a introduced a check to stop the magnitude from exploding
-- foldr(>>)(return())[putStrLn[let(a,b)=foldr(\_(u,w)->if(u^2+w^2<4)then(u^2-w^2+x,2*u*w+y)else(u,w))(0,0)[1..500]in snd.last$(filter(\(f,v)->f)$zip(map(a^2+b^2>)[0,0.01,0.025,0.05,0.1,0.5,1,4])['.','\'',':','!','|','}','#',' '])|x<-[-2,-1.98..0.5]]|y<-[1,0.98.. -1]]

-- without different characters in the output
-- foldr(>>)(return())[putStrLn[let(a,b)=foldr(\_(u,w)->(u^2-w^2+x,2*u*w+y))(0,0)[1..500]in if a^2+b^2<4 then '*' else ' '|x<-[-2,-1.98..0.5]]|y<-[1,0.98.. -1]]

-- using mapM_ instead of foldr, bind operator instead of list comprehension and replacing 'let' with a lambda function
 -- mapM_ putStrLn $[1,0.98.. -1]>>= \y->return $[-2,-1.98..0.5]>>= \x->return (if(\(a,b)->a^2+b^2<4)(foldr(\_(u,w)->(u^2-w^2+x,2*u*w+y))(0,0)[1..500]) then '*' else ' ')

-- open GHCI > Copy and paste any of above one-liners > Hit enter

A legible variant of the first of the "one-liner" contributions above:

main :: IO ()
main =
  putStrLn $
    concat
      [ go x y
        | y <- [1, 0.98 .. -1],
          x <- [-2, -1.98 .. 0.5]
      ]
  where
    go x y
      | x == (-2) = "\n"
      | otherwise =
        let (a, b) =
              iterate
                (\(x', y') -> (x' ^ 2 - y' ^ 2 + x, 2 * x' * y' + y))
                (0, 0)
                !! 500
         in ( snd . head . filter fst $
                zip
                  ( [ (< 0.01),
                      (< 0.025),
                      (< 0.05),
                      (< 0.1),
                      (< 0.5),
                      (< 1),
                      (< 4),
                      const True
                    ]
                      <*> [a ^ 2 + b ^ 2]
                  )
                  [".", "\'", ":", "!", "|", "}", "#", " "]
            )
Output:
                                                                                             #                               
                                                                                             ##                              
                                                                                             #                               
                                                                                          }}}}}}}                            
                                                                                        #}}}}}}}}                            
                                                                                         }}}}}}}}}                           
                                                                                         }}}}}}}}}                           
                                                                                         }}}}}}}}}#                          
                                                                                        }}}}}}}}}}                           
                                                                                         }}}}}}}}                            
                                                                                          }}}}}}}                            
                                                                                           |||}}                             
                                                                                      } |||||||||||                          
                                                                                 } |||||||||||||||||||   |                   
                                                                        . '      |||||||||||||||||||||||||                   
                                                                         ..'   ||||||||||||||||||||||||||||                  
                                                                        '... |||||||||||||||||||||||||||||||    '.':         
                                                                         '':|||||||||||||||||||||||||||||||||| :...'         
                                                                           ||||||||||||||||||||||||||||||||||||:'..'         
                                                                         |||||||||||||||||||||||||||||||||||||||:''          
                                                                       }|||||||||||||||||||||||||||||||||||||||||            
                                                                       |||||||||||||||||||||||||||||||||||||||||||           
                                                                   || ||||||||||||||||||||||||||||||||||||||||||||!          
                                                                   ||}|||||||||||||||||||||||||||||||||||||||||||||          
                                                                     |||||||||||||||||||||||||||||||||||||||||||||||         
                                                                    |||||||||||||||||||||||||||||||||||||||||||||||||        
                                                                   |||||||||||||||||||||||||||!!!!!|||||||||||||||||| :      
                                                                 |||||||||||||||||||||||||!!!!!!!!!!!!|||||||||||||||'.'     
                                                                  ||||||||||||||||||||||!!!!!!!!!!!!!!!!||||||||||||| .      
                                                                 .||||||||||||||||||||!!!!!!!!!!!!!!!!!!!!||||||||||||       
                                                 |              |||||||||||||||||||||!!!!!!!!!!!!!!!!!!!!!!|||||||||||       
                                          |      |               |||||||||||||||||||!!!!!!!!!!!!!!!!!!!!!!!!||||||||||       
                                         ||! .:::!!!!.         ||||||||||||||||||||!!!!!!!!!!!!!:::!!!!!!!!!||||||||||       
                                          !'::::::::!!!         ||||||||||||||||||!!!!!!!!!!!:::::::::!!!!!!!|||||||||||     
                                          ::::::::::::!!!|     |||||||||||||||||||!!!!!!!!!:::::::::::::!!!!!!||||||||       
                                        !::::::::::::::!!!!    ||||||||||||||||||!!!!!!!!!:::::::::::::::!!!!!||||||||       
                                      . ::::::''''::::::!!!    |||||||||||||||||!!!!!!!!!:::::::''''::::::!!!!||||||||       
                                       :::::'''''''''::::!!!   |||||||||||||||||!!!!!!!!::::::'''''''''::::!!!!||||||||      
                                      !::::''''''''''':::!!!  ||||||||||||||||||!!!!!!!::::::''''''''''':::!!!!||||||!       
                                      ::::''''''..''''':::!!! |||||||||||||||||!!!!!!!!:::::''''''..''''':::!!!||||||}       
                                      :::'''''......''':::!!! |||||||||||||||||!!!!!!!:::::'''''......''':::!!!||||||        
                                     ::::''''........'''::!!!||||||||||||||||||!!!!!!!:::::''''........'''::!!!|||||         
                                .... ::::'''..........''::!!!||||||||||||||||||!!!!!!!:::::'''..........''::!!||||||         
                               .....':::''''..........''::!!|||||||||||||||||||!!!!!!!::::''''..........''::!!||||           
          ##             |   ::.....':::''''..........''::!!|||||||||||||||||||!!!!!!!::::''''..........''::!!||             
                               .....':::''''..........''::!!|||||||||||||||||||!!!!!!!::::''''..........''::!!||||           
                                .... ::::'''..........''::!!!||||||||||||||||||!!!!!!!:::::'''..........''::!!||||||         
                                     ::::''''........'''::!!!||||||||||||||||||!!!!!!!:::::''''........'''::!!!|||||         
                                      :::'''''......''':::!!! |||||||||||||||||!!!!!!!:::::'''''......''':::!!!||||||        
                                      ::::''''''..''''':::!!! |||||||||||||||||!!!!!!!!:::::''''''..''''':::!!!||||||}       
                                      !::::''''''''''':::!!!  ||||||||||||||||||!!!!!!!::::::''''''''''':::!!!!||||||!       
                                       :::::'''''''''::::!!!   |||||||||||||||||!!!!!!!!::::::'''''''''::::!!!!||||||||      
                                      . ::::::''''::::::!!!    |||||||||||||||||!!!!!!!!!:::::::''''::::::!!!!||||||||       
                                        !::::::::::::::!!!!    ||||||||||||||||||!!!!!!!!!:::::::::::::::!!!!!||||||||       
                                          ::::::::::::!!!|     |||||||||||||||||||!!!!!!!!!:::::::::::::!!!!!!||||||||       
                                          !'::::::::!!!         ||||||||||||||||||!!!!!!!!!!!:::::::::!!!!!!!|||||||||||     
                                         ||! .:::!!!!.         ||||||||||||||||||||!!!!!!!!!!!!!:::!!!!!!!!!||||||||||       
                                          |      |               |||||||||||||||||||!!!!!!!!!!!!!!!!!!!!!!!!||||||||||       
                                                 |              |||||||||||||||||||||!!!!!!!!!!!!!!!!!!!!!!|||||||||||       
                                                                 .||||||||||||||||||||!!!!!!!!!!!!!!!!!!!!||||||||||||       
                                                                  ||||||||||||||||||||||!!!!!!!!!!!!!!!!||||||||||||| .      
                                                                 |||||||||||||||||||||||||!!!!!!!!!!!!|||||||||||||||'.'     
                                                                   |||||||||||||||||||||||||||!!!!||||||||||||||||||| :      
                                                                    |||||||||||||||||||||||||||||||||||||||||||||||||        
                                                                     |||||||||||||||||||||||||||||||||||||||||||||||         
                                                                   ||}|||||||||||||||||||||||||||||||||||||||||||||          
                                                                   || ||||||||||||||||||||||||||||||||||||||||||||!          
                                                                       |||||||||||||||||||||||||||||||||||||||||||           
                                                                       }|||||||||||||||||||||||||||||||||||||||||            
                                                                         |||||||||||||||||||||||||||||||||||||||:''          
                                                                           ||||||||||||||||||||||||||||||||||||:'..'         
                                                                         '':|||||||||||||||||||||||||||||||||| :...'         
                                                                        '... |||||||||||||||||||||||||||||||    '.':         
                                                                         ..'   ||||||||||||||||||||||||||||                  
                                                                        . '      |||||||||||||||||||||||||                   
                                                                                 } |||||||||||||||||||   |                   
                                                                                      } |||||||||||                          
                                                                                           |||}}                             
                                                                                          }}}}}}}                            
                                                                                         }}}}}}}}                            
                                                                                        }}}}}}}}}}                           
                                                                                         }}}}}}}}}#                          
                                                                                         }}}}}}}}}                           
                                                                                         }}}}}}}}}                           
                                                                                        #}}}}}}}}                            
                                                                                          }}}}}}}                            
                                                                                             #                               
                                                                                             ##                              
                                                                                             #  

and a legible variant of the last of the "one-liner" contributions above:

main :: IO ()
main =
  mapM_
    putStrLn
    $ [1, 0.98 .. -1]
      >>= \y ->
        [ [-2, -1.98 .. 0.5]
            >>= \x ->
              [ if (\(a, b) -> a ^ 2 + b ^ 2 < 4)
                  ( foldr
                      ( \_ (u, w) ->
                          (u ^ 2 - w ^ 2 + x, 2 * u * w + y)
                      )
                      (0, 0)
                      [1 .. 500]
                  )
                  then '*'
                  else ' '
              ]
        ]

Haxe[edit]

This version compiles for flash version 9 or greater. The compilation command is

haxe -swf mandelbrot.swf -main Mandelbrot
class Mandelbrot extends flash.display.Sprite
{
    inline static var MAX_ITER = 255;

    public static function main() {
        var w = flash.Lib.current.stage.stageWidth;
        var h = flash.Lib.current.stage.stageHeight;
        var mandelbrot = new Mandelbrot(w, h);
        flash.Lib.current.stage.addChild(mandelbrot);
        mandelbrot.drawMandelbrot();
    }

    var image:flash.display.BitmapData;
    public function new(width, height) {
        super();
        var bitmap:flash.display.Bitmap;
        image = new flash.display.BitmapData(width, height, false);
        bitmap = new flash.display.Bitmap(image);
        this.addChild(bitmap);
    }

    public function drawMandelbrot() {
        image.lock();
        var step_x = 3.0 / (image.width-1);
        var step_y = 2.0 / (image.height-1);
        for (i in 0...image.height) {
            var ci = i * step_y - 1.0;
            for (j in 0...image.width) {
                var k = 0;
                var zr = 0.0;
                var zi = 0.0;
                var cr = j * step_x - 2.0;
                while (k <= MAX_ITER && (zr*zr + zi*zi) <= 4) {
                    var temp = zr*zr - zi*zi + cr;
                    zi = 2*zr*zi + ci;
                    zr = temp;
                    k ++;
                }
                paint(j, i, k);
            }
        }
        image.unlock();
    }

    inline function paint(x, y, iter) {
        var color = iter > MAX_ITER? 0 : iter * 0x100;
        image.setPixel(x, y, color);
    }
}

Huginn[edit]

#! /bin/sh
exec huginn -E "${0}" "${@}"
#! huginn

import Algorithms as algo;
import Mathematics as math;
import Terminal as term;

mandelbrot( x, y ) {
  c = math.Complex( x, y );
  z = math.Complex( 0., 0. );
  s = -1;
  for ( i : algo.range( 50 ) ) {
    z = z * z + c;
    if ( | z | > 2. ) {
      s = i;
      break;
    }
  }
  return ( s );
}

main( argv_ ) {
  imgSize = term_size( argv_ );
  yRad = 1.2;
  yScale = 2. * yRad / real( imgSize[0] );
  xScale = 3.3 / real( imgSize[1] );
  glyphTab = [ ".", ":", "-", "+", "+" ].resize( 12, "*" ).resize( 26, "%" ).resize( 50, "@" ).push( " " );
  for ( y : algo.range( imgSize[0] ) ) {
    line = "";
    for ( x : algo.range( imgSize[1] ) ) {
      line += glyphTab[ mandelbrot( xScale * real( x ) - 2.3, yScale * real( y ) - yRad ) ];
    }
    print( line + "\n" );
  }
  return ( 0 );
}

term_size( argv_ ) {
  lines = 25;
  columns = 80;
  if ( size( argv_ ) == 3 ) {
    lines = integer( argv_[1] );
    columns = integer( argv_[2] );
  } else {
    lines = term.lines();
    columns = term.columns();
    if ( ( lines % 2 ) == 0 ) {
      lines -= 1;
    }
  }
  lines -= 1;
  columns -= 1;
  return ( ( lines, columns ) );
}
Output:

........................:::::::::::::::::::------------------------------------------------------::::::::::::::::::::::::::::::::::::
......................::::::::::::::::------------------------------------++++++++++++++++++++---------::::::::::::::::::::::::::::::
....................:::::::::::::-----------------------------------+++++++++++++*******+++++++++++--------::::::::::::::::::::::::::
...................:::::::::::----------------------------------++++++++++++++++****%%******++++++++++---------::::::::::::::::::::::
.................:::::::::----------------------------------++++++++++++++++++++******% %****++++++++++++---------:::::::::::::::::::
................::::::::---------------------------------+++++++++++++++++++++******%%%%%*****+++++++++++++----------::::::::::::::::
...............::::::---------------------------------++++++++++++++++++++*****%%%%%   @%%%@***++++++++++++++----------::::::::::::::
..............:::::--------------------------------++++++++++++++++++***********@%        @%******+++++++++++++-----------:::::::::::
.............::::-------------------------------+++++++++++++++++****************@        %%***************+++++------------:::::::::
............:::------------------------------+++++++++++++++++****@%%%****%@@%@% %%@    @%%%% %*% ********%**++++------------::::::::
...........:::----------------------------+++++++++++++++++********%   @%@@                      %%%**%@%%@@**+++++------------::::::
..........:::-------------------------+++++++++++++++++++**********%                                @    %%***++++++------------:::::
..........:----------------------+++++++++++++++++++++*********%%%%                                    %%******++++++------------::::
.........:-----------------++++++++****************************                                           %*****+++++-------------:::
.........----------+++++++++++++++****%********%%*********** @%%                                          % %%**++++++-------------::
........:------++++++++++++++++++*******%@@%%**%% %%%*******%%                                             %%***+++++++-------------:
........---+++++++++++++++++++++********%@           @%%%**%                                               %%***+++++++-------------:
.......:-+++++++++++++++++++++*******%%%%                @%%                                               @****++++++++-------------
.......-+++++++++++++***********%**@*%@                    %                                               %***+++++++++-------------
.......++++++*******************%%    @                                                                  %*****+++++++++-------------
.......                                                                                               %%******++++++++++-------------
.......++++++*******************%%    @                                                                  %*****+++++++++-------------
.......-+++++++++++++***********%**@*%@                    %                                               %***+++++++++-------------
.......:-+++++++++++++++++++++*******%%%%                @%%                                               @****++++++++-------------
........---+++++++++++++++++++++********%@           @%%%**%                                               %%***+++++++-------------:
........:------++++++++++++++++++*******%@@%%**%% %%%*******%%                                             %%***+++++++-------------:
.........----------+++++++++++++++****%********%%*********** @%%                                          % %%**++++++-------------::
.........:-----------------++++++++****************************                                           %*****+++++-------------:::
..........:----------------------+++++++++++++++++++++*********%%%%                                    %%******++++++------------::::
..........:::-------------------------+++++++++++++++++++**********%                                @    %%***++++++------------:::::
...........:::----------------------------+++++++++++++++++********%   @%@@                      %%%**%@%%@@**+++++------------::::::
............:::------------------------------+++++++++++++++++****@%%%****%@@%@% %%@    @%%%% %*% ********%**++++------------::::::::
.............::::-------------------------------+++++++++++++++++****************@        %%***************+++++------------:::::::::
..............:::::--------------------------------++++++++++++++++++***********@%        @%******+++++++++++++-----------:::::::::::
...............::::::---------------------------------++++++++++++++++++++*****%%%%%   @%%%@***++++++++++++++----------::::::::::::::
................::::::::---------------------------------+++++++++++++++++++++******%%%%%*****+++++++++++++----------::::::::::::::::
.................:::::::::----------------------------------++++++++++++++++++++******% %****++++++++++++---------:::::::::::::::::::
...................:::::::::::----------------------------------++++++++++++++++****%%******++++++++++---------::::::::::::::::::::::
....................:::::::::::::-----------------------------------+++++++++++++*******+++++++++++--------::::::::::::::::::::::::::
......................::::::::::::::::------------------------------------++++++++++++++++++++---------::::::::::::::::::::::::::::::

Icon and Unicon[edit]

link graphics

procedure main()
    width := 750
    height := 600
    limit := 100
    WOpen("size="||width||","||height)
    every x:=1 to width & y:=1 to height do
    {
        z:=complex(0,0)
        c:=complex(2.5*x/width-2.0,(2.0*y/height-1.0))
        j:=0
        while j<limit & cAbs(z)<2.0 do
        {
           z := cAdd(cMul(z,z),c)
           j+:= 1
        }
        Fg(mColor(j,limit))
        DrawPoint(x,y)
    }
    WriteImage("./mandelbrot.gif")
    WDone()
end

procedure mColor(x,limit)
   max_color := 2^16-1
   color := integer(max_color*(real(x)/limit))

   return(if x=limit
          then "black"
          else color||","||color||",0")
end

record complex(r,i)

procedure cAdd(x,y)
    return complex(x.r+y.r,x.i+y.i)
end

procedure cMul(x,y)
    return complex(x.r*y.r-x.i*y.i,x.r*y.i+x.i*y.r)
end

procedure cAbs(x)
    return sqrt(x.r*x.r+x.i*x.i)
end

graphics is required


This example is in need of improvement:
The example is correct; however, Unicon implemented additional graphical features and a better example may be possible.

IDL[edit]

IDL - Interactive Data Language (free implementation: GDL - GNU Data Language http://gnudatalanguage.sourceforge.net)

PRO Mandelbrot,xRange,yRange,xPixels,yPixels,iterations

xPixelstartVec = Lindgen( xPixels) * Float(xRange[1]-xRange[0]) / $
                 xPixels + xRange[0]
yPixelstartVec = Lindgen( yPixels) * Float(YRANGE[1]-yrange[0])$
                 / yPixels + yRange[0]

constArr = Complex( Rebin( xPixelstartVec, xPixels, yPixels),$
                     Rebin( Transpose(yPixelstartVec), xPixels, yPixels))

valArr = ComplexArr( xPixels, yPixels)

res = IntArr( xPixels, yPixels)

oriIndex = Lindgen( Long(xPixels) * yPixels)

FOR i = 0, iterations-1 DO BEGIN ; only one loop needed

    ; calculation for whole array at once
    valArr = valArr^2 - constArr

    whereIn = Where( Abs( valArr) LE 4.0d, COMPLEMENT=whereOut)

    IF whereIn[0] EQ -1 THEN BREAK

    valArr = valArr[ whereIn]

    constArr = constArr[ whereIn]

    IF whereOut[0] NE -1 THEN BEGIN

        res[ oriIndex[ whereOut]] = i+1

        oriIndex = oriIndex[ whereIn]
    ENDIF
ENDFOR

tv,res ; open a window and show the result

END


Mandelbrot,[-1.,2.3],[-1.3,1.3],640,512,200

END

from the command line:

GDL>.run mandelbrot

or

GDL> Mandelbrot,[-1.,2.3],[-1.3,1.3],640,512,200

Inform 7[edit]

"Mandelbrot"

The story headline is "A Non-Interactive Set".

Include Glimmr Drawing Commands by Erik Temple.

[Q20 fixed-point or floating-point: see definitions below]
Use floating-point math.

Finished is a room.

The graphics-window is a graphics g-window spawned by the main-window.
The position is g-placeabove.

When play begins:
	let f10 be 10 as float;
	now min re is ( -20 as float ) fdiv f10;
	now max re is ( 6 as float ) fdiv f10;
	now min im is ( -12 as float ) fdiv f10;
	now max im is ( 12 as float ) fdiv f10;
	now max iterations is 100;
	add color g-Black to the palette;
	add color g-Red to the palette;
	add hex "#FFA500" to the palette;
	add color g-Yellow to the palette;
	add color g-Green to the palette;
	add color g-Blue to the palette;
	add hex "#4B0082" to the palette;
	add hex "#EE82EE" to the palette;
	open up the graphics-window.

Min Re is a number that varies.
Max Re is a number that varies.
Min Im is a number that varies.
Max Im is a number that varies.

Max Iterations is a number that varies.

Min X is a number that varies.
Max X is a number that varies.
Min Y is a number that varies.
Max Y is a number that varies.

The palette is a list of numbers that varies.

[vertically mirrored version]
Window-drawing rule for the graphics-window when max im is fneg min im:
	clear the graphics-window;
	let point be { 0, 0 };
	now min X is 0 as float;
	now min Y is 0 as float;
	let mX be the width of the graphics-window minus 1;
	let mY be the height of the graphics-window minus 1;
	now max X is mX as float;
	now max Y is mY as float;
	let L be the column order with max mX;
	repeat with X running through L:
		now entry 1 in point is X;
		repeat with Y running from 0 to mY / 2:
			now entry 2 in point is Y;
			let the scaled point be the complex number corresponding to the point;
			let V be the Mandelbrot result for the scaled point;
			let C be the color corresponding to V;
			if C is 0, next;
			draw a rectangle (C) in the graphics-window at the point with size 1 by 1;
			now entry 2 in point is mY - Y;
			draw a rectangle (C) in the graphics-window at the point with size 1 by 1;
		yield to VM;
	rule succeeds.

[slower non-mirrored version]
Window-drawing rule for the graphics-window:
	clear the graphics-window;
	let point be { 0, 0 };
	now min X is 0 as float;
	now min Y is 0 as float;
	let mX be the width of the graphics-window minus 1;
	let mY be the height of the graphics-window minus 1;
	now max X is mX as float;
	now max Y is mY as float;
	let L be the column order with max mX;
	repeat with X running through L:
		now entry 1 in point is X;
		repeat with Y running from 0 to mY:
			now entry 2 in point is Y;
			let the scaled point be the complex number corresponding to the point;
			let V be the Mandelbrot result for the scaled point;
			let C be the color corresponding to V;
			if C is 0, next;
			draw a rectangle (C) in the graphics-window at the point with size 1 by 1;
		yield to VM;
	rule succeeds.

To decide which list of numbers is column order with max (N - number):
	let L be a list of numbers;
	let L2 be a list of numbers;
	let D be 64;
	let rev be false;
	while D > 0:
		let X be 0;
		truncate L2 to 0 entries;
		while X <= N:
			if D is 64 or X / D is odd, add X to L2;
			increase X by D;
		if rev is true:
			reverse L2;
			let rev be false;
		otherwise:
			let rev be true;
		add L2 to L;
		let D be D / 2;
	decide on L.

To decide which list of numbers is complex number corresponding to (P - list of numbers):
	let R be a list of numbers;
	extend R to 2 entries;
	let X be entry 1 in P as float;
	let X be (max re fsub min re) fmul (X fdiv max X);
	let X be X fadd min re;
	let Y be entry 2 in P as float;
	let Y be (max im fsub min im) fmul (Y fdiv max Y);
	let Y be Y fadd min im;
	now entry 1 in R is X;
	now entry 2 in R is Y;
	decide on R.

To decide which number is Mandelbrot result for (P - list of numbers):
	let c_re be entry 1 in P;
	let c_im be entry 2 in P;
	let z_re be 0 as float;
	let z_im be z_re;
	let threshold be 4 as float;
	let runs be 0;
	while 1 is 1:
		[ z = z * z ]
		let r2 be z_re fmul z_re;
		let i2 be z_im fmul z_im;
		let ri be z_re fmul z_im;
		let z_re be r2 fsub i2;
		let z_im be ri fadd ri;
		[ z = z + c ]
		let z_re be z_re fadd c_re;
		let z_im be z_im fadd c_im;
		let norm be (z_re fmul z_re) fadd (z_im fmul z_im);
		increase runs by 1;
		if norm is greater than threshold, decide on runs;
		if runs is max iterations, decide on 0.

To decide which number is color corresponding to (V - number):
	let L be the number of entries in the palette;
	let N be the remainder after dividing V by L;
	decide on entry (N + 1) in the palette.

Section - Fractional numbers (for Glulx only)

To decide which number is (N - number) as float: (- (numtof({N})) -).
To decide which number is (N - number) fadd (M - number): (- (fadd({N}, {M})) -).
To decide which number is (N - number) fsub (M - number): (- (fsub({N}, {M})) -).
To decide which number is (N - number) fmul (M - number): (- (fmul({N}, {M})) -).
To decide which number is (N - number) fdiv (M - number): (- (fdiv({N}, {M})) -).
To decide which number is fneg (N - number): (- (fneg({N})) -).
To yield to VM: (- glk_select_poll(gg_event); -).

Use Q20 fixed-point math translates as (- Constant Q20_MATH; -).
Use floating-point math translates as (- Constant FLOAT_MATH; -).

Include (-
#ifdef Q20_MATH;
! Q11.20 format: 1 sign bit, 11 integer bits, 20 fraction bits
[ numtof n r; @shiftl n 20 r; return r; ];
[ fadd n m; return n+m; ];
[ fsub n m; return n-m; ];
[ fmul n m; n = n + $$1000000000; @sshiftr n 10 n; m = m + $$1000000000; @sshiftr m 10 m; return n * m; ]; 
[ fdiv n m; @sshiftr m 20 m; return n / m; ];
[ fneg n; return -n; ];
#endif;

#ifdef FLOAT_MATH;
[ numtof f; @"S2:400" f f; return f; ];
[ fadd n m; @"S3:416" n m n; return n; ];
[ fsub n m; @"S3:417" n m n; return n; ];
[ fmul n m; @"S3:418" n m n; return n; ];
[ fdiv n m; @"S3:419" n m n; return n; ];
[ fneg n; @bitxor n $80000000 n; return n; ];
#endif;
-).

Newer Glulx interpreters provide 32-bit floating-point operations, but this solution also supports fixed-point math which is more widely supported and accurate enough for a zoomed-out view. Inform 6 inclusions are used for the low-level math functions in either case. The rendering process is extremely slow, since the graphics system is not optimized for pixel-by-pixel drawing, so this solution includes an optimization for vertical symmetry (as in the default view) and also includes extra logic to draw the lines in a more immediately useful order.

Mandelbrot-Inform7.png

J[edit]

The characteristic function of the Mandelbrot can be defined as follows:

mcf=. (<: 2:)@|@(] ((*:@] + [)^:((<: 2:)@|@])^:1000) 0:) NB. 1000 iterations test

The Mandelbrot set can be drawn as follows:

domain=. |.@|:@({.@[ + ] *~ j./&i.&>/@+.@(1j1 + ] %~ -~/@[))&>/

load 'viewmat'
viewmat mcf "0 @ domain (_2j_1 1j1) ; 0.01 NB. Complex interval and resolution

A smaller version, based on a black&white implementation of viewmat (and paraphrased, from html markup to wiki markup), is shown here (The output is HTML-heavy and was split out to make editing this page easier):

   viewmat mcf "0 @ domain (_2j_1 1j1) ; 0.1 NB. Complex interval and resolution

Java[edit]

Library: Swing
Library: AWT
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;

public class Mandelbrot extends JFrame {

    private final int MAX_ITER = 570;
    private final double ZOOM = 150;
    private BufferedImage I;
    private double zx, zy, cX, cY, tmp;

    public Mandelbrot() {
        super("Mandelbrot Set");
        setBounds(100, 100, 800, 600);
        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        I = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
        for (int y = 0; y < getHeight(); y++) {
            for (int x = 0; x < getWidth(); x++) {
                zx = zy = 0;
                cX = (x - 400) / ZOOM;
                cY = (y - 300) / ZOOM;
                int iter = MAX_ITER;
                while (zx * zx + zy * zy < 4 && iter > 0) {
                    tmp = zx * zx - zy * zy + cX;
                    zy = 2.0 * zx * zy + cY;
                    zx = tmp;
                    iter--;
                }
                I.setRGB(x, y, iter | (iter << 8));
            }
        }
    }

    @Override
    public void paint(Graphics g) {
        g.drawImage(I, 0, 0, this);
    }

    public static void main(String[] args) {
        new Mandelbrot().setVisible(true);
    }
}

Interactive[edit]

Library: AWT
Library: Swing
import static java.awt.Color.HSBtoRGB;
import static java.awt.Color.black;
import static java.awt.event.KeyEvent.VK_BACK_SLASH;
import static java.awt.event.KeyEvent.VK_ESCAPE;
import static java.awt.image.BufferedImage.TYPE_INT_RGB;
import static java.lang.Integer.signum;
import static java.lang.Math.abs;
import static java.lang.Math.max;
import static java.lang.Math.min;
import static java.lang.System.currentTimeMillis;
import static java.util.Locale.ROOT;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.util.function.Consumer;
import java.util.function.Predicate;

import javax.swing.JFrame;

/* 
 *      click: point to center
 * ctrl-click: point to origin
 *       drag: point to mouse release point
 *  ctrl-drag: point to origin + zoom
 * back-slash: back to previous point      
 *        esc: back to previous zoom point - zoom     
 */

public class Mandelbrot extends JFrame {
	private static final long serialVersionUID = 1L;
	
	private Insets insets;
	private int width, height;
	private double widthHeightRatio;
	private int minX, minY;
	private double Zoom;
		
	private int mpX, mpY, mdX, mdY;
	private boolean isCtrlDown, ctrl;
	private Stack stack = new Stack();
	
	private BufferedImage image;
	private boolean newImage = true;
	
	public static void main(String[] args) {
		new Mandelbrot(800, 600); // (800, 600), (1024, 768), (1600, 900), (1920, 1080)
		//new Mandelbrot(800, 600, 4.5876514379235943e-09, -0.6092161175392330, -0.4525577210859453);
		//new Mandelbrot(800, 600, 5.9512354925205320e-10, -0.6092146769531246, -0.4525564820098262);
		//new Mandelbrot(800, 600, 6.7178527589983420e-08, -0.7819036465400592, -0.1298363433443265);
		//new Mandelbrot(800, 600, 4.9716091454775210e-09, -0.7818800036717134, -0.1298044093748981);
		//new Mandelbrot(800, 600, 7.9333341281639390e-06, -0.7238770725243187, -0.2321214232559487); 
		/*
		new Mandelbrot(800, 600, new double[][] {
			{5.0000000000000000e-03, -2.6100000000000000, -1.4350000000000000}, // done!
			{3.5894206549118390e-04, -0.7397795969773300, -0.4996473551637279}, // done!
			{3.3905106941862460e-05, -0.6270410477828043, -0.4587021918164572}, // done!
			{6.0636337351945460e-06, -0.6101531446039512, -0.4522561221394852}, // done!
			{1.5502741161769430e-06, -0.6077214060084073, -0.4503995886987711}, // done!
		});
		//*/
	}
	
	public Mandelbrot(int width, int height) {
		this(width, height, .005, -2.61, -1.435);
	}
	
	public Mandelbrot(int width, int height, double Zoom, double r, double i) {
		this(width, height, new double[] {Zoom, r, i});
	}
	
	public Mandelbrot(int width, int height, double[] ... points) {
		super("Mandelbrot Set");
		setResizable(false);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		Dimension screen = getToolkit().getScreenSize();
		setBounds(
			rint((screen.getWidth() - width) / 2),
			rint((screen.getHeight() - height) / 2),
			width,
			height
		);
		addMouseListener(mouseAdapter);
		addMouseMotionListener(mouseAdapter);
		addKeyListener(keyAdapter);
		Point point = stack.push(points);
		this.Zoom = point.Zoom;
		this.minX = point.minX;
		this.minY = point.minY;
		setVisible(true);
		insets = getInsets();
		this.width = width -= insets.left + insets.right;
		this.height = height -= insets.top + insets.bottom;
		widthHeightRatio = (double) width / height;
	}
	
	private int rint(double d) {
		return (int) Math.rint(d); // half even
	}

	private void repaint(boolean newImage) {
		this.newImage = newImage;
		repaint();
	}

	private MouseAdapter mouseAdapter = new MouseAdapter() {
		public void mouseClicked(MouseEvent e) {
			stack.push(false);
			if (!ctrl) {
				minX -= width / 2 ;
				minY -= height / 2;
			}
			minX += e.getX() - insets.left;
			minY += e.getY() - insets.top;
			ctrl = false;
			repaint(true);
	 	}
		public void mousePressed(MouseEvent e) {
			mpX = e.getX();
			mpY = e.getY();
			ctrl = isCtrlDown;
		}
		public void mouseDragged(MouseEvent e) {
			if (!ctrl) return;
			setMdCoord(e);
			repaint();
		}
		private void setMdCoord(MouseEvent e) {
			int dx = e.getX() - mpX;
			int dy = e.getY() - mpY;
			mdX = mpX + max(abs(dx), rint(abs(dy) * widthHeightRatio) * signum(dx));
			mdY = mpY + max(abs(dy), rint(abs(dx) / widthHeightRatio) * signum(dy));
			acceptIf(insets.left, ge(mdX), setMdXY); 
			acceptIf(insets.top,  ge(mdY), setMdYX);
			acceptIf(insets.left+width-1, le(mdX), setMdXY); 
			acceptIf(insets.top+height-1, le(mdY), setMdYX);
		}
		private void acceptIf(int value, Predicate<Integer> p, Consumer<Integer> c) { if (p.test(value)) c.accept(value); }
		private Predicate<Integer> ge(int md) { return v-> v >= md; }
		private Predicate<Integer> le(int md) { return v-> v <= md; }
		private Consumer<Integer> setMdXY = v-> mdY = mpY + rint(abs((mdX=v)-mpX) / widthHeightRatio) * signum(mdY-mpY);
		private Consumer<Integer> setMdYX = v-> mdX = mpX + rint(abs((mdY=v)-mpY) * widthHeightRatio) * signum(mdX-mpX);
		public void mouseReleased(MouseEvent e) {
			if (e.getX() == mpX && e.getY() == mpY) return; 
			stack.push(ctrl);
			if (!ctrl) {
				minX += mpX - (mdX = e.getX());
				minY += mpY - (mdY = e.getY());
			}
			else {
				setMdCoord(e);
				if (mdX < mpX) { int t=mpX; mpX=mdX; mdX=t; } 
				if (mdY < mpY) { int t=mpY; mpY=mdY; mdY=t; } 
				minX += mpX - insets.left;
				minY += mpY - insets.top;
				double rZoom = (double) width / abs(mdX - mpX);
				minX *= rZoom;
				minY *= rZoom;
				Zoom /= rZoom;
			}
			ctrl = false;
			repaint(true);		
		}
	};
	
	private KeyAdapter keyAdapter = new KeyAdapter() {
		public void keyPressed(KeyEvent e) {
			isCtrlDown = e.isControlDown();
		}
		public void keyReleased(KeyEvent e) {
			isCtrlDown = e.isControlDown();
		}
		public void keyTyped(KeyEvent e) {
			char c = e.getKeyChar();
			boolean isEsc = c == VK_ESCAPE;
			if (!isEsc && c != VK_BACK_SLASH) return;
			repaint(stack.pop(isEsc));
		}
	};
	
	private class Point {
		public boolean type;
		public double Zoom;
		public int minX;
		public int minY;
		Point(boolean type, double Zoom, int minX, int minY) {
			this.type = type;
			this.Zoom = Zoom;
			this.minX = minX;
			this.minY = minY;
		}
	}
	private class Stack extends java.util.Stack<Point> {
		private static final long serialVersionUID = 1L;
		public Point push(boolean type) {
			return push(type, Zoom, minX, minY);
		}
		public Point push(boolean type, double ... point) {
			double Zoom = point[0];
			return push(type, Zoom, rint(point[1]/Zoom), rint(point[2]/Zoom));
		}
		public Point push(boolean type, double Zoom, int minX, int minY) {
			return push(new Point(type, Zoom, minX, minY));
		}
		public Point push(double[] ... points) {
			Point lastPoint = push(false, points[0]);
			for (int i=0, e=points.length-1; i<e; i+=1) {
				double[] point = points[i];
				lastPoint = push(point[0] != points[i+1][0], point);
				done(printPoint(lastPoint));
			}
			return lastPoint;
		}
		public boolean pop(boolean type) {
			for (;;) {
				if (empty()) return false;
				Point d = super.pop();
				Zoom = d.Zoom;
				minX = d.minX;
				minY = d.minY;
				if (!type || d.type) return true;
			}
		}
	}
	
	@Override
	public void paint(Graphics g) {
		if (newImage) newImage();
		g.drawImage(image, insets.left, insets.top, this);
		//g.drawLine(insets.left+width/2, insets.top+0,        insets.left+width/2, insets.top+height);
		//g.drawLine(insets.left+0,       insets.top+height/2, insets.left+width,   insets.top+height/2);
		if (!ctrl) return;
		g.drawRect(min(mpX, mdX), min(mpY, mdY), abs(mpX - mdX), abs(mpY - mdY));
	}

	private void newImage() {
		long milli = printPoint();
		image = new BufferedImage(width, height, TYPE_INT_RGB);
		int maxX = minX + width;
		int maxY = minY + height;
		for (int x = minX; x < maxX; x+=1) {
			double r = x * Zoom;
			for (int y = minY; y < maxY; y+=1) {
				double i = y * Zoom;
				//System.out.printf("%+f%+fi\n", r, i);
				//             0f    1/6f  1/3f 1/2f 2/3f    5/6f
				//straight -> red  yellow green cian blue magenta <- reverse 
				image.setRGB(x-minX, y-minY, color(r, i, 360, false, 2/3f));
			}
		}
		newImage = false;
		done(milli);
	}

	private long printPoint() {
		return printPoint(Zoom, minX, minY);
	}
	private long printPoint(Point point) {
		return printPoint(point.Zoom, point.minX, point.minY);
	}
	private long printPoint(double Zoom, int minX, int minY) {
		return printPoint(Zoom, minX*Zoom, minY*Zoom);
	}
	private long printPoint(Object ... point) {
		System.out.printf(ROOT,	"{%.16e, %.16g, %.16g},", point);
		return currentTimeMillis();
	}
	
	private void done(long milli) {
		milli = currentTimeMillis() - milli;
		System.out.println(" // " + milli + "ms done!");
	}

	private int color(double r0, double i0, int max, boolean straight, float shift) {
		int n = -1;
		double r=0, i=0, r2=0, i2=0;
		do {
			i = r*(i+i) + i0;
			r = r2-i2 + r0;
			r2 = r*r;
			i2 = i*i;
		}
		while (++n < max && r2 + i2 < 4); 
		return n == max
			? black.getRGB()
			: HSBtoRGB(shift + (float) (straight ? n : max-n) / max * 11/12f + (straight ? 0f : 1/12f), 1, 1)
		;		
	}
}

JavaScript[edit]

Works with: Firefox version 3.5.11

This needs the canvas tag of HTML 5 (it will not run on IE8 and lower or old browsers).

The code can be run directly from the Javascript console in modern browsers by copying and pasting it.

function mandelIter(cx, cy, maxIter) {
  var x = 0.0;
  var y = 0.0;
  var xx = 0;
  var yy = 0;
  var xy = 0;

  var i = maxIter;
  while (i-- && xx + yy <= 4) {
    xy = x * y;
    xx = x * x;
    yy = y * y;
    x = xx - yy + cx;
    y = xy + xy + cy;
  }
  return maxIter - i;
}

function mandelbrot(canvas, xmin, xmax, ymin, ymax, iterations) {
  var width = canvas.width;
  var height = canvas.height;

  var ctx = canvas.getContext('2d');
  var img = ctx.getImageData(0, 0, width, height);
  var pix = img.data;
  
  for (var ix = 0; ix < width; ++ix) {
    for (var iy = 0; iy < height; ++iy) {
      var x = xmin + (xmax - xmin) * ix / (width - 1);
      var y = ymin + (ymax - ymin) * iy / (height - 1);
      var i = mandelIter(x, y, iterations);
      var ppos = 4 * (width * iy + ix);
      
      if (i > iterations) {
        pix[ppos] = 0;
        pix[ppos + 1] = 0;
        pix[ppos + 2] = 0;
      } else {
        var c = 3 * Math.log(i) / Math.log(iterations - 1.0);
        
        if (c < 1) {
          pix[ppos] = 255 * c;
          pix[ppos + 1] = 0;
          pix[ppos + 2] = 0;
        }
        else if ( c < 2 ) {
          pix[ppos] = 255;
          pix[ppos + 1] = 255 * (c - 1);
          pix[ppos + 2] = 0;
        } else {
          pix[ppos] = 255;
          pix[ppos + 1] = 255;
          pix[ppos + 2] = 255 * (c - 2);
        }
      }
      pix[ppos + 3] = 255;
    }
  }
  
  ctx.putImageData(img, 0, 0);
}

var canvas = document.createElement('canvas');
canvas.width = 900;
canvas.height = 600;

document.body.insertBefore(canvas, document.body.childNodes[0]);

mandelbrot(canvas, -2, 1, -1, 1, 1000);
Output:
with default parameters

Mandelbrot-Javascript.png

ES6/WebAssembly[edit]

With ES6 and WebAssembly, the program can run faster. Of course, this requires a compiled WASM file, but one can easily build one for instance with the WebAssembly explorer

var mandelIter;
fetch("./mandelIter.wasm")
    .then(res