Fractals
Table of contents
- Complex dynamics
  
  - Mandelbrot set, Julia sets
  
 - Newton fractals
  
 
 - L-systems
  
  - Koch snowflake
  
 
 
Complex dynamics
Mandelbrot set, Julia sets
use graphics: canvas, sleep
function fractal(f,z0,argm={})
   {w=720, h=480, n=40, p=0, r=2} = argm
   cv = canvas(w,h)
   for y in h
      for x in w
         c = p+r/h*((2*x-w)-(2*y-h)*1i)
         z = z0(c)
         for k in n
            z = f(z,c)
            if abs(z)>2
               cv.hsl(0,0,1-k/n)
               cv.fill(x,y,1,1)
               break
            end
         end
      end
      cv.flush()
   end
   while cv.key()!="q"
      sleep(0.1)
   end
end
# Mandelbrot set
fractal(|z,c| z^2+c, |c| 0)
# Julia set of f(z) = z^2-0.6+0.5i
fractal(|z,c| z^2-0.6+0.5i, |c| c, n=80)
Newton fractals
use graphics: canvas, sleep
use math: tanh
use math.na: diffh
use cmath: arg
function basin_fractal(f,z0,argm={})
   {w=720, h=480, n=100, dim=10, p=0, r=2} = argm
   cv = canvas(w,h)
   for y in h
      for x in w
         c = p+r/h*((2*x-w)-(2*y-h)*1i)
         z = z0(c)
         for k in n
            zp = z
            z = f(z,c) 
            if abs(z-zp)<0.01
               cv.hsl(arg(z),0.2,1-tanh(k/dim)^2)
               break
            end
         end
         cv.fill(x,y,1,1)
      end
      cv.flush()
   end
   while cv.key()!="q"
     sleep(0.1)
   end
end
function newton(f,argm={})
   diff = diffh(h=0.001)
   basin_fractal(|z,c| z-f(z)/diff(f,z), |c| c, argm)
end
newton(|z| z^3-1)
L-systems
Koch snowflake
use plotlib: system
use math.la: vector, matrix
use math: pi, sin, cos, sqrt
rot = |phi| matrix(
   [cos(phi),-sin(phi)],
   [sin(phi), cos(phi)]
)
deg = pi/180
R60 = rot(60*deg)
Rm60 = rot(-60*deg)
Rm120 = rot(-120*deg)
function snowflake_rec(s,p,v,n)
   if n==0
      s.line(p,p+v)
   else
      snowflake_rec(s,p,v/3,n-1)
      snowflake_rec(s,p+v/3,R60*(v/3),n-1)
      snowflake_rec(s,p+v/3+R60*(v/3),Rm60*(v/3),n-1)
      snowflake_rec(s,p+2/3*v,v/3,n-1)
   end
end
function snowflake(s,p,scale,n)
   v = scale*vector(1,0)
   p = p-sqrt(3)/3*rot(-30*deg)*v
   for k in 3
      snowflake_rec(s,p,v,n)
      p = p+v
      v = Rm120*v
   end
end
s = system(w=400,h=400,grid=false)
s.rgb(0,0,0)
snowflake(s,vector(0,0),16,4)
s.idle()