DECLARE FUNCTION campione# (num AS DOUBLE, mo AS DOUBLE)
DECLARE SUB ore (raggio AS SINGLE, t AS DOUBLE, colore AS INTEGER)
DECLARE SUB minuti (raggio AS SINGLE, t AS DOUBLE, colore AS INTEGER)
DECLARE SUB pausa (tempo AS DOUBLE)
DECLARE SUB secondi (raggio AS SINGLE, t AS DOUBLE, colore AS INTEGER)
DECLARE FUNCTION resto! (q AS SINGLE, d AS SINGLE)
DECLARE SUB linea (s AS ANY, colore AS INTEGER)
DECLARE SUB quadrante (raggio AS SINGLE)
DECLARE SUB ruota (p AS ANY, teta AS SINGLE)
TYPE punto
x AS SINGLE
y AS SINGLE
END TYPE
TYPE segmento
inizio AS punto
fine AS punto
END TYPE
SCREEN 12
CLS
DIM SHARED ORIGINE AS punto
CONST PI = 3.141592654#
ORIGINE.x = 240!
ORIGINE.y = 240!
DIM raggioDellOrologio AS SINGLE
raggioDellOrologio = 220!
CALL quadrante(raggioDellOrologio * 1!)
DIM adesso AS DOUBLE
DIM prima AS DOUBLE
prima = 0#
DO
adesso = campione(TIMER, 1# / 6#)
IF adesso > prima THEN
CALL secondi(raggioDellOrologio * 1!, prima, 0)
CALL minuti(raggioDellOrologio * 1!, prima, 0)
CALL ore(raggioDellOrologio * 1!, prima, 0)
CALL secondi(raggioDellOrologio * 1!, adesso, 4)
CALL minuti(raggioDellOrologio * 1!, adesso, 2)
CALL ore(raggioDellOrologio * 1!, adesso, 8)
prima = adesso
END IF
LOOP WHILE INKEY$ = ""
CLS
FUNCTION campione# (num AS DOUBLE, mo AS DOUBLE)
DIM q AS DOUBLE
DIM segno AS DOUBLE
q = num / mo
IF q >= 0# THEN
LET segno = 1#
ELSE
LET segno = 0# - 1#
END IF
LET campione# = mo * INT(ABS(q)) * segno
END FUNCTION
SUB linea (s AS segmento, colore AS INTEGER)
DIM x0 AS SINGLE
DIM y0 AS SINGLE
DIM xf AS SINGLE
DIM yf AS SINGLE
x0 = ORIGINE.x + s.inizio.x
y0 = ORIGINE.y - s.inizio.y
xf = ORIGINE.x + s.fine.x
yf = ORIGINE.y - s.fine.y
LINE (x0, y0)-(xf, yf), colore MOD 15
END SUB
'
SUB minuti (raggio AS SINGLE, t AS DOUBLE, colore AS INTEGER)
DIM l1 AS segmento
DIM l2 AS segmento
DIM l3 AS segmento
DIM raggioLancetta AS SINGLE
raggioLancetta = .55 * raggio
DIM lato AS SINGLE
DIM alfa AS SINGLE
DIM min AS SINGLE
LET lato = .14# * raggio
l1.inizio.x = raggioLancetta + lato
l1.inizio.y = 0!
l1.fine.x = raggioLancetta
l1.fine.y = lato * .5
l2.inizio = l1.fine
l2.fine.x = raggioLancetta
l2.fine.y = 0# - lato * .5#
l3.inizio = l2.fine
l3.fine = l1.inizio
min = resto(t / 60!, 60!)
alfa = (90! - 6! * min) * PI / 180!
CALL ruota(l1.inizio, alfa)
CALL ruota(l1.fine, alfa)
CALL ruota(l2.inizio, alfa)
CALL ruota(l2.fine, alfa)
CALL ruota(l3.inizio, alfa)
CALL ruota(l3.fine, alfa)
CALL linea(l1, colore)
CALL linea(l2, colore)
CALL linea(l3, colore)
END SUB
SUB ore (raggio AS SINGLE, t AS DOUBLE, colore AS INTEGER)
DIM centro AS punto
DIM alfa AS SINGLE
DIM raggioLancetta AS SINGLE
centro.x = 0!
centro.y = raggio * .45
raggioLancetta = raggio * .09
alfa = 0 - 30! * resto(t / 3600!, 12!)
CALL ruota(centro, alfa * PI / 180!)
CIRCLE (ORIGINE.x + centro.x, ORIGINE.y - centro.y), raggioLancetta, colore
END SUB
SUB pausa (tempo AS DOUBLE)
DIM t0 AS DOUBLE
t0 = TIMER
DO
LOOP WHILE TIMER - t0 < tempo
END SUB
SUB quadrante (raggio AS SINGLE)
DIM al AS SINGLE
DIM tacca AS segmento
DIM colore AS INTEGER
al = 0!
WHILE al < 360!
tacca.inizio.x = raggio
tacca.inizio.y = 0!
tacca.fine.y = 0!
IF INT(al) MOD 30 = 0 THEN
tacca.fine.x = .88 * raggio
colore = 3
ELSE
tacca.fine.x = .95 * raggio
colore = 7
END IF
CALL ruota(tacca.inizio, al * PI / 180!)
CALL ruota(tacca.fine, al * PI / 180!)
CALL linea(tacca, colore)
al = al + 6!
WEND
END SUB
FUNCTION resto! (q AS SINGLE, d AS SINGLE)
DIM divisioni AS LONG
divisioni = INT(ABS(q / d))
resto! = ABS(q) - ABS(d * divisioni)
END FUNCTION
SUB ruota (p AS punto, teta AS SINGLE)
DIM p2 AS punto
p2.x = p.x * COS(teta) - p.y * SIN(teta)
p2.y = p.x * SIN(teta) + p.y * COS(teta)
p = p2
END SUB
SUB secondi (raggio AS SINGLE, t AS DOUBLE, colore AS INTEGER)
DIM lancetta AS segmento
DIM al AS SINGLE
DIM sec AS SINGLE
sec = resto!(t * 1!, 60!)
al = 90! - 6! * sec
lancetta.inizio.x = .85 * raggio
lancetta.inizio.y = 0!
lancetta.fine.x = .7 * raggio
lancetta.fine.y = 0!
CALL ruota(lancetta.inizio, al * PI / 180!)
CALL ruota(lancetta.fine, al * PI / 180!)
CALL linea(lancetta, colore)
END SUB