DECLARE SUB solest () DECLARE FUNCTION fx! (u!, v!, c!, s!) DECLARE FUNCTION fy! (u!, v!, c!, s!) DECLARE SUB celest () DECLARE SUB terrest () COMMON SHARED gam, pi gam = 23.5 pi = ATN(1) * 4 SCREEN 12 CLS Uitleg: CLS : COLOR 11: LOCATE 1, 25: PRINT "Earth - Heaven - Sun" COLOR 15: PRINT : PRINT : PRINT PRINT " = Terrestrial Latitudes. This menu shows a section of the earth " PRINT " and of the circle corresponding to a given" PRINT " latitude. Also, characteristic orientations" PRINT " in the celestial vault for an observer on" PRINT " this latitude circle." PRINT PRINT " = Celestial vault and horizon. A 3-D picture of these," PRINT " including the positions of the polar axis " PRINT " and the equator plane, for an observer on a" PRINT " given latitude. Finally, the sun's extreme" PRINT " summer and winter trajectories as seen there." PRINT PRINT " = Solar paths. Seasonal movement of daily sun trajectories. " PRINT " Shown on a section of the celestial vault " PRINT " for a given latitude. The visible extremes " PRINT " are shown 3D in the previous menu." PRINT PRINT " = Change inclination equator-ecliptica." PRINT " Default=23.5=Earth. Choose between 0 (= no" PRINT " seasons) and 90 (equiv. Uranus=82)" COLOR 10: LOCATE 28, 50: PRINT "Credits: guido wuyts 1995" PLAY "l21o3ccdl12c" Wacht: a$ = "": col = 11 WHILE a$ = "" COLOR col LOCATE 5, 1: PRINT " T >" LOCATE 11, 1: PRINT " C >" LOCATE 17, 1: PRINT " S >" LOCATE 22, 1: PRINT " A >" LOCATE 28, 1: PRINT "Choose > (SPACE = END)" tijd = TIMER: WHILE TIMER - tijd < .5: WEND a$ = INKEY$ IF col = 11 THEN col = 5 ELSE col = 11 WEND IF a$ = " " GOTO Einde IF a$ = "t" OR a$ = "T" THEN CLS : CALL terrest: GOTO Uitleg END IF IF a$ = "c" OR a$ = "C" THEN CLS : CALL celest: GOTO Uitleg END IF IF a$ = "s" OR a$ = "S" THEN CLS : CALL solest: GOTO Uitleg END IF IF a$ = "a" OR a$ = "A" THEN inclin: CLS : COLOR 11: PLAY "o4l12d" LOCATE 10, 10: INPUT "-> Inclination equator-ecliptica (0-90)? ", gam IF gam < 0 OR gam > 90 GOTO inclin GOTO Uitleg END IF GOTO Wacht Einde: PLAY "l12o4dp12d" LOCATE 28, 1: COLOR 11: PRINT " -> Sure ? (SPACE=END) " a$ = INPUT$(1) IF a$ <> " " GOTO Uitleg COLOR 15 END SUB celest 'radiuses horizon, radius celestial vault '************************************ r1 = 200: r2 = 70: r3 = 200 'Colors '******* npl = 11: zpl = 9: eqr = 10: hor = 12: zon = 14: zon2 = 8: zon3 = 7 keus = 11 SCREEN 12 'Choice latitude '****************** Breed: CLS PLAY "l12o4d" LOCATE 28, 1: COLOR keus INPUT " -> Choose latitude alfa (-90 -> 90) : ", arg IF ABS(arg) > 90 GOTO Breed CLS LOCATE 19, 19: COLOR 15: PRINT "Observer...." CIRCLE (300, 300), 3 'Draw celestial vault or not? '**************************** PLAY "l12o4d" LOCATE 28, 1: COLOR keus LINE INPUT " -> Draw celestial vault? (Y=yes) "; cel$ IF cel$ = "y" THEN cel$ = "Y" IF cel$ = "Y" THEN LOCATE 4, 12: COLOR 15: PRINT "Celestial vault" END IF LOCATE 19, 19: COLOR 15: PRINT " " LOCATE 19, 3: PRINT "Horizon" LOCATE 28, 1: COLOR keus: PRINT " -> END = SPACE " 'Draw horizon '*************** LOCATE 28, 1: COLOR keus: PRINT " -> next stage = a key ; END = SPACE ": COLOR 15 FOR alf% = 0 TO 360 alfa = alf% * pi / 180 x = r1 * COS(alfa) y = r2 * SIN(alfa) IF alf% < 180 THEN col% = 7 PSET (300 + x, 300 - y), col% ELSE col% = 15 LINE -(300 + x, 300 - y), col% END IF IF cel$ = "Y" AND alf% MOD 10 = 0 THEN GOSUB celest 'celestial vault IF INKEY$ = " " THEN GOSUB Onderbreek 'interrupt NEXT alf% PLAY "l12o4d" SLEEP 3 'Draw N-S axis '************** COLOR hor: LOCATE 25, 45 IF arg = 90 THEN PRINT "South" ELSE PRINT "North" alfa = 110 * pi / 180 'N-S axis x = r1 * COS(alfa) y = r2 * SIN(alfa) LINE (300 - x, 300 + y)-(300 + x, 300 - y), hor SLEEP 3 IF INKEY$ = " " THEN GOSUB Onderbreek 'Draw Zenit axis '*************** COLOR hor: LOCATE 5, 36: PRINT "Zenith" LINE (300, 300)-(300, 300 - r1), hor SLEEP 3 IF INKEY$ = " " THEN GOSUB Onderbreek 'Draw equator plane '******************** COLOR eqr: LOCATE 10, 3: PRINT "Equator plane" COLOR hor IF arg = 90 THEN LOCATE 21, 8: PRINT "South" LOCATE 18, 67: PRINT "South" ELSEIF arg = -90 THEN LOCATE 21, 8: PRINT "North" LOCATE 18, 67: PRINT "North" ELSE LOCATE 21, 8: PRINT "East" LOCATE 18, 67: PRINT "West" END IF alfa = 20 * pi / 180 'E-W axis xw = r1 * COS(alfa) yw = r2 * SIN(alfa) LINE (300 - xw, 300 + yw)-(300 + xw, 300 - yw), eqr 'Equator plane SLEEP 3 IF INKEY$ = " " THEN GOSUB Onderbreek alfa = 110 * pi / 180 'N-S Equator axis beta = (90 - arg) * pi / 180 'given latitude x = r1 * COS(alfa) y = r2 * SIN(alfa) xv = x * COS(beta) yv = r3 * SIN(beta) + y * COS(beta) IF ABS(arg) = 90 THEN LINE (300 - xv, 300 + yv)-(300 + xv, 300 - yv), eqr ELSE LINE (300, 300)-(300 + xv, 300 - yv), eqr END IF SLEEP 3 IF INKEY$ = " " THEN GOSUB Onderbreek PSET (300 + xw, 300 - yw), eqr x1 = r1 * COS(20 * pi / 180): y1 = r2 * SIN(20 * pi / 180) x2 = xv: y2 = yv IF ABS(arg) = 90 THEN amax = 360 ELSE amax = 180 FOR a = 0 TO amax STEP .5 aa = a * pi / 180 c = COS(aa): s = SIN(aa) x = x1 * c + x2 * s: y = y1 * c + y2 * s PSET (300 + x, 300 - y), eqr 'Equator line IF INKEY$ = " " THEN GOSUB Onderbreek NEXT a SLEEP 3 'Draw Polar axis '****************** IF arg > 0 THEN COLOR npl: LOCATE 13, 65: PRINT "Polar axis" 'Polar axis IF arg < 0 THEN COLOR zpl: LOCATE 13, 65: PRINT "Polar axis" LOCATE 14, 69: PRINT "(South)" END IF IF arg = 0 THEN COLOR npl: LOCATE 13, 65: PRINT "Polar axis" COLOR zpl: LOCATE 14, 69: PRINT "(South)" END IF alfa = (290) * pi / 180 'Polar axis beta = arg * pi / 180 'given latitude x = r1 * COS(alfa) y = r2 * SIN(alfa) xp = x * COS(beta) yp = r3 * SIN(beta) + y * COS(beta) IF arg > 0 THEN LINE (300, 300)-(300 + xp, 300 - yp), npl ELSEIF arg = 0 THEN LINE (300, 300)-(300 + xp, 300 - yp), npl LINE (300, 300)-(300 - xp, 300 + yp), zpl ELSE LINE (300, 300)-(300 - xp, 300 + yp), zpl END IF SLEEP 3 IF INKEY$ = " " THEN GOSUB Onderbreek 'Determine both solstices '********************** COLOR zon LOCATE 7, 55: PRINT "Extreme sun paths" gam0 = gam: gam = gam * pi / 180 'inclination equator-ecliptica GOSUB zon 'draw first path gam = -gam GOSUB zon 'draw second path gam = gam0 SLEEP 3 GOTO Eindcel 'Interrupt '*********** Onderbreek: PLAY "l12o4d" LOCATE 28, 1: COLOR keus: PRINT " -> Sure ? (Y = yes, other key = continue) ": COLOR 15 a$ = INPUT$(1) IF a$ = "y" OR a$ = "Y" GOTO Eindcel LOCATE 28, 1: COLOR keus: PRINT " -> next stage = a key ; END = SPACE ": COLOR 15 RETURN 'Draw celestial vault '******************* celest: FOR bet% = 0 TO 90 beta = bet% * pi / 180 xx = x * COS(beta) yy = r3 * SIN(beta) + y * COS(beta) IF (alf% - 20) MOD 90 = 0 THEN LINE -(300 + xx, 300 - yy), hor ELSE PSET (300 + xx, 300 - yy), col% END IF NEXT PSET (300 + x, 300 - y), col% RETURN 'Draw sun path '***************** zon: s = SIN(gam): c = COS(gam) xq = s * xp: yq = s * yp x1 = c * xw: y1 = c * yw x2 = c * xv: y2 = c * yv LINE (300, 300)-(300 + xq, 300 - yq), zon3 'observer - centre path CIRCLE (300 + xq, 300 - yq), 2, zon 'centre PSET (300, 300), zon2 Vlag = 0 FOR alf = 360 TO 0 STEP -.5 alfr = alf * pi / 180 z = s ' check... v = c * SIN(alfr) '.... yy = z * SIN(beta) + v * COS(beta) '...if above horizon. IF yy < 0 AND Vlag = 0 GOTO Volgzon IF yy < 0 AND Vlag = 1 THEN Vlag = 0: LINE -(300, 300), zon2: GOTO Volgzon xx = z * COS(beta) - v * SIN(beta) 'check... x = x1 * COS(alfr) + x2 * SIN(alfr) + xq y = y1 * COS(alfr) + y2 * SIN(alfr) + yq IF alf = 360 THEN PSET (300 + x, 300 - y), zon ELSEIF Vlag = 0 THEN LINE -(300 + x, 300 - y), zon2 ELSEIF xx < 0 THEN PSET (300 + x, 300 - y), zon ELSE LINE -(300 + x, 300 - y), zon END IF Vlag = 1 Volgzon: IF INKEY$ = " " THEN GOSUB Onderbreek NEXT alf RETURN 'Closing... '********* Eindcel: LOCATE 28, 1: COLOR keus: PRINT " -> Press twice a key... ": COLOR 15 PLAY "l12o4dp12d" a$ = INPUT$(1) LOCATE 28, 1: COLOR 12: PRINT " ": COLOR 15 LOCATE 2, 1: PRINT USING " > Latitude : +##.##ø <"; arg: COLOR 15 gam = gam0 'restore value gam a$ = INPUT$(1) END SUB FUNCTION fx (u, v, c, s) fx = u * c + v * s END FUNCTION FUNCTION fy (u, v, c, s) fy = -u * s + v * c END FUNCTION SUB solest SCREEN 12 r = 150 'radius celestial sphere ' Colors.... ' ********** win = 2: zom = 3: npl = 9: zpl = 10: eqr = 14: keus = 11 GOSUB Teken GOSUB Vraag 'New cycle '************* Niew: IF ABS(alf) > 90 GOTO Eindsol 'alf=latitude bet = 90 - alf alfr = alf * pi / 180 betr = bet * pi / 180 gamr = gam * pi / 180 c = COS(betr): s = SIN(betr) xp = r * s: yp = r * c CLS Herbegin: 'again GOSUB Teken FOR eta = -gam TO gam STEP .2 'seasonal positions to... GOSUB Reken IF INKEY$ <> "" GOTO Verder NEXT eta FOR eta = gam TO -gam STEP -.2 '... and fro GOSUB Reken IF INKEY$ <> "" GOTO Verder NEXT eta GOTO Herbegin Verder: GOSUB Vraag GOTO Niew 'Sun path intersects with horizon '************************ Nulpunt: 'intersection point x3 = x1 - y1 * (x2 - x1) / (y2 - y1) IF y1 < 0 THEN x1 = x3: y1 = 0 IF y2 < 0 THEN x2 = x3: y2 = 0 RETURN 'Draw positional data '********************* Teken: COLOR 15: LOCATE 24, 45: PRINT USING "Latitude alfa :+##.##"; alf LOCATE 27, 41: COLOR keus: PRINT " -> Press a key... " LOCATE 24, 1: COLOR zom: PRINT "Summer north, winter south" LOCATE 25, 1: COLOR win: PRINT "Winter north, summer south" LOCATE 26, 1 IF alf = 0 THEN COLOR 15: PRINT "Celestial pole "; : COLOR npl: PRINT "north, "; : COLOR zpl: PRINT "south" ELSEIF alf > 0 THEN COLOR npl: PRINT "Celestial pole north" ELSE COLOR zpl: PRINT "Celestial pole south" END IF LOCATE 27, 1: COLOR eqr: PRINT "Celestial equator" COLOR 15 LOCATE 9, 37: PRINT "Zenith" IF alf = 90 THEN 'at North Pole all=south COLOR npl: LOCATE 19, 15: PRINT "South": LOCATE 19, 62: PRINT "South" ELSEIF alf = -90 THEN 'at South Pole all=north COLOR zpl: LOCATE 19, 15: PRINT "Noord": LOCATE 19, 62: PRINT "North" ELSE 'else axis N-S LOCATE 19, 15: PRINT "South": LOCATE 19, 62: PRINT "North" END IF COLOR 15 CIRCLE (320, 300), r, , 0, pi 'Celestial Sphere IF alf = 0 THEN 'Horizon plane... LINE (320 - r, 300)-(320, 300), zpl '...at eaquator LINE (320, 300)-(320 + r, 300), npl ELSEIF ABS(alf) = 90 THEN '...at poles LINE (320 - r, 300)-(320 + r, 300), eqr ELSE LINE (320 - r, 300)-(320 + r, 300), 15 '...elsewhere END IF IF alf > 0 THEN 'Polar axis:... LINE (320, 300)-(320 + xp, 300 - yp), npl '...North ELSE LINE (320, 300)-(320 - xp, 300 + yp), zpl '...South END IF LINE (320, 300)-(320 - yp, 300 - xp), eqr 'Equator RETURN 'Wait for input '*************** Vraag: 'Ask PLAY "l12o4d" LOCATE 27, 41: COLOR 3: PRINT " (Choose alfa > +/-90ø for END)" LOCATE 25, 41: COLOR keus: INPUT " -> New value : "; alf: COLOR 15 RETURN 'Calculate and draw sun path '************************** Reken: 'calculate et = eta * pi / 180 v0 = r * SIN(-et): u0 = r * COS(-et) x1o = x1: y1o = y1: x2o = x2: y2o = y2 'old values for clearing x1 = fx(-u0, v0, c, s): y1 = fy(-u0, v0, c, s) x2 = fx(u0, v0, c, s): y2 = fy(u0, v0, c, s) IF y1 < 0 AND y2 < 0 THEN FOR dum% = 1 TO 1000: NEXT dum%: GOTO Uit IF y1 * y2 < 0 THEN GOSUB Nulpunt LINE (320 + x1o, 300 - y1o)-(320 + x2o, 300 - y2o), 0 'clear... 'draw... IF eta < 0 THEN col = zom 'summer north IF eta > 0 THEN col = win 'winter south LINE (320 + x1, 300 - y1)-(320 + x2, 300 - y2), col 'draw... CIRCLE (320, 300), r, , 0, pi 'Redraw celestial sphere IF alf = 0 THEN 'Redraw Horizon plane... LINE (320 - r, 300)-(320, 300), zpl '...at equator LINE (320, 300)-(320 + r, 300), npl ELSEIF ABS(alf) = 90 THEN '...at poles LINE (320 - r, 300)-(320 + r, 300), eqr ELSE LINE (320 - r, 300)-(320 + r, 300), 15 '...elsewhere END IF IF alf >= 0 THEN 'Redraw polar axis LINE (320, 300)-(320 + xp, 300 - yp), npl ELSE LINE (320, 300)-(320 - xp, 300 + yp), zpl END IF LINE (320, 300)-(320 - yp, 300 - xp), eqr 'Redraw Equator Uit: RETURN 'Close '********* Eindsol: LOCATE 24, 1 PRINT " " PRINT " " PRINT " " PRINT " " PLAY "l12o4dp12d" COLOR keus: PRINT " -> Press a key... ": COLOR 15 a$ = INPUT$(1) END SUB SUB terrest pi = ATN(1) * 4 'radii earth, horizon sphere '*************************** r = 150: dr = 30: 'initial latitude and -increment '******************************* alf = 53: dalf = 1 'co-ord. earth centre '********************** x0 = 280: y0 = 220 'Colors '******* SCREEN 12 npl = 9: zpl = 10: zen = 13: eqr = 14: ter = 3: cir = 7 keus = 11: incr = 3 LOCATE 4, 3: COLOR npl: PRINT "North Pole" LOCATE 14, 3: COLOR eqr: PRINT "Equator" LOCATE 24, 3: COLOR zpl: PRINT "South Pole" LOCATE 4, 60: COLOR ter: PRINT "Earth" LOCATE 6, 60: COLOR 15: PRINT "Horizon sphere" LOCATE 8, 60: COLOR zen: PRINT "Zenith" LOCATE 10, 60: COLOR cir: PRINT "Latitude circle" PLAY "l12o4d" 'Cycle '****** New: IF alf < -90 THEN alf = -90 IF alf > 90 THEN alf = 90 alfr = alf * pi / 180 x = r * COS(alfr): y = -r * SIN(alfr) x2 = (r + dr) * COS(alfr): y2 = -(r + dr) * SIN(alfr) dx = dr * SIN(alfr): dy = dr * COS(alfr) LOCATE 14, 60: COLOR keus: PRINT USING "alfa = +##.## ø "; alf LOCATE 28, 1: PRINT " -> Modify alfa with + or -, increment with * or /, END=SPACE" LOCATE 16, 60: COLOR incr: PRINT USING "increment=##.## ø "; dalf COLOR 15 'Draw everything '************* CIRCLE (x0, y0), r, ter LINE (x0 + r, y0)-(x0 + r + dr, y0), eqr: LINE (x0 - r, y0)-(x0 - r - dr, y0), eqr LINE (x0, y0 + r)-(x0, y0 + r + dr), zpl: LINE (x0, y0 - r)-(x0, y0 - r - dr), npl LINE (x0, y0)-(x0 + x, y0 + y), keus: LINE (x0, y0)-(x0 + r, y0), keus LINE (x0 - x, y0 + y)-(x0 + x, y0 + y), cir LINE (x0 + x, y0 + y)-(x0 + x2, y0 + y2), zen: LINE (x0 - x, y0 + y)-(x0 - x2, y0 + y2), zen LINE (x0 + x - dx, y0 + y - dy)-(x0 + x + dx, y0 + y + dy) LINE (x0 - x - dx, y0 + y + dy)-(x0 - x + dx, y0 + y - dy) CIRCLE (x0 + x, y0 + y), dr, , 1.5 * pi + alfr, pi * .5 + alfr CIRCLE (x0 - x, y0 + y), dr, , pi * .5 - alfr, 1.5 * pi - alfr LINE (x0 + x, y0 + y)-(x0 + x + dr, y0 + y), eqr LINE (x0 - x, y0 + y)-(x0 - x - dr, y0 + y), eqr IF alf = 0 THEN LINE (x0 + x, y0 + y)-(x0 + x, y0 + y - dr), npl LINE (x0 + x, y0 + y)-(x0 + x, y0 + y + dr), zpl LINE (x0 - x, y0 + y)-(x0 - x, y0 + y - dr), npl LINE (x0 - x, y0 + y)-(x0 - x, y0 + y + dr), zpl ELSEIF alf > 0 THEN LINE (x0 + x, y0 + y)-(x0 + x, y0 + y - dr), npl LINE (x0 - x, y0 + y)-(x0 - x, y0 + y - dr), npl ELSE LINE (x0 + x, y0 + y)-(x0 + x, y0 + y + dr), zpl LINE (x0 - x, y0 + y)-(x0 - x, y0 + y + dr), zpl END IF 'Wait for input '****************** Wachtter: a$ = INPUT$(1) IF a$ = " " GOTO Eindter IF a$ = "+" THEN GOSUB Wissen: alf = alf + dalf: GOTO New IF a$ = "-" THEN GOSUB Wissen: alf = alf - dalf: GOTO New IF a$ = "*" THEN dalf = dalf * 2 IF dalf > 64 THEN dalf = 64 LOCATE 16, 60: PRINT USING "increment=##.## ø "; dalf END IF IF a$ = "/" THEN dalf = dalf * .5 IF dalf < 1 / 64 THEN dalf = 1 / 64 LOCATE 16, 60: PRINT USING "increment=##.## ø "; dalf END IF GOTO Wachtter 'Clear everything '************ Wissen: LINE (x0 + r, y0)-(x0 + r + dr, y0), 0: LINE (x0 - r, y0)-(x0 - r - dr, y0), 0 LINE (x0, y0 + r)-(x0, y0 + r + dr), 0: LINE (x0, y0 - r)-(x0, y0 - r - dr), 0 LINE (x0, y0)-(x0 + x, y0 + y), 0: LINE (x0, y0)-(x0 + r, y0), 0 LINE (x0 - x, y0 + y)-(x0 + x, y0 + y), 0 LINE (x0 + x, y0 + y)-(x0 + x2, y0 + y2), 0: LINE (x0 - x, y0 + y)-(x0 - x2, y0 + y2), 0 LINE (x0 + x - dx, y0 + y - dy)-(x0 + x + dx, y0 + y + dy), 0 LINE (x0 - x - dx, y0 + y + dy)-(x0 - x + dx, y0 + y - dy), 0 CIRCLE (x0 + x, y0 + y), dr, 0, 1.5 * pi + alfr, pi * .5 + alfr CIRCLE (x0 - x, y0 + y), dr, 0, pi * .5 - alfr, 1.5 * pi - alfr LINE (x0 + x, y0 + y)-(x0 + x + dr, y0 + y), 0 LINE (x0 - x, y0 + y)-(x0 - x - dr, y0 + y), 0 IF alf = 0 THEN LINE (x0 + x, y0 + y)-(x0 + x, y0 + y - dr), 0 LINE (x0 + x, y0 + y)-(x0 + x, y0 + y + dr), 0 LINE (x0 - x, y0 + y)-(x0 - x, y0 + y - dr), 0 LINE (x0 - x, y0 + y)-(x0 - x, y0 + y + dr), 0 ELSEIF alf > 0 THEN LINE (x0 + x, y0 + y)-(x0 + x, y0 + y - dr), 0 LINE (x0 - x, y0 + y)-(x0 - x, y0 + y - dr), 0 ELSE LINE (x0 + x, y0 + y)-(x0 + x, y0 + y + dr), 0 LINE (x0 - x, y0 + y)-(x0 - x, y0 + y + dr), 0 END IF RETURN 'Close '********* Eindter: PLAY "l12o4dp12d" LOCATE 28, 1: COLOR keus: PRINT " -> Press twice a key... ": COLOR 15 a$ = INPUT$(1) LOCATE 28, 1: PRINT " " a$ = INPUT$(1) END SUB