dim image1(10000)
dim as single amplitude(largeur,hauteur)
dim as single facteur, xCoord, contraste, gamma, rayon, amplit, xPrime, tPrime
dim as single pi, deuxPi, angle, phase, flottante, theta, distance, temps, deltaTemps
dim as single DopplerAvant, DopplerArriere, rapport, xCentre, xGauche, xDroit, xRetour
dim as single beta, facteurG, pas, phase2, chrono, tempsLocal, x, rayonSignal, rayonEcho
screen 19,24,3: page1 = 1: gosub Initialisation

do'                        CALCUL DES TRANSFORMATIONS DE LORENTZ.
  swap page1, page2
  screenset page1, page2
  pcopy 2, page1
  Saisie$ = inkey
  if len(Saisie$) then
    capture = 0
    if len(Saisie$) = 2 then Saisie$ = right(Saisie$, 1) + "+" else Saisie$ = ucase(Saisie$)
    select case Saisie$
      case "A": mode$ = "accélération"
      case "D": mode$ = "départ"
                xCentre = origine
      case "I": gosub Initialisation
      case "P": mode$ = "pause"
                xCentre = origine + beta * secondeLumiere
      case "T": mode$ = "translation"
      case "R": mode$ = "renseignements"
                chrono = 1'                               'confirmer les équations du tableau.
                if vitesse$ = "0" then vitesse$ = ".866"
      case "k+", "X+", chr(27): end
      
      case "M": run "Ether00.exe"
      case "K+":run "Ether13.exe"                         'flèche gauche.
      case "M+":run "Ether15.exe"                         'flèche droite.  
      case "1": vitesse$ = ".1"
      case "2": vitesse$ = ".2"
      case "3": vitesse$ = ".3"
      case "4": vitesse$ = ".4"
      case "5": vitesse$ = ".5"
      case "6": vitesse$ = ".6"
      case "7": vitesse$ = ".707"
      case "8": vitesse$ = ".8"
      case "9": vitesse$ = ".866"
      case "0": vitesse$ =  "0"
      case "+": if mode$ <> "déplacement" then mode$ = "déplacement": gosub MiseAJour
      case "-": if mode$ <> "déplacement" then mode$ = "déplacement": gosub MiseAJour
      case chr$(13): texte = texte + 1
                if texte > 5 then texte = 0
      case else: Saisie$ = "nul"
    end select
    do: loop while len(inkey)                             'vider le tampon.
    if Saisie$ = "nul" then else gosub MiseAJour
  end if

  getmouse xSouris, ySouris, , clic                       'saisie Souris.
  ligne = .5 + ySouris / 16
  if ligne > 22 and ligne < 35 then ligne = 0
  if ligne < 23 then
    if ligne < 7 or xSouris < 552 then ligne = 0
  elseif ligne > 34 then
    if ligne > 37 or xSouris < 304 or xSouris > 496 then ligne = 0
  end if

  if clic = 1 then
    select case ligne
      case 7:  vitesse$ =  "0"
      case 8:  vitesse$ = ".1"
      case 9:  vitesse$ = ".2"
      case 10: vitesse$ = ".3"
      case 11: vitesse$ = ".4"
      case 12: vitesse$ = ".5"
      case 13: vitesse$ = ".6"
      case 14: vitesse$ = ".707"
      case 15: vitesse$ = ".8"
      case 16: vitesse$ = ".866"
      case 17: clic = 0
      case 18: mode$ = "départ"
      case 19: mode$ = "pause"
      case 20: mode$ = "translation"
      case 21: mode$ = "accélération"
      case 22: mode$ = "renseignements"
               chrono = 1'                                'confirmer les équations du tableau.
               if vitesse$ = "0" then vitesse$ = ".866"
      case 35: gosub Initialisation
      case 36: end
      case 37: if xSouris < 400 then run "Ether13.exe" else run "Ether15.exe"
      case else:
                 ligne = 0
    end select
    if ligne then clic = 0: gosub MiseAJour
    if clic = 1 and mode$ <> "déplacement" then mode$ = "déplacement": gosub MiseAJour
  end if
  
  select case mode$
    case "pause":          gosub Pause
    case "départ" :        gosub Depart
    case "déplacement":    gosub Deplacement
    case "translation":    gosub Translation
    case "accélération":   gosub Acceleration
    case "renseignements": gosub Renseignements
  end select
  color , turquoise: locate ligne, 70
  select case ligne                                       'rehausser l'affichage.
    case 7:  if vitesse$ <> "0"    then print ligne07$
    case 8:  if vitesse$ <> ".1"   then print ligne08$
    case 9:  if vitesse$ <> ".2"   then print ligne09$
    case 10: if vitesse$ <> ".3"   then print ligne10$
    case 11: if vitesse$ <> ".4"   then print ligne11$
    case 12: if vitesse$ <> ".5"   then print ligne12$
    case 13: if vitesse$ <> ".6"   then print ligne13$
    case 14: if vitesse$ <> ".707" then print ligne14$
    case 15: if vitesse$ <> ".8"   then print ligne15$
    case 16: if vitesse$ <> ".866" then print ligne16$
    case 18: if mode$ <> "départ"         then print ligne18$
    case 19: if mode$ <> "pause"          then print ligne19$
    case 20: if mode$ <> "translation"    then print ligne20$
    case 21: if mode$ <> "accélération"   then print ligne21$
    case 22: if mode$ <> "renseignements" then print ligne22$
    case 35: locate, 39: print ligne35$
    case 36: locate, 39: print ligne36$
    case 37: locate, 39: print ligne37$;
             if xSouris < 400 then gosub flecheGauche else gosub flecheDroite
  end select

  color noir, fond
  if bitmap then gosub Bitmaps                            'capture d'images si désiré.
  image = image + 1: if image > images then image = 1
