DECLARE SUB pausa (tempo AS DOUBLE)
DECLARE SUB iniziaGruppo (reg() AS ANY)
DECLARE SUB traccia (reg() AS ANY)
DECLARE SUB successivo (reg() AS ANY)
DECLARE SUB setColore (reg() AS ANY, colore AS INTEGER)
DECLARE SUB inizia (r AS ANY)
DECLARE SUB incrementa (r AS ANY)
DECLARE SUB disegna (r AS ANY)
TYPE tpunto
x AS SINGLE
y AS SINGLE
dx AS SINGLE
dy AS SINGLE
END TYPE
TYPE tsegmento
inizio AS tpunto
fine AS tpunto
END TYPE
TYPE trettangolo
diagonale AS tsegmento
colore AS INTEGER
END TYPE
SCREEN 12
CLS
RANDOMIZE (TIMER)
DIM rettangolo(12) AS trettangolo
DIM contatore AS LONG
CALL iniziaGruppo(rettangolo())
DO
CALL traccia(rettangolo())
CALL successivo(rettangolo())
contatore = contatore + 1
pausa .01
IF (contatore MOD 40&) = 0 THEN
CALL setColore(rettangolo(), 1 + 13 * RND)
END IF
LOOP WHILE INKEY$ = ""
REM PRINT "Sono stati disegnati "; contatore; " rettangoli"
SUB disegna (r AS trettangolo)
LINE (r.diagonale.inizio.x, r.diagonale.inizio.y)-(r.diagonale.fine.x, r.diagonale.inizio.y), r.colore
LINE (r.diagonale.fine.x, r.diagonale.inizio.y)-(r.diagonale.fine.x, r.diagonale.fine.y), r.colore
LINE (r.diagonale.fine.x, r.diagonale.fine.y)-(r.diagonale.inizio.x, r.diagonale.fine.y), r.colore
LINE (r.diagonale.inizio.x, r.diagonale.fine.y)-(r.diagonale.inizio.x, r.diagonale.inizio.y), r.colore
END SUB
SUB incrementa (r AS trettangolo)
IF r.diagonale.inizio.x < 6! THEN r.diagonale.inizio.dx = 3!
IF r.diagonale.inizio.x > 634! THEN r.diagonale.inizio.dx = -3!
IF r.diagonale.inizio.y < 6! THEN r.diagonale.inizio.dy = 3!
IF r.diagonale.inizio.y > 474! THEN
r.diagonale.inizio.dy = -9!
END IF
IF r.diagonale.fine.x < 6! THEN r.diagonale.fine.dx = 3!
IF r.diagonale.fine.x > 634! THEN r.diagonale.fine.dx = -3!
IF r.diagonale.fine.y < 6! THEN r.diagonale.fine.dy = 3!
IF r.diagonale.fine.y > 474! THEN r.diagonale.fine.dy = -3!
r.diagonale.inizio.x = r.diagonale.inizio.x + r.diagonale.inizio.dx
r.diagonale.inizio.y = r.diagonale.inizio.y + r.diagonale.inizio.dy
r.diagonale.fine.x = r.diagonale.fine.x + r.diagonale.fine.dx * RND
r.diagonale.fine.y = r.diagonale.fine.y + r.diagonale.fine.dy * RND
END SUB
SUB inizia (r AS trettangolo)
r.diagonale.inizio.x = 40!
r.diagonale.inizio.y = 40!
r.diagonale.inizio.dx = 3!
r.diagonale.inizio.dy = 3!
r.diagonale.fine.x = 200!
r.diagonale.fine.y = 150!
r.diagonale.fine.dx = 3!
r.diagonale.fine.dy = 3!
END SUB
SUB iniziaGruppo (reg() AS trettangolo)
STATIC fine AS INTEGER, i AS INTEGER
fine = UBOUND(reg)
i = 1
CALL inizia(reg(0))
WHILE i <= fine
reg(i) = reg(i - 1)
CALL incrementa(reg(i))
reg(i).colore = 3
i = i + 1
WEND
reg(0).colore = 0
END SUB
SUB pausa (tempo AS DOUBLE)
STATIC t0 AS DOUBLE
t0 = TIMER
DO
LOOP WHILE (TIMER - t0) < tempo
END SUB
SUB setColore (reg() AS trettangolo, colore AS INTEGER)
STATIC i AS INTEGER, fine AS INTEGER
i = 1
fine = UBOUND(reg)
WHILE i <= fine
reg(i).colore = ABS(colore) MOD 16
i = i + 1
WEND
END SUB
SUB successivo (reg() AS trettangolo)
STATIC fine AS INTEGER, i AS INTEGER
fine = UBOUND(reg)
i = 0
WHILE i < fine
reg(i).diagonale = reg(i + 1).diagonale
i = i + 1
WEND
CALL incrementa(reg(fine))
END SUB
SUB traccia (reg() AS trettangolo)
STATIC i AS INTEGER, fine AS INTEGER
i = 0
fine = UBOUND(reg)
WHILE i <= fine
disegna reg(i)
i = i + 1
WEND
END SUB