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 "Aarde - Hemel - Zon" COLOR 15: PRINT : PRINT : PRINT PRINT " = Breedtegraden. Dit programma toont een doorsnede van de" PRINT " aarde en een breedtecirkel voor een bepaalde" PRINT " breedtegraad, met aanduiding van karakteristieke" PRINT " ori‰ntaties van het hemelgewelf voor een " PRINT " waarnemer op deze breedtecirkel." PRINT PRINT " = Hemelgewelf en horizon. Een 3D-beeld van het" PRINT " hemelgewelf en de horizon, met de posities " PRINT " van poolas en equatorvlak, voor een waarnemer" PRINT " op een bepaalde breedtegraad. Tevens uiterste" PRINT " zomer- en winterbaan van de zon." PRINT PRINT " = Dagbanen zon, en hun seizoenevolutie. Een doorsnede van" PRINT " het hemelgewelf voor een bepaalde breedtegraad," PRINT " en van het seizoensverloop van de dagelijkse" PRINT " zonnebaan..." PRINT PRINT " = Andere hellingshoek evenaar-ecliptica." PRINT " Default=23.5=Aarde. Kies tussen 0 (=geen" PRINT " seizoenen) en 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 "Kies > (SPATIE = 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 "-> Hellingshoek evenaar-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 " -> Zeker? (SPATIE=END) " a$ = INPUT$(1) IF a$ <> " " GOTO Uitleg COLOR 15 END SUB celest 'stralen horizon , straal hemelgewelf '************************************ r1 = 200: r2 = 70: r3 = 200 'Kleuren '******* npl = 11: zpl = 9: eqr = 10: hor = 12: zon = 14: zon2 = 8: zon3 = 7 keus = 11 SCREEN 12 'Keuze breedtegraad '****************** Breed: CLS PLAY "l12o4d" LOCATE 28, 1: COLOR keus INPUT " -> Geef breedtegraad alfa op (-90 -> 90) :", arg IF ABS(arg) > 90 GOTO Breed CLS LOCATE 19, 19: COLOR 15: PRINT "Waarnemer..." CIRCLE (300, 300), 3 'Hemelgewelf tekenen of niet? '**************************** PLAY "l12o4d" LOCATE 28, 1: COLOR keus LINE INPUT " -> Hemelgewelf tekenen (Y=ja) "; cel$ IF cel$ = "y" THEN cel$ = "Y" IF cel$ = "Y" THEN LOCATE 4, 12: COLOR 15: PRINT "Hemelgewelf" END IF LOCATE 19, 19: COLOR 15: PRINT " " LOCATE 19, 3: PRINT "Horizon" LOCATE 28, 1: COLOR keus: PRINT " -> END = SPACE " 'Tekenen horizon '*************** LOCATE 28, 1: COLOR keus: PRINT " -> volgende fase = een toets ; 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 'hemelgewelf IF INKEY$ = " " THEN GOSUB Onderbreek NEXT alf% PLAY "l12o4d" SLEEP 3 'Tekenen N-Z as '************** COLOR hor: LOCATE 25, 45 IF arg = 90 THEN PRINT "Zuid" ELSE PRINT "Noord" alfa = 110 * pi / 180 'N-Z as 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 'Tekenen Zenitas '*************** COLOR hor: LOCATE 5, 36: PRINT "Zenit" LINE (300, 300)-(300, 300 - r1), hor SLEEP 3 IF INKEY$ = " " THEN GOSUB Onderbreek 'Tekenen evenaarsvlak '******************** COLOR eqr: LOCATE 10, 3: PRINT "Equatorvlak" COLOR hor IF arg = 90 THEN LOCATE 21, 8: PRINT "Zuid" LOCATE 18, 67: PRINT "Zuid" ELSEIF arg = -90 THEN LOCATE 21, 8: PRINT "Noord" LOCATE 18, 67: PRINT "Noord" ELSE LOCATE 21, 8: PRINT "Oost" LOCATE 18, 67: PRINT "West" END IF alfa = 20 * pi / 180 'O-W as xw = r1 * COS(alfa) yw = r2 * SIN(alfa) LINE (300 - xw, 300 + yw)-(300 + xw, 300 - yw), eqr 'Equatorvlak SLEEP 3 IF INKEY$ = " " THEN GOSUB Onderbreek alfa = 110 * pi / 180 'N-Z Equatoras beta = (90 - arg) * pi / 180 'opgegeven breedtegraad 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 'Equatorlijn IF INKEY$ = " " THEN GOSUB Onderbreek NEXT a SLEEP 3 'Tekenen Poolsteras '****************** IF arg > 0 THEN COLOR npl: LOCATE 13, 65: PRINT "Poolsteras" 'Poolsteras IF arg < 0 THEN COLOR zpl: LOCATE 13, 65: PRINT "Poolsteras" LOCATE 14, 69: PRINT "(Zuid)" END IF IF arg = 0 THEN COLOR npl: LOCATE 13, 65: PRINT "Poolsteras" COLOR zpl: LOCATE 14, 69: PRINT "(Zuid)" END IF alfa = (290) * pi / 180 'Poolsteras beta = arg * pi / 180 'opgegeven breedtegraad 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 'Bepalen twee solstitia '********************** COLOR zon LOCATE 7, 55: PRINT "Uiterste zonnebanen" gam0 = gam: gam = gam * pi / 180 'hoek equator-ecliptica GOSUB zon 'tekenen eerste baan gam = -gam GOSUB zon 'tekenen tweede baan gam = gam0 SLEEP 3 GOTO Eindcel 'Onderbreken '*********** Onderbreek: PLAY "l12o4d" LOCATE 28, 1: COLOR keus: PRINT " -> Zeker ? (Y = ja, andere toets = doorgaan) ": COLOR 15 a$ = INPUT$(1) IF a$ = "y" OR a$ = "Y" GOTO Eindcel LOCATE 28, 1: COLOR keus: PRINT " -> volgende fase = een toets ; END = SPACE ": COLOR 15 RETURN 'Tekenen hemelgewelf '******************* 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 'Tekenen zonnebaan '***************** 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 'waarnemer-baanmiddelpunt CIRCLE (300 + xq, 300 - yq), 2, zon 'centrum PSET (300, 300), zon2 Vlag = 0 FOR alf = 360 TO 0 STEP -.5 alfr = alf * pi / 180 z = s ' checken... v = c * SIN(alfr) '.... yy = z * SIN(beta) + v * COS(beta) '...of boven 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) 'checken... 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 'Afsluiten '********* Eindcel: LOCATE 28, 1: COLOR keus: PRINT " -> Druk tweemaal een toets... ": COLOR 15 PLAY "l12o4dp12d" a$ = INPUT$(1) LOCATE 28, 1: COLOR 12: PRINT " ": COLOR 15 LOCATE 2, 1: PRINT USING " > Breedtegraad : +##.##ø <"; arg: COLOR 15 gam = gam0 'herstel waarde 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 'straal hemelsfeer ' Kleuren... ' ********** win = 2: zom = 3: npl = 9: zpl = 10: eqr = 14: keus = 11 GOSUB Teken GOSUB Vraag 'Nieuwe cyclus '************* Niew: IF ABS(alf) > 90 GOTO Eindsol 'alf=breedtegraad 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: GOSUB Teken FOR eta = -gam TO gam STEP .2 'seizoenposities heen... GOSUB Reken IF INKEY$ <> "" GOTO Verder NEXT eta FOR eta = gam TO -gam STEP -.2 '... en weer GOSUB Reken IF INKEY$ <> "" GOTO Verder NEXT eta GOTO Herbegin Verder: GOSUB Vraag GOTO Niew 'Zonnebaan snijdt horizon '************************ Nulpunt: x3 = x1 - y1 * (x2 - x1) / (y2 - y1) IF y1 < 0 THEN x1 = x3: y1 = 0 IF y2 < 0 THEN x2 = x3: y2 = 0 RETURN 'Teken positiegegevens '********************* Teken: COLOR 15: LOCATE 24, 45: PRINT USING "Breedtegraad alfa :+##.##"; alf LOCATE 27, 41: COLOR keus: PRINT " -> Druk op een toets... " LOCATE 24, 1: COLOR zom: PRINT "Zomer noord, winter zuid" LOCATE 25, 1: COLOR win: PRINT "Winter noord, zomer zuid" LOCATE 26, 1 IF alf = 0 THEN COLOR 15: PRINT "Hemelpoolas "; : COLOR npl: PRINT "noord, "; : COLOR zpl: PRINT "zuid" ELSEIF alf > 0 THEN COLOR npl: PRINT "Hemelpoolas noord" ELSE COLOR zpl: PRINT "Hemelpoolas zuid" END IF LOCATE 27, 1: COLOR eqr: PRINT "Hemelequator" COLOR 15 LOCATE 9, 37: PRINT "Zenit" IF alf = 90 THEN 'aan Noordpool alles=zuid COLOR npl: LOCATE 19, 15: PRINT "Zuid": LOCATE 19, 62: PRINT "Zuid" ELSEIF alf = -90 THEN 'aan zuidpool alles=noord COLOR zpl: LOCATE 19, 15: PRINT "Noord": LOCATE 19, 62: PRINT "Noord" ELSE 'elders as noord-zuid LOCATE 19, 15: PRINT "Zuid": LOCATE 19, 62: PRINT "Noord" END IF COLOR 15 CIRCLE (320, 300), r, , 0, pi 'Hemelsfeer IF alf = 0 THEN 'Horizonvlak... LINE (320 - r, 300)-(320, 300), zpl '...op evenaar LINE (320, 300)-(320 + r, 300), npl ELSEIF ABS(alf) = 90 THEN '...aan polen LINE (320 - r, 300)-(320 + r, 300), eqr ELSE LINE (320 - r, 300)-(320 + r, 300), 15 '...elders. END IF IF alf > 0 THEN 'Poolas:... LINE (320, 300)-(320 + xp, 300 - yp), npl '...Noordas ELSE LINE (320, 300)-(320 - xp, 300 + yp), zpl '...Zuidas END IF LINE (320, 300)-(320 - yp, 300 - xp), eqr 'Equator RETURN 'Wacht op invoer '*************** Vraag: PLAY "l12o4d" LOCATE 27, 41: COLOR 3: PRINT " (Kies alfa > +/-90ø voor END)" LOCATE 25, 41: COLOR keus: INPUT " -> Nieuwe waarde "; alf: COLOR 15 RETURN 'Bereken en teken zonnebaan '************************** Reken: et = eta * pi / 180 v0 = r * SIN(-et): u0 = r * COS(-et) x1o = x1: y1o = y1: x2o = x2: y2o = y2 'oude waarden voor wissen 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 'wissen... 'tekenen... IF eta < 0 THEN col = zom 'zomer noord IF eta > 0 THEN col = win 'winter noord LINE (320 + x1, 300 - y1)-(320 + x2, 300 - y2), col 'teken... CIRCLE (320, 300), r, , 0, pi 'Herteken Hemelsfeer IF alf = 0 THEN 'Herteken Horizonvlak... LINE (320 - r, 300)-(320, 300), zpl '...op evenaar LINE (320, 300)-(320 + r, 300), npl ELSEIF ABS(alf) = 90 THEN '...aan polen LINE (320 - r, 300)-(320 + r, 300), eqr ELSE LINE (320 - r, 300)-(320 + r, 300), 15 '...elders. END IF IF alf >= 0 THEN 'Herteken poolas 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 'Herteken Equator Uit: RETURN 'Afsluiten '********* Eindsol: LOCATE 24, 1 PRINT " " PRINT " " PRINT " " PRINT " " PLAY "l12o4dp12d" COLOR keus: PRINT " -> Druk een toets...": COLOR 15 a$ = INPUT$(1) END SUB SUB terrest pi = ATN(1) * 4 'stralen aarde, horizonsfeer '*************************** r = 150: dr = 30: 'beginbreedtegraad en -increment '******************************* alf = 53: dalf = 1 'co”rd. aardemiddelpunt '********************** x0 = 280: y0 = 220 'Kleuren '******* SCREEN 12 npl = 9: zpl = 10: zen = 13: eqr = 14: ter = 3: cir = 7 keus = 11: incr = 3 LOCATE 4, 3: COLOR npl: PRINT "Noordpool" LOCATE 14, 3: COLOR eqr: PRINT "Evenaar" LOCATE 24, 3: COLOR zpl: PRINT "Zuidpool" LOCATE 4, 60: COLOR ter: PRINT "Aarde" LOCATE 6, 60: COLOR 15: PRINT "Horizonsfeer" LOCATE 8, 60: COLOR zen: PRINT "Zenit" LOCATE 10, 60: COLOR cir: PRINT "Breedtecirkel" PLAY "l12o4d" 'Cyclus '****** 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 " -> Verander alfa met + of -, increment met * of /, END=SPACE" LOCATE 16, 60: COLOR incr: PRINT USING "increment=##.## ø "; dalf COLOR 15 'Alles tekenen '************* 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 'Wachtcyclus invoer '****************** 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 'Alles wissen '************ 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 'Afsluiten '********* Eindter: PLAY "l12o4dp12d" LOCATE 28, 1: COLOR keus: PRINT " -> Druk tweemaal een toets... ": COLOR 15 a$ = INPUT$(1) LOCATE 28, 1: PRINT " " a$ = INPUT$(1) END SUB