'Program ATTRACT.BAS searches for strange attractors and displays them
'Copyright (c) 1996 by J. C. Sprott <http://sprott.physics.wisc.edu/>
'This program should compile and run with Microsoft QuickBASIC or QBASIC
'It runs much faster under PowerBASIC <http://www.powerbasic.com/>

DEFDBL A-Z
DIM a(5)
w% = 320
h% = 200
SCREEN 7
n& = 0
RANDOMIZE TIMER
WHILE LEN(INKEY$) = 0
        SELECT CASE n&
                CASE 0
                        LOCATE 1, 1: PRINT " ";
                        FOR i% = 0 TO 5
                                a(i%) = 2.4 * (RND - .5)
                        NEXT i%
                        x = 0
                        y = 0
                        xe = x + 1E-10
                        ye = y
                        xmin = 1000000!
                        xmax = -xmin
                        le% = 0
                CASE 1 TO 199
                        IF x < xmin THEN xmin = x
                        IF x > xmax THEN xmax = x
                        xenew = a(0) + xe * (a(1) + a(2) * xe + a(3) * ye) + ye * (a(4) + a(5) * ye)
                        ye = xe
                        xe = xenew
                        IF ABS(xe - x) > .001 THEN le% = 1
                CASE 200
                        IF le% = 0 THEN n& = -1
                CASE 201
                        CLS
                        dx = .1 * (xmax - xmin)
                        IF CSNG(dx) = 0 THEN dx = 1
                        xmax = xmax + dx
                        xmin = xmin - dx
                        dw = w% / (xmax - xmin)
                        dh = h% / (xmax - xmin)
                        dz = 16 / (xmax - xmin)
                CASE ELSE
                        xp% = INT(dw * (x - xmin))
                        yp% = INT(dh * (xmax - y))
                        IF xp% < 0 OR xp% > w% OR yp% < 0 OR yp% > h% THEN
                                n& = -1
                        ELSE
                                zp% = INT(dz * (z - xmin))
                                PSET (xp%, yp%), zp%
                        END IF
        END SELECT
        n& = n& + 1
        IF n& > 5000 THEN n& = 0
        xnew = a(0) + x * (a(1) + a(2) * x + a(3) * y) + y * (a(4) + a(5) * y)
        ynew = x
        z = y
        y = ynew
        x = xnew
        IF ABS(x) + ABS(xe) > 10000! THEN n& = 0
WEND

