// (C) 1996 G.J. Smit, Nijmegen, Nederland
// This software is published under the GNU General Public License v3.0
// www.dbphysics.com
// The program 'Einstein' photographs (plots) a piece of einsteinian space time where individual and multiple dimensional basics can be seen, showing the deformation of space time as seen for an outside observer.

#include <conio.h>
#include <graphics.h>
#include <math.h>
#include <process.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

FILE *vkini;                    // Actieve rekenvariabelen.
FILE *vkxyz;                    // Krommingssterkte en virtuele 3D-co”rdinaten.
FILE *vkfilm;                   // Film krommingsverloop.
char fiotest;                   // Menu +/- controle op bestaande bestanden.
char prog;                      // Stuurt programmaverloop.
float xd[24],yd[24],zd[24];     // Co”rdinaten van maximaal 24 1db's.
char deel,dtel,ctel;            // Actieve hoeveelheid 1db's en teller daarvoor en teller voor invoer coordinaten.
float bereik,stap;              // Formaat en resolutie van berekende ruimte-kubus.
float kromming,afstand;         // Sterkte en spreiding van de zichtbare kromming.
char ruimte;                    // Al of niet afbeelden als gekromde ruimte.
float schaal;                   // Grootte van afbeelding op scherm.
char kl_modus;                  // Kleurenpalette/kleurmodus.
float dummy,begin,eind;         // Waarden voor film.
float frag;                     // Voor film krommingsverloop.
char film;                      // Bepaalt film aan/uit in tekenfunctie.
int ftel,fx,fy;                 // Besturing film.
unsigned far fk;                // Besturing film.
char toets;                     // Test op toetsaanslag in menu.
float x,y,z;                    // Actieve rekenco”rdinaten.
float afx,afy,afz,afs,krm;      // Berekenen krommingssterkten.
float xtot,ytot,ztot;           // Berekenen visuele co”rdinaten.
float ktot;                     // Berekenen totale krommingssterkte per co”rdinaat.
int v1,v2;                      // Instellen video-mode.
float x2,y2;                    // 2D co”rdinaten voor het beeldscherm.
float kleur,midx,midy;          // Kleur van te tekenen pixel + relocatie.
float afst,kl_w;                // Voor tekenen in kl_modus=2.
char c_invoer;                  // Voor invoer co”rdinaten.
char bnaam[13],tnaam[13];       // Voor variabele bestandsnaam

int huge DetectSvga256() { int vid; vid=4; return vid; }

void kleur_mod(void)
{ v1=0;v2=2341;
  installuserdriver("Svga256",DetectSvga256);
  initgraph(&v1,&v2,"");
  midx=getmaxx()/2;midy=getmaxy()/2;
  if(kl_modus==0) { for(dtel=0;dtel<63;dtel++) setrgbpalette(32+dtel,dtel,dtel,dtel); }
  if(kl_modus==1)
  { for(dtel=0;dtel<64;dtel++) setrgbpalette(128+dtel,63-dtel,dtel,0);
    for(dtel=0;dtel<64;dtel++) setrgbpalette(192+dtel,0,63-dtel,dtel);
  }
  if(kl_modus==2)
  { for(dtel=0;dtel<32;dtel++) setrgbpalette(32+dtel,2*dtel,2*dtel,2*dtel);
    for(dtel=0;dtel<32;dtel++) setrgbpalette(64+dtel,2*dtel,0,0);
    for(dtel=0;dtel<32;dtel++) setrgbpalette(96+dtel,0,2*dtel,0);
    for(dtel=0;dtel<32;dtel++) setrgbpalette(128+dtel,0,0,2*dtel);
    for(dtel=0;dtel<32;dtel++) setrgbpalette(160+dtel,2*dtel,2*dtel,0);
    for(dtel=0;dtel<32;dtel++) setrgbpalette(192+dtel,0,2*dtel,2*dtel);
    for(dtel=0;dtel<32;dtel++) setrgbpalette(224+dtel,2*dtel,0,2*dtel);
  }
  setfillstyle(1,0);
}

