!  Spirograph.
!
LIBRARY ":Libs/AmigaLib*"
DECLARE DEF Rainbow$

LET cycle$ = Rainbow$

CALL Logo                         !draw logo (invisibly)

RANDOMIZE
LET BaseX = 150
LET BaseY = 256
LET run = 300
LET a = 70
LET b = 19
LET ab = 0
LET ba = 5
LET Incr1 = 4
LET Incr2 = -4

SUB Spiro
    LET Xa = 64 * a
    LET Ya = 0
    LET Xb = 64 * b
    LET Yb = 0
    LET Vx = 0
    LET Vy = 15000
    FOR i = 1 to run
        LET y1 = Basey + Int((Xa + Xb + Vx) / 64)
        LET x1 = Basex + Int((Ya + Yb + Vy) / 64)
        LET y2 = Basey + Int((Xa + Xb - Vx) / 64)
        LET x2 = Basex + Int((Ya + Yb - Vy) / 64)
        IF mod(i,2)=0 then
           CALL Cycle(cycle$,-1)
           LET color = Mod(color,30)+1
        END IF
        IF erasing=0 then
           SET color color        !drawing, make back lighter
           LET tmp = 1-i/run
           SET color mix (0) tmp,tmp,tmp
        ELSE                      !erasing, make it darker
           SET color mix (0) i/run,i/run,i/run
        END IF
        PLOT x1,y1; x2,y2
        LET Xa = Xa - Int(Ya / incr2)
        LET Ya = Int(Xa / incr2) + Ya
        LET Xb = Xb - Int(Yb / incr1)
        LET Yb = Int(Xb / incr1) + Yb
        LET Vx = Vx - Int(Vy / incr1)
        LET Vy = Int(Vx / incr1) + Vy
    NEXT i
END SUB

SET window -200,500,-100,600
LET s1 = 1
LET s2 = -1
DO
   LET erasing = 0                !draw the figure...
   CALL Spiro
   LET erasing = 1                !...then erase it
   SET color 0
   CALL Spiro
   LET incr1 = incr1+s1*Int(7*rnd)     !pick new increments
   LET incr2 = incr2+s2*Int(3*rnd)
   IF incr1 = 0 then LET incr1=3
   IF incr2 = 0 then LET incr2=3
   IF abs(incr1)>27 then LET s1 = -Sgn(incr1)
   IF abs(incr2)>27 then LET s2 = -Sgn(incr2)
LOOP
END

!
!  Draw rainbox logo on the screen.  Do it all in
!  "black" so no one can see what we're doing.
!  Then we'll reset the color mixes and it wil be visible.
!
SUB Logo
    SET mode "LOW32"
    SET window 1,40,25,1
    SET color mix(0) 1,1,1
    FOR i = 1 to 30
        SET color i
        SET color mix(i) 1,1,1
        LET x = (i-1)/30 * 12 + 1
        BOX AREA x,x+1/3,1,2.5
    NEXT i
    SET color 31
    SET color mix(31) 1,1,1
    PLOT TEXT, at 3,4: "True BASIC"
    BOX KEEP 3,15,4,3 in s$
    BOX SHOW s$ at 1,2 using "and"
    BOX KEEP 1,14,0,3 in s$
    CLEAR
    BOX SHOW s$ at 1,25
END SUB
