Square Quilts Program




        DEFDBL I, P-Q, X-Z
        DEFINT M
        ON ERROR GOTO errortrap
        DIM mcount(160, 160), mcolor(200), colord(16)
       
        DEF fnxpix (x) = nstartx + (npixelx - nstartx) * x / nperiod
        DEF fnypix (y) = npixely - npixely * y / nperiod
       
        GOSUB initialize
        GOSUB setcolors
        GOSUB menu
        iterates = 1

loops:
        GOSUB iterate
        x = xnew: y = ynew
        GOSUB plotpoints
        a$ = INKEY$
        IF a$ = "c" THEN iterates = 1: CLS : GOSUB setscreen
        IF a$ = "i" THEN LOCATE 1, 1: PRINT "iterates ="; iterates

restart:
        IF a$ = "m" THEN GOSUB menu
        iterates = iterates + 1
        GOTO loops

iterate:
        sx = SIN(p2 * x): sy = SIN(p2 * y)
        xnew = (lambda + alpha * COS(p2 * y)) * sx - omega * sy + beta * SIN(2 * p2 * x) + gamma * SIN(3 * p2 * x) * COS(2 * p2 * y) + ma * x + shift
        ynew = (lambda + alpha * COS(p2 * x)) * sy + omega * sx + beta * SIN(2 * p2 * y) + gamma * SIN(3 * p2 * y) * COS(2 * p2 * x) + ma * y + shift
        IF xnew > 1 THEN xnew = xnew - INT(xnew)
        IF ynew > 1 THEN ynew = ynew - INT(ynew)
        IF xnew < 0 THEN xnew = xnew + INT(-xnew) + 1
        IF ynew < 0 THEN ynew = ynew + INT(-ynew) + 1
        IF toggle = 0 THEN RETURN
        mxnew = xnew * (npixelx - nstartx) / nperiod: mynew = ynew * npixely / nperiod
        mcount(mxnew, mynew) = mcount(mxnew, mynew) + 1
        RETURN

menu:
        GOSUB parameters
        PRINT "No. periods = "; nperiod
        PRINT USING "(X,y)= ##.#### ##.####"; x; y
        PRINT "T to toggle coloring:";
        IF toggle = 0 THEN PRINT "  coloring off" ELSE PRINT "  coloring on"
        PRINT "ESC to exit"
        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$ = "m" THEN INPUT "m =", ma
        IF b$ = "t" THEN toggle = 1 - toggle
        IF b$ = "h" THEN shift = .5 - shift
        IF b$ = "n" THEN INPUT "# of periods =", nperiod: GOSUB setscreen
        IF b$ = "x" THEN GOSUB initialpoint
        IF b$ = "c" THEN INPUT nscreen: GOSUB setscreen
        IF b$ = "r" THEN iterates = 1: GOSUB setscreen: RETURN
        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 "M ="; ma
        PRINT "sHift by "; shift
        LINE (nstartx, 0)-(nstartx, npixely)
        RETURN

initialize:
        toggle = 0: ncolor = 15
        nperiod = 3
        nscreen = 12
        npixelx = 640: npixely = 480: nstartx = 160
        CLS
        SCREEN nscreen
        pi = 355 / 113: p2 = 2 * pi
        x = .1: y = .334: xnew = x: ynew = y
        lambda = -.59: alpha = .2: beta = .1: gamma = -.09: ma = 0
        shift = 0
        RETURN

errortrap:
        x = .0234: y = .12345: xnew = x: ynew = y
        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 = .3: y = .5345
        IF C$ = "x" THEN INPUT "(x,y) coordinates =", x, y
        xnew = x: ynew = y
        RETURN

setscreen:
        CLS
        GOSUB parameters
        IF toggle = 0 THEN RETURN
        FOR j = 0 TO (npixelx - nstartx) / nperiod
                FOR i = 0 TO npixely / nperiod
                        mcount(j, i) = 0
                NEXT i
        NEXT j
        FOR i = 1 TO 15
                LINE (0, npixely - 20 * i)-(15, npixely - 20 * (i + 1)), colord(i), BF
        NEXT i
        RETURN

setcolors:
        colord(1) = 8: colord(2) = 6: colord(3) = 1: colord(4) = 9
        colord(5) = 3: colord(6) = 11: colord(7) = 2: colord(8) = 10
        colord(9) = 5: colord(10) = 13: colord(11) = 4: colord(12) = 12
        colord(13) = 14: colord(14) = 7: colord(15) = 15
        FOR j = 1 TO 15
                mcolor(j) = colord(j)
        NEXT j
        RETURN

plotpoints:
        FOR i = 0 TO nperiod - 1
                FOR j = 0 TO nperiod - 1
                        IF toggle = 0 THEN PSET (fnxpix(x + i), fnypix(y + j)): GOTO 160
                        mc = mcount(mxnew, mynew)
                        IF mc < 15 THEN mm = mcolor(mc) ELSE mm = 15
                        PSET (fnxpix(x + i), fnypix(y + j)), mm
'rem If coloring is not being used delete , mm  from previous line
160     NEXT j
        NEXT i
        RETURN