loop

'--------------------------------------- ACCÉLÉRATION ----------------------------------------
Acceleration:
beta = beta + .01                                         'pas d'un centième.
if beta > .866 then beta = 0
facteurG = sqr(1 - beta ^ 2)                              'facteur de contraction de Lorentz.
deltaTemps = -x * beta                                    'décalage horaire, temps apparent.
temps = (x - deltaTemps) / facteurG                       'temps absolu à écouler.
xCentre = origine + diametre * beta * temps               'point avec t' = x.
'xCentre = origine + beta * secondeLumiere                'point avec t = 1.
'xCentre = origine + rayon * beta / facteurG              'point d'égalité des deux ondes.
gosub Diagramme
color rouge, blanc
line(138,300)-(237,321),blanc, bf
line(138,300)-(237,321),noir, b
locate 20, 19: print "Bˆta = ";: print using "#.##"; beta
sleep 100
if clic = 1 then mode$ = "déplacement": gosub MiseAJour: return
color noir
return

Bitmaps:'------------------------- Créer une séquence bitmap ---------------------------------
select case capture
  case is < 10: numero$ = "00"
  case is < 100: numero$ = "0"
  case is < 1000: numero$ = ""
end select
fichier$ = "capture" + numero$ + str(capture) + ".bmp"
locate 34, 43: print fichier$
'bsave fichier$,0
capture = capture + 1
if capture > images - 1 then end 
color noir, fond
return

'------------------------------------- POINT DE DÉPART ---------------------------------------
Depart:
xCentre = origine
gosub Diagramme
return

'--------------------------------- DÉPLACEMENT AVEC LA SOURIS --------------------------------
Deplacement:
gosub Diagramme
if beta = 0 then return
if clic = 1 then
  do
    swap page1, page2
    screenset page1, page2
    pcopy 2, page1
    if xSouris > -1 then xCentre = xSouris
    gosub Diagramme
    getmouse xSouris, ySouris, , clic                     'saisie Souris continuelle.
  loop while clic = 1
end if

if Saisie$ = "+" or Saisie$ = "-" then
xCentre = int(xCentre)                                    'pas d'un pixel exactement.
  do
    swap page1, page2
    screenset page1, page2
    pcopy 2, page1
    if Saisie$ = "+" then xCentre = xCentre + 1
    if Saisie$ = "-" then xCentre = xCentre - 1
    gosub Diagramme
    Saisie$ = inkey                                       'saisie clavier continuelle.
  loop until Saisie$ = "" 
end if  
return

'---------------------------------- AFFICHER LE DIAGRAMME ------------------------------------
Diagramme:
color noir, fond
circle(origine, yCentre), rayon, grisClair                'sphère au repos.
circle(xCentre, yCentre), rayon, noir,,,1 / facteurG      'mobile contracté.
line(xCentre, yCentre - rayon)-(xCentre, yCentre + rayon), noir   'repère, centre du mobile.
line(origine - rayon, yCentre)-(origine + rayon, yCentre), grisClair
line(xCentre - facteurG * rayon, yCentre)-(xCentre + facteurG * rayon, yCentre), grisClair
distance = (xCentre - origine) / secondeLumiere           'distance en secondes lumière.
if beta then chrono = distance / beta else chrono = 0     'chronomètre en temps absolu.
rayonSignal = (xCentre - origine) / beta                  'rayon de l'onde émise à x=0, t=0.
xRetour = origine + diametre * beta / facteurG            'point de réception de l'écho radar.
rayonEcho = (xRetour - xCentre) / beta                    'rayon de l'onde écho radar.
if rayonSignal < 0 then rayonSignal = 0
if rayonEcho < 0 then rayonEcho = 0
if rayonSignal > 1000 then rayonSignal = 0
if rayonEcho > 1000 then rayonEcho = 0
circle(origine, yCentre), rayonSignal, bleuClair          'onde émise par O à x=0, t=0.
circle(xRetour, yCentre), rayonEcho, bleuClair            'onde reçue par O au point xRetour.
line(origine - 60, yCentre - 87)-(origine + 60, yCentre - 35), blanc, bf' système au repos
line(origine - 60, yCentre - 87)-(origine + 60, yCentre - 35), noir, b  ' (sert de gabarit).

if vitesse$ = ".707" then                                 'préciser les points hors-série.
  line(origine + .707 * diametre, diametre - 40)-(origine + .707 * diametre, 20 + diametre), noir
  locate 20,50: print vitesse$
elseif vitesse$ = ".866" then
  line(origine + .866 * diametre, diametre - 40)-(origine + .866 * diametre, 20 + diametre), noir
  locate 20,57: print vitesse$
end if
color noir, blanc