void reken(void)
{ _setcursortype(_NOCURSOR);
  strcpy(tnaam,bnaam); strcat(tnaam,".ini");
  vkini=fopen(tnaam,"wb");
  fprintf(vkini,"%d %f %f ",deel,bereik,stap);
  for(dtel=0;dtel<deel;dtel++) fprintf(vkini," %f %f %f",xd[dtel],yd[dtel],zd[dtel]);
  fclose(vkini);

  // Bestand openen voor krommingssterkte en visuele 3D co”rdinaten.
  strcpy(tnaam,bnaam); strcat(tnaam,".xyz");
  vkxyz=fopen(tnaam,"wb");

  // Berekenen krommingssterkten per co”rdinaat per deeltje in kubus.
  for(x=-bereik;x<bereik;x+=stap)
  { gotoxy(14,19); printf(": %5.3f procent",x/(2*bereik)*100+50);
    for(y=-bereik;y<bereik;y+=stap)
    { for(z=-bereik;z<bereik;z+=stap)
      { ktot=0; xtot=0; ytot=0; ztot=0;
        for(dtel=0;dtel<deel;dtel++)
        { afx=(x-xd[dtel])*(x-xd[dtel]);    // Afstand per x,y,z as.
          afy=(y-yd[dtel])*(y-yd[dtel]);
          afz=(z-zd[dtel])*(z-zd[dtel]);
          afs=sqrt(afx+afy+afz);            // Afstand co”rdinaat tot deeltje.
          if(afs!=0) krm=1/(afs*afs); else krm=1000000;  // Krommingssterkte bepalen.
          // Bepalen co”rdinaten voor representatie van visuele ruimte door krommingssterkte.
          ktot+=krm;
          xtot+=(x-xd[dtel])/krm;
          ytot+=(y-yd[dtel])/krm;
          ztot+=(z-zd[dtel])/krm;
        }
        fprintf(vkxyz,"%f %f %f %f ",ktot,xtot,ytot,ztot);
      }
    }
    if(kbhit()!=0)
    { if(getch()==27) x=bereik;
    }
  }
  fclose(vkxyz);
  if(fiotest==0||fiotest==1) fiotest=1; else fiotest=3;
  if(toets==27)
  { unlink(tnaam);
    if(fiotest==3) fiotest=2; else fiotest=0;
  }
  toets=32;
}

void teken(void)
{ if(film==0)
  { strcpy(tnaam,bnaam); strcat(tnaam,".ini");
    vkini=fopen(tnaam,"rb");
    fscanf(vkini,"%d%f%f",&deel,&bereik,&stap);
    for(dtel=0;dtel<deel;dtel++) fscanf(vkini,"%f%f%f",xd[dtel],yd[dtel],zd[dtel]);
    fclose(vkini);
    printf("Deel:%d Bereik:%f Stap:%f Kromming:%f Afstand:%f Ruimte:%d Kleur:%d Schaal:%f",
            deel,bereik,stap,kromming,afstand,ruimte,kl_modus,schaal);
  }
  else
  { bar(0,0,1023,767);
    gotoxy(1,1);
    printf("FC : Begin:%f Eind:%f Fragment:%f Kromming:%f Afstand:%f Ruimte:%d Kleur:%d Schaal:%f",
            begin,eind,frag,kromming,afstand,ruimte,kl_modus,schaal);
  }

  setcolor(7);line(0,18,1023,18);setcolor(10);
  strcpy(tnaam,bnaam); strcat(tnaam,".xyz");
  vkxyz=fopen(tnaam,"rb");

  for(x=-bereik;x<bereik;x+=stap)
  { line((x/(2*bereik)*100+50)*10.24,18,((x+stap)/(2*bereik)*100+50)*10.24,18);
    for(y=-bereik;y<bereik;y+=stap)
    { for(z=-bereik;z<bereik;z+=stap)
      { fscanf(vkxyz,"%f %f %f %f",&ktot,&xtot,&ytot,&ztot);
        if(ktot>kromming-afstand&&ktot<kromming+afstand)
        { if(ruimte==0) { xtot=x; ytot=y; ztot=z; }
          x2=(ytot-.5*xtot)*schaal;
          y2=(ztot-.5*xtot)*schaal;
          if(kl_modus==0) kleur=(x+bereik)/(2*bereik)*62+1;
          if(kl_modus==1)
          { if(ktot>kromming&&ktot<(kromming+afstand)) kleur=160+64*(ktot-kromming)/afstand;
            else kleur=160+64*(ktot-kromming)/afstand;
          }
          if(kl_modus==2)
          { afst=1000000;
            kl_w=32;
            for(dtel=0;dtel<deel;dtel++)
            { afx=(x-xd[dtel])*(x-xd[dtel]);
              afy=(y-yd[dtel])*(y-yd[dtel]);
              afz=(z-zd[dtel])*(z-zd[dtel]);
              afs=sqrt(afx+afy+afz);
              if(afst>afs)
              { afst=afs;
                kl_w=32*dtel;
              }
            }
            kleur=(x+bereik)/(2*bereik)*30+1+kl_w;
          }
          putpixel(midx+x2,midy-y2,32+kleur);
        }
        if(kbhit()!=0)
        { if(getch()==27)
          { if(ruimte==0)
            printf("\n\nOnderbroken  k:%f x:%f y:%f z:%f x2:%f y2:%f",ktot,x,y,z,x2,y2);
            else
            printf("\n\nOnderbroken  k:%f x:%f y:%f z:%f x2:%f y2:%f",ktot,xtot,ytot,ztot,x2,y2);
            x=bereik; y=bereik; z=bereik;
            if(film!=0)  // Als film cre‰ren dan einde beeld-lus.
            { kromming=eind;
              film=0;
            }
          }
        }
      }
    }
  }
  fclose(vkxyz);
  if(film==0)
  { getch();
    toets=32;
  }
  else
  { for(fy=19;fy<768;fy++)
    { for(fx=0;fx<1024;fx++)
      { fk=getpixel(fx,fy);
        if(fk!=0) fprintf(vkfilm,"%d %d %u ",fx,fy,fk);
      }
    }
  }
}

