ON ERROR GOTO trap

molt = 391.387

pi = 3.141592654#

P1 = pi / 180

INPUT "lat"; lat

fi = lat * P1

INPUT "declinazione"; de

d = de * P1

INPUT "ortostilo"; gn

SCREEN 12

FOR AO1 = -90 TO 90 STEP 15 / 2

FOR delta = -23.44 TO 23.44 STEP .05

del = delta * P1

AO = AO1 * P1

nume = SIN(AO)

deno = (SIN(fi) * COS(AO) - COS(fi) * TAN(del))

GOSUB ATN2

'az = ATN(SIN(AO) / (SIN(fi) * COS(AO) - COS(fi) * TAN(del)))

senh = SIN(fi) * SIN(del) + COS(fi) * COS(del) * COS(AO)

h = ATN(senh / SQR(-senh * senh + 1))

x = gn * TAN(az - d)

y = -gn * TAN(h) / COS(az - d)

PSET (320 + x * molt, -y * molt + 240), 14

NEXT

NEXT

REM solstizio d'inverno

FOR AO1 = -90 TO 90 STEP 15 / 8

delta = -23.44

del = delta * P1

AO = AO1 * P1

nume = SIN(AO)

deno = (SIN(fi) * COS(AO) - COS(fi) * TAN(del))

GOSUB ATN2

'az = ATN(SIN(AO) / (SIN(fi) * COS(AO) - COS(fi) * TAN(del)))

senh = SIN(fi) * SIN(del) + COS(fi) * COS(del) * COS(AO)

h = ATN(senh / SQR(-senh * senh + 1))

x = gn * TAN(az - d)

y = -gn * TAN(h) / COS(az - d)

PSET (320 + x * molt, -y * molt + 240), 12

NEXT

REM ora italica e/o babilonica

'FOR ITA = 12 TO 24

FOR BAB = 1 TO 12

FOR delta = -23.44 TO 23.44 STEP .05

del = delta * P1

cosesse = -TAN(fi) * TAN(del)

esse = pi / 2 - ATN(cosesse / SQR(-cosesse * cosesse + 1))

'AO = (ITA * PI / 12 + esse - 2 * PI)

AO = (BAB * pi / 12 - esse)

nume = SIN(AO)

deno = (SIN(fi) * COS(AO) - COS(fi) * TAN(del))

GOSUB ATN2

'az = ATN(SIN(AO) / (SIN(fi) * COS(AO) - COS(fi) * TAN(del)))

senh = SIN(fi) * SIN(del) + COS(fi) * COS(del) * COS(AO)

h = ATN(senh / SQR(-senh * senh + 1))

x = gn * TAN(az - d)

y = -gn * TAN(h) / COS(az - d)

PSET (320 + x * molt, -y * molt + 240), 14

NEXT

NEXT

REM orizzonte

LINE (0, 240)-(640, 240), 8: REM  ASSE ASCISSE

LINE (320, 0)-(320, 480), 8: REM  ASSE ORDINATE

END

SCREEN 0

trap:

RESUME NEXT

ATN2:

REM calcola l'arcotangente tenendo conto del quadrante

yp = nume

xp = deno

rapu = (yp / xp)

IF rapu > 0 THEN

IF nume > 0 THEN

az = ATN(rapu)

ELSE

az = ATN(rapu) + pi

END IF

ELSE

IF yp > 0 THEN

az = ATN(rapu) + pi

ELSE

az = ATN(rapu) + 2 * pi

END IF

END IF

IF yp = 0 THEN

IF xp > 0 THEN az = 0

IF xp < 0 THEN az = pi

END IF

RETURN