xCoord = origine + rayon * beta / facteurG                'point d'égalité des deux ondes.
xCoord = xCoord - rayon / (beta * facteurG)               'point de départ de l'onde de phase.
if beta then xPhase = xCoord + diametre * chrono / beta else xPhase = origine' onde de phase.
locate 7, 18: print "t'= x = 0,5"                         'à coller vis-à-vis le repère.
locate 8, 18: print "Onde de phase"
locate 9, 18: print "v = 1 / beta"
get(128,93)-(248,145), image1                             'copier et coller.
line(xPhase, yCentre - rayon)-(xPhase, yCentre + rayon), bleuClair' repère de l'onde de phase.
if beta then put(xPhase - 60, yCentre - 140), image1, pset 'boîte sur l'onde de phase.
line(origine - 59, yCentre - 86)-(origine + 59, yCentre - 36), blanc, bf 'effacer
tempsLocal = facteurG * chrono
locate 7, 18: print using "x'= #.###"; distance           'à coller au centre du mobile.
locate 8, 18: print "Temps local O"
locate 9, 18: print using "t'= #.### sec"; tempsLocal     'temps apparent au centre du mobile.
get(128,93)-(248,145), image1                             'copier et coller au centre du mobile.
put(xCentre - 60,yCentre + 37), image1, pset              'boîte au centre du mobile.
line(origine - 59, yCentre - 86)-(origine + 59, yCentre - 36), blanc, bf 'effacer

color marron, blanc                                        'repère fixe, ou référence.
line(origine + rayon - 50, yCentre - 72)-(origine  + rayon + 50, yCentre - 35), blanc, bf 'effacer
line(origine + rayon - 50, yCentre - 72)-(origine  + rayon + 50, yCentre - 35), noir, b
line(origine + rayon - 6, yCentre - 35)-(origine  + rayon + 6, yCentre - 35), 1
line(origine + rayon - 6, yCentre - 35)-(origine  + rayon, yCentre - 10), 1
line(origine + rayon + 6, yCentre - 35)-(origine  + rayon, yCentre - 10), 1
paint(origine + rayon, yCentre - 34),noir, 1
locate 8,39: print "RepŠre fixe"
locate 9,39: print "  x = 0,5  "
xGauche = xCentre - facteurG * rayon                      'x gauche en pixels.
line(xGauche, yCentre)-(xGauche, yCentre + rayon), noir   'repère, x gauche.
xDroit = xCentre + facteurG * rayon                       'x droit en pixels.
line(xDroit, yCentre)-(xDroit, yCentre + rayon), noir     'repère, x droit.
xPrime = (xCentre - origine + facteurG * rayon) / secondeLumiere 'x droit en secondes lumière.
xPrime = facteurG * x + beta * chrono                     'même valeur, calcul plus correct.
tPrime = facteurG * chrono - x * beta                     'temps local à droite du mobile.
locate 7, 18: print using "x'= #.###"; xPrime             'à coller à droite du mobile.
locate 8, 18: print "Temps local B"
locate 9, 18: print using "t'= #.### sec"; tPrime             'temps apparent à droite du mobile.
get(128,93)-(248,145), image1                             'copier et coller à droite du mobile.
put(xDroit - 60, yCentre - 25), image1, pset              'boîte à droite du mobile.
line(origine - 59, yCentre - 86)-(origine + 59, yCentre - 36), blanc, bf' effacer

gosub Equations
color noir, blanc
xPrime = (xCentre - origine - facteurG * rayon) / secondeLumiere 'x gauche en secondes lumière.
tPrime = facteurG * chrono + x * beta                     'temps local à gauche du mobile.
locate 7, 18: print using "x'= #.###"; xPrime             'à transférer à gauche du mobile.
locate 8, 18: print "Temps local A"
locate 9, 18: print using "t'= #.### sec"; tPrime         'temps apparent à gauche du mobile.
get(128,93)-(248,145), image1                             'copier et coller à gauche du mobile.
put(xGauche - 60, yCentre - 25), image1, pset             'boîte à gauche du mobile.
line(origine - 59, yCentre - 86)-(origine + 59, yCentre - 36), blanc, bf' effacer
locate 7, 22: print "x = 0"
locate 8, 19: print "Temps absolu"
locate 9, 18: print using "t = #.### sec"; chrono
color noir, fond
return

'------------------------------------ TABLEAU DES ÉQUATIONS ----------------------------------
Equations:
line(525,362)-(792,437), blanc, bf
line(525,362)-(792,437), noir, b
xPrime = facteurG * x + beta * chrono                     'même valeur, calcul plus correct.
tPrime = facteurG * chrono - x * beta                     'temps local à droite du mobile.
color marron, blanc                                       'afficher les équations en marron.
locate 24, 68: print "x'= +";                             'utiliser les équations véritables
if xPrime > 0 then locate , 73 else locate , 72           'pour les valider.
print using "#.### "; facteurG * x + beta * chrono;: print "= g * x + beta * t"
locate 25, 68: print "t'= +";
if tPrime > 0 or beta = 0 then locate , 73 else locate , 72 
print using "#.###"; facteurG * chrono - beta * x;:  print " = g * t - bˆta * x"
locate 26, 68: print "x = +";                             'valeur fixe en guise d'exemple.
locate , 73: print using "#.###"; (xPrime - beta * chrono) / facteurG;: print " = (x'- beta * t) / g"
locate 27, 68: print "t = +";
if chrono >= 0 then locate , 73 else locate , 72 
print using "#.###"; (tPrime + beta * x) / facteurG ;: print " = (t'+ bˆta * x) / g"
color noir, fond
return

