'Lichtkegels 2D voor ruststelsel en bewegend stelsel beta=v/c 'ruimtevlak x,y; tijdas z=ct; 'projectie (x,y,z) op schermvlak x, z 'bewegend stelsel x',y',z'=ct' (Lorentz) -> projectiecoord. u,v in (x,z)-vlak 'init parameters '**************** pi = ATN(1) * 4: dpi = 3 'rotatiestapø projectiehoek y-as argy = -60: mody = 1 / (1.1 ^ 8) 'hoekø en eenheid projectie y-as in schermvlak yu = COS(argy * pi / 180) * mody: yv = SIN(argy * pi / 180) * mody'projectiefactoren y(u), y(v); y=y' beta = 0 'beta = v/c gam = 1 / SQR(1 - beta * beta) 'gamma(v) a = 95 'straal lichtkegel/lichtklok stap = 10 'aantal lichtstralen in -kegel wacht = 1000 'snelheid lichtstralen langsheen -kegel n = 360 / stap DIM xx(n), yy(n), zz(n) 'lichtstralen xx, yy, zz DIM uu(n), vv(n) 'proj.coord. retourpunten lichtkegel 'init Data$ '*********** view$(0) = "xyt": view$(1) = "xy " lor$(0) = "Off": lor$(1) = "On " standp$(0) = "ruststelsel": standp$(1) = "bew.stelsel" spoor$(0) = "Off": spoor$(1) = "On " 'scherm = x,z-vlak '(daarin x',y',ct' => projectie u,v) '****************** SCREEN 12 x = 100 * a / 95 'keuze eenheid WINDOW (-x * 2 * 1.33333, -x * 2)-(x * 2 * 1.33333, x * 2) 'VGA 'intro: '***** a$ = CHR$(0) + ";" 'wachtroutineparameter GOSUB lichintro GOSUB lichmenu a$ = "" 'hoofdcyclus '*********** her: 'toon status & controls '********************** LOCATE 1, 1 IF vlagstandpunt = 0 THEN COLOR 15 ELSE COLOR 11 PRINT USING "standpunt: & [SPATIE] "; standp$(vlagstandpunt); COLOR 11: PRINT USING "v/c: #.## [+,-] "; beta; COLOR 10: PRINT USING "view: & [0] "; view$(vlagminkow); COLOR 7: PRINT USING "spoor: & [.]"; spoor$(vlagspoor) LOCATE 28, 1 COLOR 1: PRINT USING "Lorentz: & [ENTER] "; lor$(vlaglorentz); COLOR 14: PRINT USING "SlowLite:##### [*,/] "; wacht; COLOR 15: PRINT USING "y-as: ####ø [Lt,Rt], ##.## [Up,Dn]"; argy; mody 'start- en eindpunt '****************** zt = a * gam: xt = zt * beta 'toppunt lichtkegel 'xo = -xt: yo = -yt 'vertrekpunt bewegend stelsel 'vaste referentielijnen: '*********************** 'scherm x,z/ruststelsel '********************** LINE (-x * 2, 0)-(x * 2, 0), 7 IF vlagminkow = 0 THEN LINE (0, -x)-(0, x), 7 LINE (-a, -a * .05)-(-a, a * .05): LINE (a, -a * .05)-(a, a * .05) 'eenheden IF vlagminkow = 0 THEN LINE (-a * .05, -a)-(a * .05, -a): LINE (-a * .05, a)-(a * .05, a) '... END IF 'bewegend stelsel '**************** IF vlagminkow = 0 THEN ' LINE (-xt, -zt)-(xt, zt), 3 ' z' = ct'-as ' (opm: de t'-as wordt gegenereerd met lopende positie van ' oorsprong bewegend stelsel) LINE (-a / gam - xt, -zt)-(-a / gam + xt, zt), 8 ' wereldlijn x'=-a/gam LINE (a / gam - xt, -zt)-(a / gam + xt, zt), 8 ' wereldlijn x'=a/gam LINE (-zt, -xt)-(zt, xt), 3 ' x'-as END IF LINE (-a * yu, -a * yv)-(0, 0), 7: LINE -(a * yu, a * yv), 15 ' y'= y-as 'lorentzvervormingen tonen '************************* IF vlagminkow = 0 THEN IF vlaglorentz = 1 THEN CIRCLE (a / gam, 0), a / 50, 11: LINE (a / gam, 0)-(a, 0), 11: CIRCLE (a, 0), a / 50, 15 CIRCLE (a, a * beta), a / 50, 15: LINE (a, a * beta)-(a * gam, a * gam * beta), 15: CIRCLE (a * gam, a * gam * beta), a / 50, 11 LINE (a, 0)-(a, a * beta), 1 LINE (a / gam, 0)-(a * gam, a * gam * beta), 1 CIRCLE (0, a * gam), a / 50, 11: LINE (0, a * gam)-(a * gam * beta, a * gam), 1: CIRCLE (a * gam * beta, a * gam), a / 50, 11 CIRCLE (0, a), a / 50, 15: LINE (0, a)-(a * gam * gam * beta, a * gam * gam), 1: CIRCLE (a * gam * gam * beta, a * gam * gam), a / 50, 15 LINE (0, a)-(0, a * gam), 11 LINE (a * gam * beta, a * gam)-(a * gam * gam * beta, a * gam * gam), 15 END IF END IF 'assen aanduiden '**************** LOCATE 16, 72: COLOR 7: PRINT "x" LOCATE 14, 72: COLOR 11: PRINT "x'" IF vlagminkow = 0 THEN LOCATE 5, 40: COLOR 7: PRINT "t "; : COLOR 11: PRINT "t'" END IF LOCATE 25, 72: COLOR 15: PRINT "y, y'" 'retourkromme in retourvlak lichtkegels '************************************** FOR k = 0 TO 360 / stap 'hoek per stap alg = k * stap * pi / 180 'hoek in rad xx(k) = a * gam * COS(alg) 'coord. retourpunt k yy(k) = a * SIN(alg) zz(k) = beta * xx(k) uu(k) = xx(k) + yy(k) * yu 'schermcoord. idem IF vlagminkow = 0 THEN vv(k) = zz(k) + yy(k) * yv 'x,y,z = minkowskyruimte ELSE '...of... vv(k) = 0 + yy(k) * yv 'x,y ruimte END IF IF k > 0 THEN LINE (uu(k - 1), vv(k - 1))-(uu(k), vv(k)), 5 'teken segment NEXT k 'omschrijvende rechthoek retourvlak lichtkegel '********************************************* xa = a * gam 'punt langs x-as ya = 0 IF vlagminkow = 0 THEN za = xa * beta 'x,y,z = minkowskyruimte ELSE '...of... za = 0 'x,y ruimte END IF ua = xa + ya * yu 'proj.coord. id. va = za + ya * yv xb = 0 'punt langs y-as yb = a zb = 0 '(ongeacht vlagminkow) ub = xb + yb * yu 'proj.coord. id. vb = zb + yb * yv LINE (ua - ub, va - vb)-(ua + ub, va + vb), 5 'tekenen op hoekpunten LINE -(-ua + ub, -va + vb), 13 LINE -(-ua - ub, -va - vb), 5 LINE -(ua - ub, va - vb), 5 'info tijdslimieten '****************** LOCATE 5, 1 IF vlagstandpunt = 0 THEN COLOR 15: PRINT USING "t : +#.## tot +#.##"; -zt / a; zt / a ELSE COLOR 11: PRINT "t': -1.00 tot +1.00" END IF 'begin cyclus lichtkegel (bundel lichtstralen) '********************************************* FOR tt = -zt TO zt STEP zt / wacht 'nieuwe tijdpositie 'cyclus lichtstralen in huidige tijdpositie : '****************************************** FOR k = 0 TO 360 / stap 'hoek voor lichtstraal (x,y) alg = k * stap * pi / 180 'hoek in rad 'volgens standpunt ruststelsel...(1) : '*********************************** IF vlagstandpunt = 0 THEN 'uitlopende lichtstralen...(1a) : '****************************** IF tt < zz(k) THEN xx = -xt + (tt + zt) * (xx(k) + xt) / (zz(k) + zt) yy = yy(k) * (tt + zt) / (zz(k) + zt) IF vlagminkow = 0 THEN zz = tt 'x,y,z = minkowskyruimte ELSE '...of... zz = 0 'x,y ruimte END IF '(vlagminkow) '... en teruglopende lichtstralen (1b) : '************************************* ELSE '(tt) xx = xt + (zt - tt) * (xx(k) - xt) / (zt - zz(k)) yy = yy(k) * (zt - tt) / (zt - zz(k)) IF vlagminkow = 0 THEN zz = tt 'x,y,z = minkowskyruimte ELSE '...of... zz = 0 'x,y ruimte END IF '(vlagminkow) END IF '(tt) '... of volgens standpunt bewegend stelsel (2) : '********************************************* ELSE '(vlagstandpunt) 'uitlopende lichtstralen...(2a) : '****************************** IF tt < 0 THEN xx = -xt + (tt + zt) * (xx(k) + xt) / zt yy = yy(k) * (tt + zt) / zt IF vlagminkow = 0 THEN zz = -zt + (tt + zt) * (zz(k) + zt) / zt 'x,y,z = minkowskyruimte ELSE '...of... zz = 0 'x,y ruimte END IF '(vlagminkow) '... en teruglopende lichtstralen (2b) : '************************************* ELSE '(tt) xx = xt + (zt - tt) * (xx(k) - xt) / zt yy = yy(k) * (zt - tt) / zt IF vlagminkow = 0 THEN zz = zt + (zt - tt) * (zz(k) - zt) / zt 'x,y,z = minkowskyruimte ELSE '...of... zz = 0 'x,y ruimte END IF '(vlagminkow) END IF '(tt) END IF '(vlagstandpunt) 'teken lichtstraal k : '******************* PSET (uu(k), vv(k)), colsp 'herkleur vorige positie uu(k) = xx + yy * yu 'schermcoord. nieuwe positie vv(k) = zz + yy * yv PSET (uu(k), vv(k)), 14 'kleur nieuwe positie 'volgende lichtstraal in huidige tijdpositie : '******************************************* NEXT k 'huidige positie oorsprong bewegend stelsel tonen en t'-as genereren '******************************************************************* PSET (uo, vo), 0 'vorige positie xo = beta * tt 'nieuwe pos. xyz yo = 0 IF vlagminkow = 0 THEN zo = tt ELSE zo = 0 '2D of 3D... IF tt = 0 THEN factor = 0 ELSE factor = zo / tt '" " uo = xo + yo * yu 'schermcoord. uv vo = zo + yo * yv '" " LINE (-xt, -zt * factor)-(xt, zt * factor), 3 'wereldlijn (t'-as) of traject 2D PSET (uo, vo) 'huidige positie 'toetsen scannen : '*************** a$ = INKEY$ 'toets ingedrukt ? : '***************** IF a$ <> "" THEN GOSUB toetscontrole 'wachten of doorgaan ? : '********************* IF b$ = a$ THEN 'zelfde toets als "vorige" = wachten SLEEP ELSE b$ = "" '"vorige" herinitialiseren, niet wachten 'posities lichtstralen herinitialiseren : '************************************** FOR m = 0 TO n: uu(m) = 0: vv(m) = 0: NEXT m 'hoofdcyclus zonder verwijl herbeginnen : '************************************** GOTO verder END IF '(b$) END IF '(a$) 'volgende tijdpositie lichtstralen : '********************************* NEXT tt 'huidige cyclus lichtkegel verlaten : '********************************** verder: '******* 'spoor lichtkegel traceren of niet ? : '*********************************** IF vlagspoor = 0 THEN colsp = 0 ELSE spoortel = (spoortel + 1) MOD 4 SELECT CASE spoortel CASE 0: colsp = 0 CASE 1: colsp = 8 CASE 2: colsp = 6 CASE ELSE: colsp = 8 END SELECT END IF 'nieuwe cyclus lichtkegel beginnen : '********************************* GOTO her END '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' toetscontrole: '************* SELECT CASE a$ CASE "": 'volgende CASE "+": 'increase beta IF beta < .9 THEN beta = beta + .05: gam = 1 / SQR(1 - beta * beta) CLS : CASE "-": 'decrease beta IF beta > -.9 THEN beta = beta - .05: gam = 1 / SQR(1 - beta * beta) CLS : CASE "*": 'snelheid lichtstralen verlagen IF wacht < 10000 THEN wacht = wacht * 1.5 ELSE PLAY "l24o4c" CLS : CASE "/": 'snelheid lichtstralen verhogen IF wacht > 10 THEN wacht = wacht / 1.5 ELSE PLAY "l24o4c" CLS : CASE " ": 'vlag standpunt rust- of bewegend stelsel vlagstandpunt = ABS(vlagstandpunt - 1) CLS : CASE CHR$(0) + "K": 'hoek y-as in (u,v) increase argy = (argy - dpi) MOD 360 yu = COS(argy * pi / 180) * mody: yv = SIN(argy * pi / 180) * mody CLS : CASE CHR$(0) + "M" 'hoek y-as in (u,v) decrease argy = (argy + dpi) MOD 360 yu = COS(argy * pi / 180) * mody: yv = SIN(argy * pi / 180) * mody CLS : CASE CHR$(0) + "H" 'projectielengte y-as in (u,v) increase IF mody < 1.2 THEN mody = mody * 1.1 yu = COS(argy * pi / 180) * mody: yv = SIN(argy * pi / 180) * mody CLS : CASE CHR$(0) + "P" 'projectielengte y-as in (u,v) decrease IF mody > .1 THEN mody = mody / 1.1 yu = COS(argy * pi / 180) * mody: yv = SIN(argy * pi / 180) * mody CLS : CASE CHR$(13): 'lorentzvervormingen tonen on/off vlaglorentz = ABS(vlaglorentz - 1) CLS : CASE "0" 'minkowsky (xyt) of ruimtelijk (xy) vlagminkow = ABS(vlagminkow - 1) CLS : CASE "." 'spoor lichtstralen on/off vlagspoor = ABS(vlagspoor - 1) CLS CASE CHR$(27): 'ESCAPE = stop END CASE CHR$(0) + ";": 'F1 = helpmenu GOSUB lichmenu CASE ELSE: 'andere toets = Pauseren en weer verder IF b$ = "" THEN 'al eerder een toets gedrukt?... b$ = a$ 'nee: memoriseer huidige toets LOCATE 1, 1: PRINT "zelfde toets = STEP, andere = doorgaan " ELSEIF b$ <> a$ THEN 'ja: tweede = zelfde toets? b$ = "" 'nee: "vorige" toets vergeten... END IF END SELECT RETURN ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' lichmenu: '********* CLS : LOCATE 3, 20: 'COLOR 11 PRINT "RELATIVITEIT : lichtklokken 2D/3D " COLOR 3 PRINT "Bewegende lichtklokken als stralen in 2D-ruimte en kegels in 3D-ruimtetijd" COLOR 15: PRINT PRINT " CONTROLETOETSEN:" COLOR 2 PRINT " '+' ........... snelheidsverhouding v/c verhogen met +0.05" PRINT " '-' ........... snelheidsverhouding v/c verlagen met -0.05" PRINT " '*' ........... afspeelsnelheid lichtstralen verkleinen ('SlowLite')" PRINT " '/' ........... afspeelsnelheid lichtstralen vergroten ('SlowLite')" PRINT " '0' ........... toggel 3D/2D : (xyt)=Minkowsky / (xy)=ruimtelijk" PRINT " '.' ........... toggel lichtstralen tracen (=lichtkegel) On / Off" PRINT " ENTER ......... toggel Lorentzvervormingen tonen On / Off" PRINT " SPATIE ........ toggel standpunt ruststelsel / bewegend stelsel" PRINT " pijl LEFT ..... draai projectie y-as naar links" PRINT " pijl RIGHT .... draai projectie y-as naar rechts" PRINT " pijl UP ....... maak projectie y-as langer" PRINT " pijl DOWN ..... maak projectie y-as korter" PRINT " F1 ............ dit menu tonen en verder" PRINT " ESCAPE ........ END" COLOR 15: LOCATE 24, 20: PRINT "CREDITS:" COLOR 12: LOCATE 25, 20: PRINT "guido wuyts 2003" GOSUB wacht RETURN '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' lichintro: '******** CLS : LOCATE 3, 20: PRINT "RELATIVITEIT : lichtklokken 2D/3D " COLOR 3 PRINT "Bewegende lichtklokken als stralen in 2D-ruimte en kegels in 3D-ruimtetijd" PRINT : COLOR 15 PRINT " DISPLAY:" COLOR 3: PRINT " ______ x't' assen bewegend stelsel van lichtklok" COLOR 6: PRINT " :::::"; COLOR 7: PRINT ":::::"; COLOR 14: PRINT ": lichtstralenfront 2D," COLOR 6: PRINT " ::::"; COLOR 7: PRINT "::::::"; COLOR 14: PRINT ": "; COLOR 7: PRINT "lichtkegels 3D (=tracing lichtstralen)" COLOR 5: PRINT " ______ snijvlak en -kromme lichtkegels heen/terug" COLOR 1: PRINT " ------ Lorentzvervormingen (lengte, tijd) indien getoond" COLOR 15: PRINT COLOR 15: LOCATE 24, 20: PRINT "CREDITS:" COLOR 12: LOCATE 25, 20: PRINT "guido wuyts 2003" GOSUB wacht RETURN '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' wacht: '**** klr = 11: c$ = "" wachtnog: COLOR klr: LOCATE 27, 17 PRINT "-> toets F1 = verdergaan, ESC = END" tijd = TIMER: WHILE TIMER - tijd < .5: c$ = INKEY$ IF c$ <> "" GOTO wachttoetsctrl WEND IF klr = 11 THEN klr = 3 ELSE klr = 11 GOTO wachtnog wachttoetsctrl: IF c$ = CHR$(27) THEN END IF c$ <> a$ THEN GOTO wachtnog c$ = "": CLS : COLOR 15 RETURN ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' END