'Program ATTRACT.BAS searches for strange attractors and displays them
'Copyright (c) 1996 by J. C. Sprott
'This program should compile and run with Microsoft QuickBASIC or QBASIC
'It runs much faster under PowerBASIC
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