'-------------------------------- MISE À JOUR DES DONNÉES ------------------------------------
MiseAJour:
screenset 2
color noir, fond
locate 7, 70:  print ligne07$
locate 8, 70:  print ligne08$
locate 9, 70:  print ligne09$
locate 10, 70: print ligne10$
locate 11, 70: print ligne11$
locate 12, 70: print ligne12$
locate 13, 70: print ligne13$
locate 14, 70: print ligne14$
locate 15, 70: print ligne15$
locate 16, 70: print ligne16$
locate 18, 70: print ligne18$
locate 19, 70: print ligne19$
locate 20, 70: print ligne20$
locate 21, 70: print ligne21$
locate 22, 70: print ligne22$

color bleu, fond
beta = val(vitesse$)
select case vitesse$                                      'indiquer la vitesse en cours.
  case "0":    locate 7, 70:  print ligne07$
               mode$ = "départ"                           'translation impossible
  case ".1":   locate 8, 70:  print ligne08$
  case ".2":   locate 9, 70:  print ligne09$
  case ".3":   locate 10, 70: print ligne10$
  case ".4":   locate 11, 70: print ligne11$
  case ".5":   locate 12, 70: print ligne12$
  case ".6":   locate 13, 70: print ligne13$
  case ".707": locate 14, 70: print ligne14$
               beta = sin(pi / 4)
  case ".8":   locate 15, 70: print ligne15$
  case ".866": locate 16, 70: print ligne16$
               beta = sin(pi / 3)
end select
select case mode$                                         'indiquer le mode en cours.
  case "départ":         locate 18, 70: 
                         if vitesse$ = "0" then print ligne18a$ else print ligne18$
                         xCentre = origine
  case "pause":          locate 19, 70: print ligne19$
                         xCentre = origine + beta * secondeLumiere
  case "translation":    locate 20, 70: print ligne20$
                         xCentre = 0
  case "accélération":   locate 21, 70: print ligne21$
  case "renseignements": locate 22, 70: print ligne22$
end select
'                               CALCUL DES VARIABLES DE BASE
color noir, fond
theta = asin(beta)                                        'inclinaison des ondes transversales.
facteurG = sqr(1 - beta ^ 2)                              'facteur de contraction de Lorentz.
gamma = 1 / facteurG                                      'facteur gamma de la Relativité.
deltaTemps = -x * beta
locate 30, 64: print "Bˆta: ";: print using "#.####"; beta;: print " = sin(thˆta) = v / c"
locate 31, 64: print "Thˆta: ";: print using "##.###"; theta * 180 / pi;: print chr(248);: print " = arc sin(bˆta)"
locate 32, 64: print "Facteur g: ";: print using "#.####"; facteurG;: print " = sqr(1 - beta ^ 2)"
locate 33, 64: print "Facteur gamma: ";: print using "#.####"; gamma;: print " = 1 / g"
locate 34, 64: print "D‚calage horaire: ";: print using "#.###"; deltaTemps;: print " = -x * beta"
screenset page1, page2
return

'--------------------------------- PAUSE APRÈS UNE SECONDE -----------------------------------
Pause:
xCentre = origine + beta * secondeLumiere
gosub Diagramme
return

'-------------------------------------- RENSEIGNEMENTS ---------------------------------------
Renseignements:
line(0,0)-(548,371), fond, bf
line(0,6)-(548,371), noir, b
line(1,7)-(547,370), noir, b
color noir, fond
select case texte
  case 0: gosub texte0
  case 1: gosub texte1
  case 2: gosub texte2
  case 3: gosub texte3
  case 4: gosub texte4
  case 5: gosub texte5
end select
locate 23, 25: print "Appuyez sur [ Entr‚e ]."
gosub Equations
return

'-------------------------------------- RENSEIGNEMENTS ---------------------------------------
texte0:
locate 1, 27:print " RENSEIGNEMENTS "
print
locate ,2: print "Utilisez la souris ou les touches [+ -] pour d‚placer le mobile."
locate ,2: print "Pour modifier la vitesse bˆta, appuyez sur un chiffre de 1 … 9."
print
locate ,2: print "Pour ne pas compliquer inutilement les calculs, on ne considŠre"
locate ,2: print "ici qu'une seule distance en abscisses, soit x = 0,5 de maniŠre …"
locate ,2: print "obtenir une sphŠre dont le diamŠtre mesure une seconde lumiŠre.  "
print
locate ,2: print "On pr‚sume que cette sphŠre est occup‚e par trois observateurs. B "
locate ,2: print "est … l'avant, l'amiral O est au centre et A … est l'arriŠre. Ils "
locate ,2: print "subiront une contraction selon le facteur g de Lorentz. Les horlo-"
locate ,2: print "ges indiqueront des secondes plus lentes qui pr‚senteront un d‚ca-"
locate ,2: print "lage horaire de";: print using " #.### SECONDE LOCALE"; -x * beta;: print " selon: -x * beta."
print
locate ,2: print "Un observateur fixe post‚ … l'origine (x = 0) demande … l'observa- "
locate ,2: print "teur central de remettre ses horloges … z‚ro au moment o— ils se   "
locate ,2: print "croisent. Ce dernier ‚met un signal pour que les deux autres obser-"
locate ,2: print "vateurs synchronisent leurs horloges. Sachant qu'ils sont distants "
locate ,2: print "d'une demi-seconde lumiŠre de l'amiral O, tous les observateurs si-"
locate ,2: print "tu‚s sur la surface de la sphŠre r‚gleront leurs horloges … 0,5 sec"
locate ,2: print "dŠs la r‚ception du signal... L'effet Doppler est diabolique!"
return