void animatie(void)
{ putchar(13);
  printf("KF : Begin:%f Eind:%f Fragment:%f Ruimte:%d Kleur:%d Schaal:%f",
              begin,eind,frag,ruimte,kl_modus,schaal);

  vkfilm=fopen("vkfilm.xyz","rb");

  do
  { fscanf(vkfilm,"%d",&ftel);
    if(ftel<0)
    { if(ftel!=-1)
      { if(ftel==-1000) printf("                         Laatste beeld");
        toets=getch();
        if(toets!=27) bar(0,19,1023,767);
        else toets=32;
      }
      fscanf(vkfilm,"%d",&fx);
    }
    else fx=ftel;
    fscanf(vkfilm,"%d",&fy);
    fscanf(vkfilm,"%u",&fk);
    putpixel(fx,fy,fk);
  } while(ftel>-999);
  fclose(vkfilm);
}

void cord_in(void)  // Nu 24 deeltjes in te voeren
{
  for(dtel=0;dtel<deel;dtel++)
  { clrscr();
    printf("Bestandsnaa[m] : %s\n\n",bnaam);
    printf("[T]ekenen ");
    if(fiotest==1||fiotest==3) printf("+"); else printf("-");
    printf("  [R]ekenen\n");
    printf("[F]ilm ");
    if(fiotest==2||fiotest==3) printf("+"); else printf("-");
    printf("     [C]re‰ren\n");
    printf("[w]illekeur  [i]nvoeren\n");
    printf("[d]eel       : %d\n",deel);
    printf("[b]ereik     : %f\n",bereik);
    printf("[s]tap       : %f\n",stap);
    printf("[k]romming   : %f\n",kromming);
    printf("[a]fstand    : %f\n",afstand);
    printf("[r]uimte     : ");
    if(ruimte==0) printf("lineair\n"); else printf("gekromd\n");
    printf("s[c]haal     : %f\n",schaal);
    printf("k[l]eur      : ");
    if(kl_modus==0) printf("3D grijswaarden\n");
    if(kl_modus==1) printf("2D krommingssterkte\n");
    if(kl_modus==2) printf("3D per deeltje\n");
    printf("b[e]gin      : %f\n",begin);
    printf("ei[n]d       : %f\n",eind);
    printf("[f]ragment   : %f\n",frag);

    for(ctel=0;ctel<dtel;ctel++)
    { gotoxy(38,1+ctel);
      printf("%d : %f %f %f",ctel,xd[ctel],yd[ctel],zd[ctel]);
    }

    gotoxy(1,19); printf("Deel : %d\n",dtel);
    printf("x > "); scanf("%f",&xd[dtel]);
    printf("y > "); scanf("%f",&yd[dtel]);
    printf("z > "); scanf("%f",&zd[dtel]);
  } 
  toets=32;
}

