! A Fractal Example
!
! Written exclusively in True BASIC
! =======================================================================

DECLARE FUNCTION Mandelbrot
DIM KolorTable(0)

SET MODE "LOW4"
ASK PIXELS XPIXELS, YPIXELS

! **************************
! Actual coordinates to view
! **************************
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

LET MaxI = 500

CALL InitKolorTable(MaxI, KolorTable)

LET Start = TIME

! *************
! The main loop
! *************
FOR Y = YBottom TO YTop+dy/2 STEP dy
   FOR X = XLeft TO XRight+dx/2 STEP dx

      SET COLOR KolorTable(Mandelbrot(X, Y, MaxI))
      PLOT X,Y

   NEXT X
NEXT Y

LET Finish = TIME

SET CURSOR 1,1
SET COLOR 1
PRINT "Calculation time: "; INT((Finish-Start)/60); "min";
PRINT REMAINDER(Finish-Start,60); "sec"

DO
LOOP UNTIL KEY INPUT

END




! ======================================================================
! Color table is dynamically allocated
! ======================================================================
SUB InitKolorTable(MaxI, Kolor())

   MAT REDIM Kolor(0 TO MaxI)

   SET COLOR MIX (0)  0/15,  5/15, 10/15
   SET COLOR MIX (1) 15/15, 15/15, 15/15
   SET COLOR MIX (2)  0/15,  0/15,  2/15
   SET COLOR MIX (3) 15/15,  8/15,  0/15

   FOR I = 0 TO MaxI

      IF I = MaxI THEN
         LET Kolor(I) = 2
      ELSEIF I > 69 THEN
         LET Kolor(I) = 3
      ELSEIF I > 25 THEN
         LET Kolor(I) = 0
      ELSEIF I > 18 THEN
         LET Kolor(I) = 1
      ELSEIF MOD(I,2) = 1 THEN
         LET Kolor(I) = 3
      ELSE
         LET Kolor(I) = 2
      END IF
   
   NEXT I

END SUB




! =====================================================================
! The actual floating point work is done here
! =====================================================================
FUNCTION Mandelbrot(Hor, Ver, Max_VEL)

   LET Re      = Hor
   LET Im      = Ver
   LET Esc_VEL = 0
   LET Radius  = 0
   LET Max_RAD = 4

   DO WHILE Radius < Max_RAD AND Esc_VEL < Max_VEL

      LET Temp = Re*Re - Im*Im + Hor
      LET Im = 2*Re*Im + Ver
      LET Re = Temp
      LET Esc_VEL = Esc_VEL + 1
      LET Radius = Re*Re + Im*Im

   LOOP

   LET Mandelbrot = Esc_VEL

END FUNCTION