'-------------------------------- TEXTE SUR L'EFFET DOPPLER ----------------------------------
texte1:
locate 1, 20:print " L'EFFET DOPPLER DE LA MATIERE "
print
locate ,2: print "Parce que sa fr‚quence ralentit avec sa vitesse selon le facteur g "
locate ,2: print "de Lorentz, la matiŠre est sujette … un effet Doppler trŠs particu-"
locate ,2: print "lier. Les champs de force et la lumiŠre qu'elle ‚met sont eux aussi"
locate ,2: print "soumis … cet effet Doppler. Ainsi son fonctionnement demeure stable"
locate ,2: print "et un observateur entraŒn‚ avec elle se croit toujours au repos."
print
locate ,2: print "Effet Doppler en fr‚quence:"
DopplerAvant = facteurG / (1 - beta)
locate ,2: print "avant:   F'= ";: print using "#.### F "; DopplerAvant;
print " = g / (1 - beta) =  sqr(2 / (1 - beta) - 1)"
DopplerArriere = facteurG / (1 + beta)
locate ,2: print "arriŠre: F'= ";: print using "#.### F "; DopplerArriere;
print " = g / (1 + beta) =  sqr(2 / (1 + beta) - 1)"
print
locate ,2: print "Effet Doppler en longueur d'onde: lambda' ="
DopplerAvant = (1 - beta) / facteurG
locate ,2: print "avant:   ";: print using "#.### lambda"; DopplerAvant;
print " = (1 - beta) / g  =  sqr(2 / (1 + beta) - 1)"
DopplerArriere = (1 + beta) / facteurG
locate ,2: print "arriŠre: ";: print using "#.### lambda"; DopplerArriere;
print " = (1 + beta) / g  =  sqr(2 / (1 - beta) - 1)"
print
locate ,2: print "R‚ciprocit‚:"
locate ,2: print "              fr‚quence avant = 1 / fr‚quence arriŠre."
locate ,2: print "              fr‚quence avant = longueur d'onde arriŠre."
print
locate ,2: print "La masse de la matiŠre augmente … cause de cet effet Doppler:"
locate ,2: print "m' = ";: print using "#.#### kg"; (DopplerAvant + DopplerArriere) / 2;
           print "  =  (avant + arriŠre) / 2  =  facteur gamma."
return

'------------------------------- TEXTE SUR LE SCANNER DU TEMPS -----------------------------------
texte2:
locate 1, 25: print " LE SCANNER DU TEMPS "
print
locate ,2: print "En mars 2004, j'inventais un dispositif capable de reproduire les  "
locate ,2: print "effets des transformations de Lorentz. Je m'‚tais inspir‚ des cam‚-"
locate ,2: print "ras … scanner, qui produisent des images selon un balayage prolon- "
locate ,2: print "g‚ dans le temps. Il est clair que deux horloges espac‚es photogra-"
locate ,2: print "phi‚es de cette maniŠre n'indiqueront plus la mˆme heure. De plus, "
locate ,2: print "la vitesse d'impression peut ˆtre plus lente que la vitesse de ba- "
locate ,2: print "layage, ce qui permet d'obtenir des images contract‚es conform‚ment"
locate ,2: print "au facteur de contraction g de Lorentz."
print
locate ,2: print "J'ai alors d‚couvert avec stup‚faction que ce dispositif produisait"
locate ,2: print "un effet Doppler parfait. Or cela n'a rien de surprenant car c'est "
locate ,2: print "Woldemar Voigt qui a mis au point les ‚quations dont s'est inspir‚ "
locate ,2: print "Lorentz, pr‚cis‚ment dans le but de corriger l'effet Doppler."
print
locate ,2: print "C'est pour cette raison que les ‚quations de Lorentz ont la propri-"
locate ,2: print "‚t‚ de corriger l'effet Doppler. En permutant les variables x et x'"
locate ,2: print "on peut donc le provoquer. Cela d‚montre qu'il faut aussi permuter "
locate ,2: print "ces variables pour obtenir la contraction de la matiŠre, ce qui est"
locate ,2: print "parfaitement conforme … la pens‚e de Lorentz."
return

'-------------------------------- TEXTE SUR LA RELATIVITÉ ------------------------------------
texte3:
locate 1, 27: print " LA RELATIVITE "
print
locate ,2: print "C'est en 1904 que Henri Poincar‚ a trouv‚ les valeurs correctes des"
locate ,2: print "‚quations de Lorentz et qu'il a ‚nonc‚ un postulat de relativit‚. "
locate ,2: print "Cela fait de lui le d‚couvreur incontestable de la Relativit‚."
print
locate ,2: print "Pourtant la Relativit‚ n'est qu'une illusion. Les ‚quations donn‚es"
locate ,2: print "par Poincar‚ sont effectivement SYMETRIQUES et r‚versibles. Avec"
locate ,2: print "x = 0,5 et t = 1, on obtient cependant une dilatation de x' et t':"
print
t = chrono
xPrime = (x + beta * t) / facteurG                        'chrono = 1
tPrime = (t + x * beta) / facteurG
locate ,2: print "x'= ";: print using "#.###"; xPrime;
           print " = (x + beta * t ) / g    ";
           print "t'= ";: print using "#.###"; tPrime;
           print " = (t + beta * x ) / g"
