! --------                                                    --------
! --------          F R A C T A L   E X A M P L E             --------
! --------                                                    --------
! --------                                                    --------
! --------                                                    --------
! --------                                                    --------
! --------                                                    --------

DECLARE FUNCTION Mandelbrot
SET MODE "HIGH4"
ASK PIXELS XPixels, YPixels
SET BACK "BLACK"

! -------- Scale screen --------
LET XLeft   = -0.18
LET XRight  = -0.14
LET YBottom =  1.02
LET YTop    =  1.05
LET dx = (XRight-XLeft)/(XPixels-1)
LET dy = (YTop-YBottom)/(YPixels-1)
SET WINDOW XLeft, XRight, YBottom, YTop
CLEAR

! -------- Define accuracy --------
LET MaxI = 500

! -------- Build fractal --------
FOR Y = YBottom TO YTop+dy/2 STEP dy
   FOR X = XLeft TO XRight+dx/2 STEP dx

      CALL SelectColor(Mandelbrot(X, Y, MaxI))
      PLOT X,Y

   NEXT X
NEXT Y

END


FUNCTION Mandelbrot(Real, Imag, MaxI)

   LIBRARY "{MathToolkit}CMPLXLIB*"
   DECLARE FUNCTION COMP$, CPROD$, CSUM$, CABS

   LET MaxR = 4
   LET C$ = COMP$(Real, Imag)
   LET Z$ = COMP$(0, 0)

   DO WHILE R < MaxR AND K < MaxI
      LET Z$ = CSUM$(CPROD$(Z$,Z$),C$)
      LET R = CABS(Z$)
      LET K = K + 1
   LOOP

LET Mandelbrot = K

END FUNCTION


SUB SelectColor(K)

   SELECT CASE K
      CASE 0,2,4,6,8,10,12,14,16,18
         SET COLOR "RED"
      CASE 1,3,5,7,9,11,13,15,17
         SET COLOR "YELLOW"
      CASE 19 TO 25
         SET COLOR "GREEN"
      CASE 26 TO 69
         SET COLOR "BACKGROUND"
      CASE 70 TO 499
         SET COLOR "YELLOW"
      CASE 500
         SET COLOR "BACKGROUND"
      CASE ELSE
   END SELECT

END SUB

