Symmetric Icons Program
DEFDBL I, P-Q, X-Z
ON ERROR GOTO errortrap
DEF fnxpix (x) = nstartx + scalex * (x + scale)
DEF fnypix (y) = npixely - scaley * (y + scale)
GOSUB initialize
GOSUB menu
loops:
GOSUB iterate
x = xnew: y = ynew
PSET (fnxpix(x), fnypix(y))
a$ = INKEY$
IF a$ = "c" THEN iterates = 1: CLS : GOSUB parameters
IF a$ = "i" THEN GOSUB parameters
restart:
IF a$ = "m" THEN GOSUB menu
iterates = iterates + 1
GOTO loops
iterate:
zzbar = x * x + y * y
p = alpha * zzbar + lambda
zreal = x: zimag = y
FOR i = 1 TO n - 2
za = zreal * x - zimag * y
zb = zimag * x + zreal * y
zreal = za: zimag = zb
NEXT i
zn = x * zreal - y * zimag
p = p + beta * zn
xnew = p * x + gamma * zreal - omega * y
ynew = p * y - gamma * zimag + omega * x
RETURN
menu:
GOSUB parameters
PRINT USING "(X,y) = ##.#### ##.####"; x; y
PRINT "Scale =", scale
PRINT "ESC to exit program"
PRINT "R for RETURN"
1010 :
B$ = INKEY$
iterates = 1
IF B$ = "" THEN 1010
IF B$ = "l" THEN INPUT "lambda = ", lambda
IF B$ = "a" THEN INPUT "alpha =", alpha
IF B$ = "b" THEN INPUT "beta =", beta
IF B$ = "g" THEN INPUT "gamma =", gamma
IF B$ = "o" THEN INPUT "omega =", omega
IF B$ = "d" THEN INPUT "degree of symmetry =", n
IF B$ = "x" THEN GOSUB initialpoint
IF B$ = "r" THEN CLS : GOSUB parameters: RETURN
IF B$ = "s" THEN INPUT "scale =", scale: GOSUB setscreen
IF B$ = CHR$(27) THEN STOP
CLS
GOTO menu
parameters:
LOCATE 1, 1
PRINT "iterates =", iterates
PRINT "Lambda =", lambda
PRINT "Alpha =", alpha
PRINT "Beta =", beta
PRINT "Gamma =", gamma
PRINT "Omega =", omega
PRINT "Degree =", n
LINE (nstartx, 0)-(nstartx, npixely)
RETURN
initialize:
CLS
scale = 1!
nscreen = 12: npixelx = 640: npixely = 480
nstartx = 160
SCREEN nscreen
GOSUB setscreen
x = .01: y = .003: n = 4: iterates = 1
lambda = -1.8: alpha = 2: beta = 0: gamma = 1!: omega = 0
RETURN
errortrap:
x = .0234: y = .12345
a$ = "m"
RESUME restart
initialpoint:
CLS
PRINT "Enter r to reset coordinates automatically"
PRINT "Enter x to INPUT coordinates"
3010 :
c$ = INKEY$
IF c$ <> "r" AND c$ <> "x" THEN 3010
IF c$ = "r" THEN x = .003: y = .0005345
IF c$ = "x" THEN INPUT "(x,y) coordinates =", x, y
xnew = x: ynew = y
RETURN
setscreen:
CLS
scaley = npixely / (2 * scale)
scalex = (npixelx - nstartx) / (2 * scale)
RETURN