locate ,2: print "x = ";: print using "#.###"; (xPrime - beta * tPrime) / facteurG;
           print " = (x'- beta * t') / g    ";
           print "t = ";: print using "#.###"; (tPrime - beta * xPrime) / facteurG;
           print " = (t'- beta * x') / g"
print
locate ,2: print "Il en est ainsi parce que ces ‚quations admettent des valeurs auxi-"
locate ,2: print "liaires d'espace et de temps. Or Lorentz a bien pr‚cis‚ que c'‚tait"
locate ,2: print "un artifice math‚matique. Il est pr‚f‚rable de permuter les varia- "
locate ,2: print "bles, car alors les ‚quations respectent mieux sa pens‚e. Mais du  "
locate ,2: print "coup ";
color rouge: print "elles perdent leur belle et trompeuse sym‚trie:": color noir
print
xPrime = facteurG * x + beta * t                          't = chrono = 1
tPrime = facteurG * t - beta * x                          'temps local à droite du mobile.
locate , 2: print "x'= +";                                'utiliser les équations véritables
if xPrime > 0 then locate , 7 else locate , 8             'pour les valider.
print using "#.### "; facteurG * x + beta * 1;: print "= g * x + beta * t";
print "     t'= +";
if tPrime > 0 then locate , 41 else locate , 42
print using "#.###"; facteurG * t - beta * x;:  print " = g * t - bˆta * x"
locate , 2: print "x = +";                                'valeur fixe en guise d'exemple.
print using "#.###"; (xPrime - beta * t) / facteurG;: print " = (x'- beta * t) / g";
print "   t = +";
print using "#.###"; (tPrime + beta * x) / facteurG ;: print " = (t'+ bˆta * x) / g"
return
'------------------------- TEXTE: LA SYNCHRONISATION DES HORLOGES ----------------------------
texte4:
locate 1, 19: print " LA SYNCHRONISATION DES HORLOGES "
print
locate ,2: print "Les physiciens devront r‚aliser t“t ou tard que les ‚quations pr‚- "
locate ,2: print "sent‚es par Lorentz prˆtent … confusion en invoquant une dilatation"
locate ,2: print "de l'espace. Ce sont plut“t les objets qui se contractent s'ils se "
locate ,2: print "d‚placent comparativement … l'‚ther. Les horloges fonctionnent plus"
locate ,2: print "lentement et elles n'indiquent donc pas toujours l'heure convenue."
print
locate ,2: print "Jusqu'… preuve du contraire, la vitesse de la lumiŠre est constante"
locate ,2: print "et cette vitesse est relative … l'‚ther. Il faut revenir au systŠme"
locate ,2: print "de Descartes, qui doit ˆtre pr‚sum‚ au repos dans l'‚ther, avec des"
locate ,2: print "grandeurs x, y, z et t absolues. Seul le temps t' est une grandeur "
locate ,2: print "auxiliaire et inexacte, qui ne servira qu'… expliquer pourquoi la  "
locate ,2: print "Relativit‚ se v‚rifie. Par ailleurs on a toujours y' = y; z' = z."
print
locate ,2: print "N'importe quel ‚tudiant peut calculer le temps que mettra un signal"
locate ,2: print "radio ‚mis par l'observateur central pour parvenir … chacun des ob-"
locate ,2: print "servateurs avant et arriŠre. Tous conviendront qu'il atteindra plus"
locate ,2: print "vite celui qui se situe … l'arriŠre, … cause de l'effet Doppler. Le"
locate ,2: print "d‚calage horaire pr‚vu par Henri Poincar‚ et confirm‚ par les ‚qua-"
locate ,2: print "tions de Lorentz n'est que le r‚sultat d'une erreur commise par les"
locate ,2: print "observateurs et n'a rien … voir avec une ® dilatation du temps ¯."
return

'------------------------------------ TEXTE: CONCLUSION --------------------------------------
texte5:
locate 1, 29: print " CONCLUSION "
print
locate ,2: print "Il est clair que Lorentz avait postul‚, comme FitzGerald, que l'in-"
locate ,2: print "terf‚romŠtre de Michelson devait se contracter puisqu'il ne pouvait"
locate ,2: print "pas r‚v‚ler le vent d'‚ther. Or ses ‚quations pr‚voient plut“t une "
locate ,2: print "dilatation de l'espace, ce qui a induit tout le monde en erreur.   "
print
locate ,2: print "On peut l'expliquer en rappelant que ses ‚quations s'inspirent de"
locate ,2: print "celles de Woldemar Voigt, qui travaillait sur les ‚quations de Max-"
locate ,2: print "well. Il obtenait de cette maniŠre une invariance parfaite advenant"
locate ,2: print "un mouvement de translation de l'‚metteur et du r‚cepteur."
print
locate ,2: print "C'est ‚vident, l'interf‚romŠtre de Michelson se contracte vraiment."
locate ,2: print "C'est la matiŠre qui se contracte, et non pas l'espace qui se dila-"
locate ,2: print "te. Les horloges qui n'affichent pas l'heure donn‚e par l'observa- "
locate ,2: print "toire de Greenwich, peu importe sa vitesse … travers l'‚ther, sont "
locate ,2: print "tout simplement inexactes. Il suffit de s'en tenir … la convention."
print
locate ,2: print "On ne voit pas bien pourquoi il faudrait aller jusqu'… triturer le "
locate ,2: print "temps et l'espace quand les transformations de Lorentz et la g‚om‚-"
locate ,2: print "trie d'Euclide expliquent facilement la Relativit‚. Pourquoi alors "
locate ,2: print "compliquer les choses? Pourquoi renoncer … l'espace euclidien?"
return