void main(void)
{ // Bepalen van beginwaarden voor actieve rekenvariabelen.
  strcpy(bnaam,"vkveld");
  strcpy(tnaam,bnaam); strcat(tnaam,".ini");
  vkini=fopen(tnaam,"rb");
  if(vkini==NULL)
  { fiotest=0;
    deel=7; bereik=10; stap=.25;
    for(dtel=0;dtel<deel;dtel++)
    { xd[dtel]=((random(32767)*bereik)/32767-bereik/2)*2;
      yd[dtel]=((random(32767)*bereik)/32767-bereik/2)*2;
      zd[dtel]=((random(32767)*bereik)/32767-bereik/2)*2;
    }
  }
  else
  { fiotest=1;
    fscanf(vkini,"%d%f%f",&deel,&bereik,&stap);
    for(dtel=0;dtel<deel;dtel++)
    { fscanf(vkini,"%f%f%f",&xd[dtel],&yd[dtel],&zd[dtel]);
    }
  }
  fclose(vkini);

  // Testen of vkveld.xyz bestaat.
  strcpy(tnaam,bnaam); strcat(tnaam,".xyz");
  vkxyz=fopen(tnaam,"rb");
  if(vkxyz==NULL) fiotest=0;
  fclose(vkxyz);

  // Bepalen van beginwaarden voor actieve tekenvariabelen.
  kromming=1; afstand=.25; schaal=10; ruimte=0; kl_modus=0;

  // Bepalen van beginwaarden voor actieve filmvariabelen.
  vkini=fopen("vkfilm.ini","rb");
  if(vkini==NULL)
  { begin=.5; eind=1.5; frag=.25;
  }
  else
  { if(fiotest==0) fiotest=2; else fiotest=3;
    fscanf(vkini,"%f%f%f%d",&begin,&eind,&frag,&kl_modus);
  }
  fclose(vkini);

  // Testen of vkfilm.xyz bestaat.
  vkfilm=fopen("vkfilm.xyz","rb");
  if(vkfilm==NULL) { if(fiotest==1||fiotest==3) fiotest=1; else fiotest=0; }
  fclose(vkfilm);

  // Menu -> begin programma-lus.
  prog=1; do
  { // Menu op het scherm.
    _setcursortype(_NOCURSOR);
    clrscr();
    printf("Bestandsnaa[m] : %s\n\n",bnaam);
    printf("[T]ekenen ");
    if(fiotest==1||fiotest==3) printf("+"); else printf("-");
    printf("  [R]ekenen\n");
    printf("[F]ilm ");
    if(fiotest==2||fiotest==3) printf("+"); else printf("-");
    printf("     [C]re‰ren\n");
    printf("[w]illekeur  [i]nvoeren\n");
    printf("[d]eel       : %d\n",deel);
    printf("[b]ereik     : %f\n",bereik);
    printf("[s]tap       : %f\n",stap);
    printf("[k]romming   : %f\n",kromming);
    printf("[a]fstand    : %f\n",afstand);
    printf("[r]uimte     : ");
    if(ruimte==0) printf("lineair\n"); else printf("gekromd\n");
    printf("s[c]haal     : %f\n",schaal);
    printf("k[l]eur      : ");
    if(kl_modus==0) printf("3D grijswaarden\n");
    if(kl_modus==1) printf("2D krommingssterkte\n");
    if(kl_modus==2) printf("3D per deeltje\n");
    printf("b[e]gin      : %f\n",begin);
    printf("ei[n]d       : %f\n",eind);
    printf("[f]ragment   : %f\n",frag);

    // Bestandsnaam afdrukken


    // Co”rdinaten op het scherm.
    for(dtel=0;dtel<deel;dtel++)
    { gotoxy(38,1+dtel);
      printf("%d : %f %f %f",dtel,xd[dtel],yd[dtel],zd[dtel]);
    }

    // Keuze voor functie en afhandeling daarvan.
    toets=getch(); gotoxy(1,19); _setcursortype(_NORMALCURSOR);
    if(toets==27) prog=0;
    if(toets==100)
    { printf("Aantal 1db's ? "); scanf("%d",&deel);
      if(deel<1) deel=1; if(deel>24) deel=24;
      if(kl_modus==2) kl_modus=0;
    }
    if(toets==98)
    { printf("Maximale co”rdinaten ? "); scanf("%f",&bereik);
      if(bereik==0) bereik=10; if(bereik<0) bereik=-bereik;
    }
    if(toets==115)
    { gotoxy(1,19); printf("Resolutie ? "); scanf("%f",&stap);
      if(stap==0) stap=.25; if(stap<0) stap=-stap;
    }
    if(toets==119)
    { for(dtel=0;dtel<deel;dtel++)
      { xd[dtel]=((random(32767)*bereik)/32767-bereik/2)*2;
        yd[dtel]=((random(32767)*bereik)/32767-bereik/2)*2;
        zd[dtel]=((random(32767)*bereik)/32767-bereik/2)*2;
      }
    }
    if(toets==105) cord_in();
    if(toets==107)
    { printf("Zichtbare kromming ? "); scanf("%f",&kromming);
      if(kromming==0) kromming=1; if(kromming<0) kromming=-kromming;
    }
    if(toets==97)
    { printf("Afstand tot zichtbare kromming ? "); scanf("%f",&afstand);
      if(afstand==0) afstand=.25; if(afstand<0) afstand=-afstand;
    }
    if(toets==114)
    { if(ruimte==0) ruimte=1; else ruimte=0;
    }
    if(toets==99)
    { printf("Grootte (op 1024x768) ? "); scanf("%f",&schaal);
      if(schaal==0) schaal=10; if(schaal<0) schaal=-schaal;
    }
    if(toets==108)
    { if(kl_modus==0) kl_modus=1;
      else
      { if(kl_modus==1)
        { if(deel<8) kl_modus=2; else kl_modus=0; }
        else
        { if(kl_modus==2) kl_modus=0; }
      }
    }
    if(toets==101)
    { printf("Beginkromming ? "); scanf("%f",&begin);
      if(begin<0) begin=-begin;
    }
    if(toets==110)
    { printf("Eindkromming ? "); scanf("%f",&eind);
      if(eind<0) eind=-eind;
    }
    if(toets==102)
    { printf("Fragmentatie ? "); scanf("%f",&frag);
    }

    if(toets==109)
    { printf("Nieuwe bestandsnaam ? "); scanf("%s",&bnaam);

      // Testen of bnaam.ini bestaat.
      strcpy(tnaam,bnaam); strcat(tnaam,".ini");
      vkini=fopen(tnaam,"rb");
      if(vkini==NULL)
      { fiotest=0;
        // deel=7; bereik=10; stap=.25;
        // for(dtel=0;dtel<deel;dtel++)
        // { xd[dtel]=((random(32767)*bereik)/32767-bereik/2)*2;
        //   yd[dtel]=((random(32767)*bereik)/32767-bereik/2)*2;
        //   zd[dtel]=((random(32767)*bereik)/32767-bereik/2)*2;
        // }
      }
      else
      { fiotest=1;
        fscanf(vkini,"%d%f%f",&deel,&bereik,&stap);
        for(dtel=0;dtel<deel;dtel++)
        { fscanf(vkini,"%f%f%f",&xd[dtel],&yd[dtel],&zd[dtel]);
        }
      }
      fclose(vkini);

      // Testen of bnaam.xyz bestaat.
      strcpy(tnaam,bnaam); strcat(tnaam,".xyz");
      vkxyz=fopen(tnaam,"rb");
      if(vkxyz==NULL) fiotest=0;
      fclose(vkxyz);
    }
    if(toets==82)
    { if(fiotest==1||fiotest==3)
      { printf("Bestand overschrijven (j/n) ? ");
        toets=getch();
        if(toets==106)
        { putchar(13); printf("                                 ");
          putchar(13); printf("Rekenen");
          reken(); toets=32;
        }
      }
      else
      { putchar(13); printf("Rekenen");
        reken();
      }
    }
    if(toets==84)
    { if(fiotest==0||fiotest==2)
      { printf("Bestand bestaat niet ! "); getch();
      }
      else
      { film=0;
        kleur_mod();
        teken();
        closegraph();
      }
    }
    if(toets==67)  // Film cre‰ren.
    { if(fiotest==3)  // Test of vkfilm.xyz bestaat.
      { printf("Bestand overschrijven (j/n) ? ");
        toets=getch();
        if(toets==106) fiotest=1;
      }
      if(fiotest==1)
      { // Kijk naar variabelen voor bereik & stap.
        vkini=fopen("vkveld.ini","rb");
        fscanf(vkini,"%d%f%f",&deel,&bereik,&stap);
        for(dtel=0;dtel<deel;dtel++)
        { fscanf(vkini,"%f%f%f",&xd[dtel],&yd[dtel],&zd[dtel]);
        }
        fclose(vkini);

        // Begin beeld-lus.
        kleur_mod();
        vkini=fopen("vkfilm.ini","wb");
        fprintf(vkini,"%f %f %f %d",begin,eind,frag,kl_modus);
        fclose(vkini);
        vkfilm=fopen("vkfilm.xyz","wb");
        film=1; ftel=1;
        for(kromming=begin;kromming<eind;kromming+=frag)
        { fprintf(vkfilm,"-%d ",ftel);
          teken();
          ftel++;
        }
        fprintf(vkfilm,"-1000");
        fclose(vkfilm);
        fiotest=3;
        if(film==0)
        { fiotest=1;
          unlink("vkfilm.xyz");
        }
        closegraph();
      }
      if(fiotest==0||fiotest==2)
      { printf("Bestand bestaat niet ! "); getch();
      }
      toets=32;
    }
    if(toets==70)
    { if(fiotest==3)
      { vkini=fopen("vkveld.ini","rb");
        fscanf(vkini,"%d%f%f",&deel,&bereik,&stap);
        for(dtel=0;dtel<deel;dtel++)
        { fscanf(vkini,"%f%f%f",&xd[dtel],&yd[dtel],&zd[dtel]);
        }
        fclose(vkini);
        kleur_mod();
        animatie();
        closegraph();
      }
      if(fiotest==2)
      { kleur_mod();
        animatie();
        closegraph();
      }
      if(fiotest<2)
      { printf("Bestand bestaat niet ! "); getch();
      }
      toets=32;
    }
    if(toets==63)
    { for(dtel=1;dtel<15;dtel++)
      { gotoxy(1,dtel); printf("                              ");
      }
      clrscr();
      printf("( 04-96, Nijmegen -> G.J.Smit  Geb:08-01-68, Veendam )\n");
      printf("      De theorie in hoeverre het betrekking heeft op dit programma. Dit pro-\n");
      printf("gramma geeft een stilstaande foto van een aantal 1db's in een bepaalde ruimte,\n");
      printf("op een bepaalde afstand van elkaar. Er is geen beweging, alleen hun onderlinge\n");
      printf("positie. Dit programma berekend een kubus ruimte met een bepaalde grootte met\n");
      printf("als middelpunt x,y,z-co”rdinaat (0,0,0). De 1db's hebben een bepaalde locatie\n");
      printf("met elk zijn specifieke co”rdinaten in die kubus. Op het punt waar de 1db zich\n");
      printf("bevindt is de ruimte oneindig sterk gekromd (de 1db ¨s de gekromde ruimte!).\n");
      printf("Op een bepaalde afstand van een 1db is de ruimte de in die mate gekromd als\n");
      printf("bepaalt door 1/afstand (of waarschijnlijker 1/afstand^2 zoals wij dat waar-\n");
      printf("nemen bij o.a. de zwaartekracht) (en logisch met een 3-dimensionaal heelal\n");
      printf("gezien de 'localiteit' van energie (energie=mate van kromming t.o.v. omgeving)?\n");
      printf("Een 1db is net als alle omliggende ruimte, alleen is in dat punt de ruimte ten\n");
      printf("opzichte van de omgeving een factor oneindig sterker gekromd. Het is allemaal\n");
      printf("puur relatief. Want ook al is de omliggende ruimte op een bepaalde afstand\n");
      printf("bijvoorbeeld de helft van de 1db kromming, dan is die ruimte daar ook oneindig\n");
      printf("gekromd (0.5*ģ=ģ). Er is dus alleen sprake van een relatief sterkere kromming,\n");
      printf("slechts absoluut, en eindig in verhouding tot andere 1db's. Dat wil zeggen;\n");
      printf("meetbare parameters zijn onderlinge afstand en onderlinge snelheid. Ze zijn\n");
      printf("allen oneindig, doch meetbaar eindig in verhouding tot elkaar Met welke\n");
      printf("snelheid naderen ze elkaar en welke afstand hebben ze tot elkaar? In principe\n");
      printf("meetbaar, in elk geval berekenbaar. ");
      getch(); clrscr();
      printf("Technische opmerkingen:\n\n");
      printf("Bereik: Kleiner dan .01 en groter dan 100 levert onbetrouwbare resultaten op.\n");
      printf("        Dit door het maximum bereik van 'float-type' variabelen.\n\n");
      printf("Schaal: De schaal is alleen re‰el in lineaire-ruimte afbeelding. In gekromde-\n");
      printf("        ruimte afbeelding is de grootte het resultaat van een algoritme dat\n");
      printf("        bepaalt in hoeverre de kromming van de 1db's de in 3D berekende kubus\n");
      printf("        van vlakke ruimte vervormd. ");

      getch();
    }
  } while (prog>0);
}
