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