'---------------------------------------- TRANSLATION ----------------------------------------
Translation:
if beta = 0 then mode$ = "départ" : gosub MiseAJour: return
xCentre = xCentre + 1                                     'translation par pas d'un pixel.
if xCentre > 800 then xCentre = 0
screensync'                                               'uniformiser la vitesse.
gosub Diagramme
if clic = 1 then mode$ = "déplacement": gosub MiseAJour: return
if xCentre = origine + 1 then sleep 1000
'entier = origine + beta * diametre
'If xCentre = entier + 1 Then Sleep 1000
return

'------------------------------------- DESSIN DES FLÈCHES ------------------------------------
flecheGauche:
line (xgg+6,yFleche-4)-(xgg+8,yFleche-4),noir
line (xgg+4,yFleche-3)-(xgg+8,yFleche-3),noir
line (xgg+2,yFleche-2)-(xgg+8,yFleche-2),noir
line (xgg,yFleche-1)-(xgd,yFleche-1),noir
line (xgg-2,yFleche)-(xgd,yFleche),noir
line (xgg,yFleche+1)-(xgd,yFleche+1),noir
line (xgg+2,yFleche+2)-(xgg+8,yFleche+2),noir
line (xgg+4,yFleche+3)-(xgg+8,yFleche+3),noir
line (xgg+6,yFleche+4)-(xgg+8,yFleche+4),noir
return
flecheDroite:
line (xdd-8,yFleche-4)-(xdd-6,yFleche-4),noir
line (xdd-8,yFleche-3)-(xdd-4,yFleche-3),noir
line (xdd-8,yFleche-2)-(xdd-2,yFleche-2),noir
line (xdg,yFleche-1)-(xdd,yFleche-1),noir
line (xdg,yFleche)-(xdd+2,yFleche),noir
line (xdg,yFleche+1)-(xdd,yFleche+1),noir
line (xdd-8,yFleche+2)-(xdd-2,yFleche+2),noir
line (xdd-8,yFleche+3)-(xdd-4,yFleche+3),noir
line (xdd-8,yFleche+4)-(xdd-6,yFleche+4),noir
return

Initialisation:'------------------------ INITIALISATION --------------------------------------
vert = rgb(0,150,0)
bleu = rgb(0,0,255)
fond = rgb(225,225,225)
blanc= rgb(255,255,255)
rouge = rgb(255,0,0)
marron = rgb(200,50,0)
grisClair = rgb(175, 175,175)
bleuClair = rgb(100,150,255)
turquoise = rgb (230, 255, 255)
chamois = rgb(245,235,220): 

pi = 4 * atn(1)
deuxPi = 2 * pi
'bitmap = 1                                               'séquence bitmap si désiré.
acceleration = 0
vitesse$ = ".866"                                         'vitesse$ normalisée selon c = 1.
beta = sin(pi / 3)
x = .5                                                    'x = 0,5 (fixe) en secondes lumière.
mode$ = "translation"
secondeLumiere = 320                                      'une seconde lumière en pixels.
diametre = secondeLumiere                                 'diamètre du système au repos
pas = beta / secondeLumiere                               'vitesse en pixels par pas.
rayon = diametre / 2                                      'rayon du système.
origine = secondeLumiere / 2 + 28                         'origine du plan cartésien.
xCentre = origine + beta * secondeLumiere
yCentre = rayon + 20
xgg = 400 - 50                                            'coordonnées des flèches.
xgd = 400 - 20
xdg = 400 + 20
xdd = 400 + 50
yFleche = 584
screenset 2
color noir, fond: cls
if bitmap then return
color noir, blanc
line(577,8)-(757,53), rouge, BF
line(581,12)-(753,49), blanc, BF
locate 2,74: print " LES TRANSFORMATIONS "
locate 3,74: print "     DE LORENTZ      "
color noir, fond
line(4,378)-(487,532),grisClair, b                        'boîte de texte.
line(5,379)-(486,531),noir, b
line(5,531)-(487,531),blanc
line(4,532)-(487,532),blanc
line(486,380)-(486,532),blanc
line(487,379)-(487,532),blanc
locate 25, 3: print "Les transformations de Lorentz  rendent compte d'un  d‚ca-"
locate 26, 3: print "lage horaire, d'un ralentissement des horloges, d'une con-"
locate 27, 3: print "traction et d'une translation. Avec bˆta = 0,866, le point"
locate 28, 3: print "en x = 0,5 passe … 0,25 … cause de la contraction et alors"
locate 29, 3: print "la translation selon : x' = g * x + bˆta * t  devient plus"
locate 30, 3: print "‚vidente. Les ‚quations de Lorentz produisent l'effet con-"
locate 31, 3: print "traire car il a eu recours de son propre aveu … un artifi-"
locate 32, 3: print "ce math‚matique qui avait pour effet de dilater plut“t le "
locate 33, 3: print "temps et l'espace. L'heure locale t' retarde … l'avant."
color noir, fond
locate 1, 35: print "Une seconde lumiŠre"

line(origine, 8)-(origine + 10, 4), noir                  'flèches, une seconde lumière.
line(origine, 8)-(origine + 10, 12), noir
line(origine + 10, 4)-(origine + 10, 12),noir
paint(origine + 2, 8),noir,noir
line(origine + diametre, 8)-(origine + diametre - 10, 4), noir
line(origine + diametre, 8)-(origine + diametre - 10, 12), noir
line(origine + diametre - 10, 4)-(origine + diametre - 10, 12),noir
paint(origine + diametre - 2, 8),noir,noir
line(origine+2,7)-(origine + 70, 7), noir
line(origine, 8)-(origine + 70, 8), noir
line(origine+2, 9)-(origine + 70, 9), noir
line(origine + diametre - 69, 7)-(origine + diametre-2, 7), noir
line(origine + diametre - 69, 8)-(origine + diametre, 8), noir
line(origine + diametre - 69, 9)-(origine + diametre-2, 9), noir

line(origine - rayon, 20)-(origine + diametre, 20), grisClair       'repères.
line(origine - rayon, 20 + diametre)-(origine + diametre, 20 + diametre), grisClair

for j = origine - rayon to origine + .9 * secondeLumiere step secondeLumiere / 10
  line(j, 20)-(j, 30 + secondeLumiere), grisClair
next
line(origine, 12)-(origine, 30 + diametre), noir
line(origine + diametre, 12)-(origine + diametre, 30 + diametre), noir

locate 23,3:  print "-.5"
locate 23,7:  print "-.4"
locate 23,11: print "-.3"
locate 23,15: print "-.2"
locate 23,19: print "-.1"
locate 23,24: print "0"
locate 23,28: print ".1"
locate 23,32: print ".2"
locate 23,36: print ".3"
locate 23,40: print ".4"
locate 23,44: print ".5"
locate 23,48: print ".6"
locate 23,52: print ".7"
locate 23,56: print ".8"
locate 23,60: print ".9"
locate 23,64: print "1"

locate 5, 74: print "bˆta    thˆta  contraction"
locate 6, 91: print "selon g:"
ligne07$ = " 0 - 0,0     0"      + chr(248) + "        0,0     ": locate 7, 70:  print ligne07$
ligne08$ = " 1 - 0,1     5,739"  + chr(248) + "    0,995   ":     locate 8, 70:  print ligne08$
ligne09$ = " 2 - 0,2     11,537" + chr(248) + "   0,98    ":      locate 9, 70:  print ligne09$
ligne10$ = " 3 - 0,3     17,458" + chr(248) + "   0,954   ":      locate 10, 70: print ligne10$
ligne11$ = " 4 - 0,4     23,578" + chr(248) + "   0,917   ":      locate 11, 70: print ligne11$
ligne12$ = " 5 - 0,5     30"     + chr(248) + "       0,866   ":  locate 12, 70: print ligne12$
ligne13$ = " 6 - 0,6     36,87"  + chr(248) + "    0,8     ":     locate 13, 70: print ligne13$
ligne14$ = " 7 - 0,707   45"     + chr(248) + "       0,7071  ":  locate 14, 70: print ligne14$
ligne15$ = " 8 - 0,8     53,13"  + chr(248) + "    0,6     ":     locate 15, 70: print ligne15$
ligne16$ = " 9 - 0,866   60"     + chr(248) + "       0,5     ":  locate 16, 70: print ligne16$
ligne18$ =  " D - D‚part aprŠs contraction. ": locate 18, 70: print ligne18$
ligne18a$ = " D - D‚part impossible.        "
ligne19$ =  " P - Pause aprŠs une seconde.  ": locate 19, 70: print ligne19$
ligne20$ =  " T - Translation continue.     ": locate 20, 70: print ligne20$
ligne21$ =  " A - Acc‚l‚ration t'= x; x'= t.": locate 21, 70: print ligne21$
ligne22$ =  " R - Renseignements.           ": locate 22, 70: print ligne22$
ligne35$ =  "    I - Initialiser.    ": locate 35, 39: print ligne35$
ligne36$ =  "    Quitter (Echap).    ": locate 36, 39: print ligne36$
ligne37$ =  "                        "
gosub flecheGauche: gosub flecheDroite

color vert, fond
locate 35
locate , 2:    print "Merci aux cr‚ateurs de FreeBASIC."
locate , 2:    print "A Serge Cabala, qui a cru … l'‚ther."
locate , 2:    print "Gabriel LaFreniŠre.  glafreniere.com";
locate 36, 63: print "29 nov. 2006. Ce programme peut ˆtre"
locate 37, 63: print "distribu‚, copi‚ ou modifi‚ librement.";
color noir
pcopy 2, 0
pcopy 2, 1
gosub MiseAJour
return