WaBis

walter.bislins.ch

Curvature App Demos Code

The Curvature App source code is split into 3 parts:

Demos Manager

The class Demos handles the creation and controlling of the Demo Animations and the associated Demo Buttons. The animations are handled by the Module Animator.

{{data|code}}
<jscript>

var AnimationSpeed = 1;  // > 0

/* Demos Manager */

var Demos = {
  DemoList: [],
  CurrDemo: null,
  LastDemo: null,
  SusDemo: null,
  SusState: 0,
  CurrModAnim: null,
  CurrAnimStep: 0,
  NewCustomDemoName: '',  // custom demos may have a different name then the demo button

  Init: function() {
    // init custom demos
    try {
      InitCustomDemo();
    } catch(e) {}
    // installed demo button click handlers
    var nDemos = this.DemoList.length;
    for (var i = 0; i < nDemos; i++) {
      this.AddButtonClickHandler( i );
    }
  },

  AddButtonClickHandler: function( id ) {
    // id as DemoList index or demo name
    if (xStr(id)) id = this.Find(id);
    var demoName = this.DemoList[id].Name;
    Tabs.AddButtonClickHandler( 'CurveDemosTabs', demoName + 'Button',
      function( buttonData, event ) {
        if (Demos.IsCurrDemoName(demoName) && Demos.IsPlaying()) {
          Demos.Next( false, !Demos.IsTargetIsEndPos() );
        } else {
          Demos.Play( demoName, true );
        }
      }
    );
  },

  SetButtonText: function( text, button ) {
    button = xDefStr( button, 'Custom' );
    var buttonName = button + 'Button';
    xRemoveClass( buttonName, 'TabHide' );
    xInnerHTML( buttonName, text );
    this.NewCustomDemoName = text;
  },

  Reset: function() {
    this.Stop();
    this.LastDemo = this.CurrDemo;
    if (this.CurrDemo) {
      this.SusDemo = this.CurrDemo;
      this.SusState = this.CurrDemo.Anim.CurrState;
    }
    this.CurrDemo = null;
    this.UpdateDemoPanels();
  },

  Find: function( name ) {
    var nDemos = this.DemoList.length;
    for (var i = 0; i < nDemos; i++) {
      if (this.DemoList[i].Name == name || this.DemoList[i].Name2 == name) return i;
    }
    return -1;
  },

  UpdateDemoPanels: function() {
    if (this.LastDemo) {
      xRemoveClass( this.LastDemo.Name + 'Button', 'TabActive' );
      this.LastDemo = null;
    }
    if (this.CurrDemo) {
      xAddClass( 'BackButton', 'TabEnabled' );
      xAddClass( 'PlayButton', 'TabEnabled' );
      xAddClass( 'ForwButton', 'TabEnabled' );
      xAddClass( 'CountButton', 'TabEnabled' );
      if (this.IsPlaying()) {
        xInnerHTML( 'PlayButton', 'Stop' );
        xAddClass( 'PlayButton', 'TabActive' );
      } else {
        xInnerHTML( 'PlayButton', 'Play' );
        xRemoveClass( 'PlayButton', 'TabActive' );
      }
      var pos = this.GetCurrPos() + 1;
      if (this.IsEndPos()) {
        pos = 'end';
      } else {
        pos = pos.toFixed(0);
      }
      xInnerHTML( 'CountButton', pos );
      xAddClass( this.CurrDemo.Name + 'Button', 'TabActive' );
    } else {
      if (this.SusDemo) {
        xInnerHTML( 'PlayButton', 'Resume' );
        xAddClass( 'PlayButton', 'TabEnabled' );
        xAddClass( 'PlayButton', 'TabActive' );
        xInnerHTML( 'CountButton', (this.SusState+1).toFixed(0) );
      } else {
        xInnerHTML( 'PlayButton', 'Play' );
        xInnerHTML( 'CountButton', 'x' );
        xRemoveClass( 'PlayButton', 'TabEnabled' );
      }
      xRemoveClass( 'CountButton', 'TabEnabled' );
      xRemoveClass( 'BackButton', 'TabEnabled' );
      xRemoveClass( 'ForwButton', 'TabEnabled' );
    }
  },

  New: function( name, moreInfos, images ) {
    // returns ModelAnimation
    moreInfos = xDefStr( moreInfos, '' );
    images = xDefArray( images, [] );
    var anim = NewModelAnimation( {
      ModelRef: CurveApp,
      OnModelChange: function(){ UpdateAll(false); },
      PauseTime: 0,
      OnAfterStateChange: function( anim, state ) { Demos.UpdateDemoPanels(); },
      OnStopPlaying: function( anim, state ){ Demos.UpdateDemoPanels(); }
    } );
    var demo = {
      Name: name,
      Name2: this.NewCustomDemoName,
      Anim: anim,
      More: moreInfos,
      Images: images,
    };
    this.NewCustomDemoName = '';
    var i = this.Find( name );
    if (i >= 0) {
      this.DemoList[i] = demo;
    } else {
      this.DemoList.push( demo );
    }
    this.CurrModAnim = anim;
    this.CurrAnimStep = 0;
    return anim;
  },

  AddState: function( jsonState ) {
    var anim = this.CurrModAnim;
    if (!anim) return;
    anim.OnSetState( this.CurrAnimStep,
      function() {
        // prevent setting state for inactive demos
        if (Demos.CurrDemo && Demos.CurrDemo.Anim == anim) {
          JsonToAppState( jsonState );
        }
      }
    );
    this.CurrAnimStep++;
  },

  AddAnimation: function( animDef ) {
    var anim = this.CurrModAnim;
    if (!anim) reurn;
    anim.AnimationToState( this.CurrAnimStep, animDef );
  },

  IsActive: function() {
    return this.CurrDemo != null;
  },

  IsCurrDemoName: function( name ) {
    if (!this.CurrDemo) return false;
    return this.CurrDemo.Name == name;
  },

  IsPlaying: function() {
    if (!this.CurrDemo) return false;
    return this.CurrDemo.Anim.IsPlaying;
  },

  IsTransient: function() {
    if (!this.CurrDemo) return false;
    var anim = this.CurrDemo.Anim;
    return anim.CurrState != anim.TargetState;
  },

  GetCurrPos: function() {
    if (!this.CurrDemo) return 0;
    return this.CurrDemo.Anim.CurrState;
  },

  GetNStates: function() {
    if (!this.CurrDemo) return 0;
    return this.CurrDemo.Anim.NStates;
  },

  GetLastPos: function() {
    if (!this.CurrDemo) return 0;
    return this.CurrDemo.Anim.NStates-1;
  },

  IsStartPos: function() {
    return this.GetCurrPos() == 0;
  },

  IsEndPos: function() {
    if (!this.CurrDemo) return false;
    var anim = this.CurrDemo.Anim;
    return anim.CurrState == anim.NStates-1;
  },

  IsTargetIsEndPos: function() {
    if (!this.CurrDemo) return false;
    var anim = this.CurrDemo.Anim;
    return anim.TargetState == anim.NStates-1;
  },

  Stop: function() {
    if (!this.CurrDemo) return;
    this.CurrDemo.Anim.Stop();
    this.UpdateDemoPanels();
  },

  SetPos: function( pos, play ) {
    if (!this.CurrDemo) return;
    this.Stop();
    var anim = this.CurrDemo.Anim;
    if (pos > anim.NStates-1) pos = anim.NStates-1;
    if (pos < 0) pos = 0;
    anim.SetState( pos );
    if (play) this.Play();
  },

  Next: function( wrap, play ) {
    if (this.IsEndPos()) {
      if (wrap) {
        this.SetPos( 0, play );
      } else {
        this.SetPos( this.GetCurrPos() );
      }
    } else {
      this.SetPos( this.GetCurrPos()+1, play );
    }
  },

  Prev: function( wrap, play ) {
    if (this.IsTransient()) {
      this.SetPos( this.GetCurrPos(), play );
    } else {
      if (this.IsStartPos()) {
        if (wrap) {
          this.SetPos( this.GetNStates()-1, play );
        } else {
          this.SetPos( 0, play );
        }
      } else {
        this.SetPos( this.GetCurrPos()-1, play );
      }
    }
  },

  Step: function( wrap, back, play ) {
    if (back) {
      this.Prev( wrap, play );
    } else {
      this.Next( wrap, play );
    }
  },

  IsNewName: function( name ) {
    return this.CurrDemo && this.CurrDemo.Name != name;
  },

  RequestName: function( name ) {
    if (!xStr(name)) {
      if (!this.CurrDemo) return '';
      name = this.CurrDemo.Name;
    }
    return name;
  },

  Play: function( name, reset ) {
    // name: string; name of a new demo or null for current demo
    name = this.RequestName( name );
    if (name == '') return;
    if (this.IsCurrDemoName(name)) {
      if (this.IsPlaying()) return;
    } else {
      this.Stop();
    }

    // assert: !this.IsPlaying() -> start new demo or restart curr demo
    if (!this.IsCurrDemoName(name)) {
      if (!this.SetNewDemo( name )) return;
    }
    var demo = this.CurrDemo;
    if (demo.Images.length > 0) {
      IC.PreloadImages( demo.Images, MEDIA_FOLDER );
    }
    if (reset) demo.Anim.Reset();
    demo.Anim.Play();
    this.UpdateDemoPanels();
  },

  SetDemo: function( name, play, pos ) {
    // name: string; name of a new demo or null for current demo
    pos = xDefNum( pos, 0 );
    this.Stop();
    if (this.IsCurrDemoName(name)) {
      this.SetPos( pos, play );
      return;
    }

    // assert: !this.IsPlaying() -> start new demo
    if (this.SetNewDemo( name )) {
      this.SetPos( pos, play );
    }
  },

  SetSusDemo: function( play ) {
    if (!this.SusDemo) return;
    this.SetDemo( this.SusDemo.Name, play, this.SusState );
  },

  SetNewDemo: function( name ) {
    // private function
    var i = this.Find( name );
    if (i < 0) return false;
    this.LastDemo = this.CurrDemo;
    this.CurrDemo = this.DemoList[i];
    ShowMoreInfos( this.CurrDemo.More );
    return true;
  },

  PlayStop: function( cont ) {
    if (!this.CurrDemo) return;
    if (this.IsPlaying()) {
      this.Stop();
      return;
    }
    // not playing
    if (this.IsTransient() && !cont) {
      this.Prev();
    }
    this.Play();
  },
};

xOnLoad(
  function(){
    Demos.Init();
    Tabs.AddButtonClickHandler( 'CurveDemosTabs', 'ResetButton',
      function( buttonData ) {
        ResetApp();
      }
    );
  }
);
xOnDomReady(
  function() {
    var boxTabName = 'CurveSettingsTabs';
    Tabs.AddButtonClickHandler( boxTabName, 'BackButton',
      function( buttonData ) {
        Demos.Prev();
      }
    );
    Tabs.AddButtonClickHandler( boxTabName, 'ForwButton',
      function( buttonData ) {
        Demos.Next( true );
      }
    );
    Tabs.AddButtonClickHandler( boxTabName, 'PlayButton',
      function( buttonData ) {
        if (Demos.IsActive()) {
          if (Demos.IsPlaying()) {
            Demos.Stop();
          } else {
            Demos.Play();
          }
        } else {
          Demos.SetSusDemo();
        }
      }
    );
    Tabs.AddButtonClickHandler( boxTabName, 'CountButton',
      function( buttonData ) {
        if (Demos.IsEndPos()) {
          Demos.SetPos( 0 );
        } else {
          Demos.SetPos( Demos.GetLastPos() );
        }
      }
    );
  }
);


function ResetApp() {
  Demos.Reset();
  JsonToAppState(
    'CurveApp = { "DemoText": "", "Description": "", "Height": 100, "FocalLengthField": 33.9, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 1, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": true, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 3, 3 ], "NObjects": [ 0, 0 ], "ObjDist": [ 500, 600 ], "ObjDeltaDist": [ 300, 300 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 0, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 65, 100 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1001.2944, "temperatureC": 14.35, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }' );
  ShowMoreInfos();
  UpdateAll( true );
  Demos.UpdateDemoPanels();
}


var CurrInfoLineText = '';
var PrevInfoLineText = '';

function ShowMoreInfos( infos ) {
  if (CurrInfoLineText == infos) return;
  if (infos) {
    CurrInfoLineText = infos;
  } else {
    CurrInfoLineText = 'Click a Button to Start a Demo. Click again to skip one step. Click the Animation to start/stop. See also Controls below.';
  }
  xInnerHTML( 'MoreAnimationInfos', CurrInfoLineText );
}

function ShowCredit( info ) {
  if (info == '') {
    ShowMoreInfos( PrevInfoLineText );
    PrevInfoLineText = '';
    return;
  }
  if (PrevInfoLineText == '') {
    PrevInfoLineText = CurrInfoLineText;
  }
  ShowMoreInfos( info );
}


Helper Functions

The Helper Functions are usefull to create animation steps.

Tpse( time=AnimT2 )
Inserts a time delay (pause) of time milliseconds.
Ttxt( text, delay=0 )
Inserts a text change into an animation (property CurveApp.Description).
Tval( name, value, time=0, delay=0, sweep='cosine')
Inserts a change for the property CurveApp.Name.
Tpan( delay=0, angle=45 )
Inserts an panning animation.
TshowImage( url, credit='', time=AnimT3, delay=0 )
blends in an overlay image. Use OverlayImageAlpha to set transparency.
ThideImage( time=AnimT3, delay=0 )
blends out the overlay image.
TjsonImage()
to insert the image and credit information into a demo state string.

The parameter name can be any public property name of the CurveApp. To see all supported names, select the Save/Restore Panel of the App and click on Get App State. In the displayed App State are all properties listet, that can be changed by the function Tval().

url can be the name of an image stored on the webserver of the blog or an url to any image on the web. To preload the image on start of a demo use the parameter images of the function Demos.New().

credit is an image credit string and is shown in the info line if defined. Use TjsonImage() to insert it into the json state in Demos.AddState() (see Usage of Image Credit Functions).

Properies with a wide range of values can be given a time span to change the value. If omitted, the value is changed immediately, which should be the case for all integer or boolean properties.

You can specify a sweep function. Default is cosine, others are linear, ...

delay specifies the time delay to wait before the value is changed.

For time values as time and delay use the following AnimT constants.

The function TshowImage() stores the image url and credit information in an internal memory. To simplify inserting this info into a demo state string, you can use the function TjsonImage(), which produces the necessary json-string, see Usage of Image Credit Functions.


// helper functions

var AnimRestartAction = 'stop';
var AnimTxt = 500 / AnimationSpeed;
var AnimT1 = 1000 / AnimationSpeed;
var AnimT2 = 2000 / AnimationSpeed;
var AnimT3 = 3000 / AnimationSpeed;
var AnimT4 = 4000 / AnimationSpeed;
var AnimT5 = 5000 / AnimationSpeed;
var AnimT6 = 6000 / AnimationSpeed;
var AnimT7 = 7000 / AnimationSpeed;
var AnimT8 = 8000 / AnimationSpeed;
var AnimT9 = 9000 / AnimationSpeed;
var AnimT10 = 10000 / AnimationSpeed;

function Tpse( time ) {
  time = xDefNum( time, AnimT2 );
  return {
    Mode: 'serial',
    TaskList: [ { ValueRef: 'pause', EndValue: 0 }, { ValueRef: 'pause', EndValue: time, TimeSpan: time } ],
  };
}

function Ttxt( txt, delay ) {
  var obj1 = { ValueRef: 'Description', EndValue: '' };
  if (delay) obj1.Delay = delay;
  var obj2 = { Delay: AnimTxt, ValueRef: 'Description', EndValue: txt };
  return {
    Mode: 'serial',
    TaskList: [ obj1, obj2 ],
  };
}

function Tval( name, val, time, delay, sweep ) {
  var obj = { ValueRef: name, EndValue: val, Sweep: 'cosine' };
  if (time) obj.TimeSpan = time;
  if (delay) obj.Delay = delay;
  if (sweep) obj.Sweep = sweep;
  return obj;
}

function Tpan( delay, angle ) {
  angle = angle || 45;
  delay = delay || 0;
  return {
    Mode: 'serial',
    TaskList: [
      {
        Delay: delay,
        ValueRef: 'Pan',
        EndValue: -angle,
        TimeSpan: AnimT2,
        Sweep: 'cosine',
      },
      {
        ValueRef: 'Pan',
        EndValue: angle,
        TimeSpan: AnimT4,
        Sweep: 'cosine',
      },
      {
        ValueRef: 'Pan',
        EndValue: 0,
        TimeSpan: AnimT2,
        Sweep: 'cosine',
      },
    ],
  };
}

// Note: use IC.PreloadImages( [ urls ], root ) to preload the images in a xOnLoad() call

function TshowImage( url, credit, time, delay ) {
  credit = xDefStr( credit, '' );
  time = time || AnimT3;
  delay = delay || 0;
  TImageUrl = url;
  TCredit = credit;
  return {
    Mode: 'serial',
    TaskList: [
      {
        ValueRef: 'Credit',
        EndValue: credit,
        TimeSpan: 1
      },
      {
        ValueRef: 'OverlayImageAlpha',
        EndValue: 0,
        TimeSpan: 1
      },
      {
        ValueRef: 'OverlayImage',
        EndValue: url,
        TimeSpan: 1,
      },
      {
        Delay: delay,
        ValueRef: 'OverlayImageAlpha',
        EndValue: 1,
        TimeSpan: time,
        Sweep: 'liniear',
      },
    ],
  };
}

function ThideImage( time, delay ) {
  delay = delay || 0;
  time = time || AnimT5;
  return {
    Mode: 'serial',
    TaskList: [
      {
        Delay: delay,
        ValueRef: 'OverlayImageAlpha',
        EndValue: 0,
        TimeSpan: time
      },
      {
        ValueRef: 'OverlayImage',
        EndValue: '',
        TimeSpan: 1,
      },
      {
        ValueRef: 'OverlayImageAlpha',
        EndValue: 0.5,
        TimeSpan: 1,
      },
      {
        ValueRef: 'Credit',
        EndValue: '',
        TimeSpan: 1
      },
    ],
  };
}

function TjsonStr( s ) {
  return s.replace( /"/g, '\\"' );
}

function Tlink( url, text ) {
  return '<a href="' + url + '" target="_blank">' + text + '</a>';
}

function Tcredit( url, text, add ) {
  add = xDefStr( add, '' );
  text = xDefStr( text, url );
  var s = '<b>Image Credit:</b> ' + Tlink( url, text );
  if (add != '') s += '; ' + add;
  return s;
}

function TjsonImage() {
  return ', "OverlayImage": "' + TImageUrl + '", "OverlayImageAlpha": 1, "Credit": "' + TjsonStr(TCredit) + '"';
}

var TCredit = '';
var TImageUrl = '';

Usage of Image Credit Functions

To display an image credit text on the info line above the animation while an overlay image is displayed, use the functions Tcredit() and TjsonImage() as follow:

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      TshowImage( 'PR_CausewayAir.jpg',
        Tcredit( 'http://www.server.com/page', 'link text', 'aditional text' ) ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "", ...' + TjsonImage() + ' }'
);

The last image url is stored in the global variable TImageUrl and the credit text is stored in TCredit by TshowImage() and used by TjsonImage().

Demo Animations

Here follows the code that creates the Demo Animations. General application is:

for each demo
  // begin a new demo:
  Demos.New( DemoName, infoLine );
  // define ground state
  Demos.AddState( JsonState );
  for each additional step
    // define animations to the next state
    Demos.AddAnimation( AnimationDefinition );
    // define state after the animation
    Demos.AddState( JsonState );

Note: You can get a JsonState from the CurveApp by fideling with the sliders and then get this state on the Save/Restore Panel with Get App State and Compact. Copy the string from Textarea, add string delimiters ' and use the string as the parameter JsonState of the function Demos.AddState().

After one Animation, the next state should be the previous state but with the end values of the previous animation. Copy the state before the animation to the state after the animation and change all values changed by the animation, and so on.

AnimationDefinition

An AnimationDefinition is an object of the following form:

{
  Delay: AnimT1,
  Mode: 'serial', // or 'parallel'
  TaskList: [
    Task or AnimationDefinition,
     :
  ],
}

A Task is an object created with one of the Helper Functions Ttxt, Tval, Tpse, Tpan, TshowImage or ThideImage

Mode defines how the tasks are executed, serial one by one or parallel all at the same time (you may delay some of the tasks though).

Note that a Task may also be another AnimationDefinition. In this way you can define a nested list of tasks that contain tasks that are executed parallel. Tasks and AnimationDefinitions may be nested arbitrarily deep.

Curve Demo

// Curve Demo

Demos.New( 'Curve',
  'Simulation of the Globe Curvature and Comparison with Flat Earth. <a target="_blank" href="https://www.metabunk.org/stand-up-to-detect-the-curve-of-the-earth.t8364/">Stand Up to Detect the Curve of the Earth</a> [metabunk]',
  [ 'SailingBoatHorizon.jpg', 'Drone500mFoV82deg.jpg', 'Horizon-is-not-at-eye-level.jpg', 'Icarus-II3-30km-38mm.jpg', 'ISS007-E-10807-1200px.jpg', 'PRTeslaAt4000km0.jpg', 'PRTeslaAt7000km0.jpg' ]
);

Demos.AddState(
  'CurveApp = { "DemoText": "Where is the Curve?", "Description": "This is the View of the Globe at Observer Height = 2 m, FoV = 65 deg", "Height": 2, "FocalLengthField": 33.9, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 1, "showGrid": 1, "showData": true, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 3, 3 ], "NObjects": [ 0, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 100, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 0, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 10, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Tpan( AnimT2 ),
      Ttxt( 'Height 2 m: Looks pretty flat, no Curvature visible.' ),
      TshowImage( 'SailingBoatHorizon.jpg',
        Tcredit( 'https://commons.wikimedia.org/wiki/File:Sailing_Boat_Horizon.JPG', 'commons.wikipedia.org', 'Binskip Inskip' ) ),
      Tpse(),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Where is the Curve?", "Description": "Height 2 m: Looks pretty flat, no Curvature visible.", "Height": 2, "FocalLengthField": 33.9, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 1, "showGrid": 1, "showData": true, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 3, 3 ], "NObjects": [ 0, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 100, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 0, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 10, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543, "showTheodolite": false' + TjsonImage() + ' }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      ThideImage(),
      Ttxt( 'Lets go higher to 500 m.' ),
      Tval( 'Height', 500, AnimT2, AnimT1 ),
      Ttxt( 'Altitude = 500 m. Still looking flat. Horizon at 80 km.', AnimT1 ),
      Tpan( AnimT3 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Where is the Curve?", "Description": "Altitude = 500 m. Still looking flat. Horizon at 80 km.", "Height": 500, "FocalLengthField": 33.9, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 1, "showGrid": 1, "showData": true, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 3, 3 ], "NObjects": [ 0, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 100, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 0, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 10, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( '500 m: A wide angle lens (21 mm) shows a little drop at the borders.', AnimT1 ),
      Tval( 'showData', false, 1 ),
      Tval( 'FocalLengthField', 21, AnimT1 ),
      TshowImage( 'Drone500mFoV82deg.jpg',
        Tcredit( '../blog/index.asp?page=Bild%3ADrone500mFoV82deg%2Ejpg', 'Bird\'s Eye View; More Infos' ) ),
      Tpse(),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Where is the Curve?", "Description": "500 m: A wide angle lens (21 mm) shows a little drop at the borders.", "Height": 500, "FocalLengthField": 21, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 1, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 3, 3 ], "NObjects": [ 0, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 100, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 0, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 10, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543' + TjsonImage() + ' }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      ThideImage(),
      Tval( 'FocalLengthField', 33.9, AnimT1 ),
      Tval( 'showData', true, 1 ),
      Ttxt( 'Lets compare with Flat Earth view.' ),
      Tval( 'showModel', 4, 0, AnimT2 ),
      Tval( 'showEyeLevel', true ),
      Ttxt( 'Looking flat too. But the Globe Horizon is NOT at Eye-Level!', AnimT2 ),
      Tpan( AnimT4 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Where is the Curve?", "Description": "Looking flat too. But the Globe Horizon is NOT at Eye-Level!", "Height": 500, "FocalLengthField": 33.9, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 4, "showGrid": 1, "showData": true, "showTangent": false, "showEyeLevel": true, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 3, 3 ], "NObjects": [ 0, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 100, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 0, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 10, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'Lets climb to an Altitude of an Airplane at 10.3 km (33700 ft).', AnimT1 ),
      Tval( 'Height', 10300, AnimT3, AnimT1 ),
      Tval( 'showModel', 1, 0 ),
      Ttxt( 'The Globe Horizon is at 362 km now and has dropped to 3.3 degrees.', AnimT1 ),
      Tval( 'Tilt', 3.3, AnimT1 ),
      Ttxt( '10.3 km and we see a slightly bent Horizon!', AnimT1 ),
      Tval( 'showTangent', true, 0, AnimT1 ),
      Tpan( AnimT2 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Where is the Curve?", "Description": "10.3 km and we see a slightly bent Horizon!", "Height": 10300, "FocalLengthField": 33.9, "Roll": 0, "Tilt": 3.3, "Pan": 0, "nLines": 45, "showModel": 1, "showGrid": 1, "showData": true, "showTangent": true, "showEyeLevel": true, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 3, 3 ], "NObjects": [ 0, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 100, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 0, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 10, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'Note: The Horizon is NOT at Eye Level, but 3.3 degrees below!', AnimT1 ),
      Tval( 'showData', false, 1, AnimT2 ),
      TshowImage( 'Horizon-is-not-at-eye-level.jpg',
        Tcredit( '../blog/index.asp?page=Bild%3AHorizon%2Dis%2Dnot%2Dat%2Deye%2Dlevel%2Ejpg', 'unknown; More Infos' ) ),
      Tpse( AnimT3 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Where is the Curve?", "Description": "Note: The Horizon is NOT at Eye Level, but 3.3 degrees below!", "Height": 10300, "FocalLengthField": 33.9, "Roll": 0, "Tilt": 3.3, "Pan": 0, "nLines": 45, "showModel": 1, "showGrid": 1, "showData": true, "showTangent": true, "showEyeLevel": true, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 3, 3 ], "NObjects": [ 0, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 100, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 0, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 10, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543' + TjsonImage() + ' }'
);

Demos.AddAnimation(
  {
    Delay: AnimT1,
    Mode: 'serial',
    TaskList: [
      ThideImage(),
      Tval( 'Tilt', 0, AnimT1 ),
      Tval( 'showData', true, 1 ),
      Ttxt( 'Lets Zoom in to f = 100 mm.' ),
      Tval( 'FocalLengthField', 100, AnimT3 ),
      Ttxt( 'Now the Horizon looks flat again. So the Field of View (Zooming) matters.', AnimT1 ),
      Tpan( AnimT2 ),
      Ttxt( 'Note that the Curvature is mainly down, not horizontally!' ),
      Tpse( AnimT3 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Where is the Curve?", "Description": "Note that the Curvature is mainly down, not horizontally!", "Height": 10300, "FocalLengthField": 100, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 1, "showGrid": 1, "showData": true, "showTangent": true, "showEyeLevel": true, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 3, 3 ], "NObjects": [ 0, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 100, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 0, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 10, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'Lets climb to an Altitude of an amateur Ballon of 30 km (100,000 ft).', AnimT1 ),
      Tval( 'showEyeLevel', false, 1, AnimT3 ),
      Tval( 'Height', 30000, AnimT3 ),
      Ttxt( '30 km: The Horizon has dropped to 5.6 degrees but still looks not much curved.', AnimT1 ),
      Tpan( AnimT2 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Where is the Curve?", "Description": "30 km: The Horizon has dropped to 5.6 degrees but still looks not much curved.", "Height": 30000, "FocalLengthField": 100, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 1, "showGrid": 1, "showData": true, "showTangent": true, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 3, 3 ], "NObjects": [ 0, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 100, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 0, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 10, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'Perhaps if we Zoom out again to 59 deg Field of View:', AnimT1 ),
      Tval( 'FocalLengthField', 38, AnimT2, AnimT3 ),
      Ttxt( 'Zoom-Out: Yes, clearly curved horizontally now.', AnimT1 ),
      Tpan( AnimT2 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Where is the Curve?", "Description": "Zoom-Out: Yes, clearly curved horizontally now.", "Height": 30000, "FocalLengthField": 38, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 1, "showGrid": 1, "showData": true, "showTangent": true, "showEyeLevel": true, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 3, 3 ], "NObjects": [ 0, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 100, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 0, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 10, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'High Altitude Ballon at 30 km (100,000 ft), Focal Length 38 mm', AnimT1 ),
      {
        Delay: AnimT3,
        Mode: 'parallel',
        TaskList: [
          Tval( 'showData', false, 1 ),
          Tval( 'showTangent', false, 1 ),
          Tval( 'showEyeLevel', true, 1 ),
          Tval( 'Tilt', -3.5, AnimT2 ),
          Tval( 'Roll', -1.5, AnimT2 ),
        ],
      },
      TshowImage( 'Icarus-II3-30km-38mm.jpg',
        Tcredit( '../blog/index.asp?page=Bild%3AIcarus%2DII3%2D30km%2D38mm%2Ejpg', 'Robert Harrison; More Infos' ) ),
      Tpse(),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Where is the Curve?", "Description": "High Altitude Ballon at 30 km (100,000 ft), Focal Length 38 mm", "Height": 30000, "FocalLengthField": 38, "Roll": -1.5, "Tilt": -3.5, "Pan": 0, "nLines": 45, "showModel": 1, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": true, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 3, 3 ], "NObjects": [ 0, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 100, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 0, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 10, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543' + TjsonImage() + ' }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      ThideImage(),
      {
        Mode: 'parallel',
        TaskList: [
          Tval( 'Tilt', 0, AnimT2 ),
          Tval( 'Roll', 0, AnimT2 ),
          Tval( 'showData', true, 1 ),
        ],
      },
      Ttxt( 'Lets compare with Flat Earth again:', AnimT1 ),
      Tval( 'showModel', 4, 0, AnimT3 ),
      Ttxt( 'Climbing to 100 km' ),
      Tval( 'Height', 100000, AnimT2 ),
      Ttxt( '100 km: Even the Flat Earth Ice Wall Horizon dropped slightly', AnimT3 ),
      Tpse( AnimT3 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Where is the Curve?", "Description": "100 km: Even the Flat Earth Ice Wall Horizon dropped slightly", "Height": 100000, "FocalLengthField": 38, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 4, "showGrid": 1, "showData": true, "showTangent": false, "showEyeLevel": true, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 3, 3 ], "NObjects": [ 0, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 100, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 0, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 10, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'Lets climb to ISS Altitude of 400 km:', AnimT1 ),
      {
        Delay: AnimT3,
        Mode: 'parallel',
        TaskList: [
          Tval( 'Height', 400000, AnimT3 ),
          Tval( 'Tilt', 8.89, AnimT3 ),
        ],
      },
      Ttxt( '400 km: We should see the Ice Wall at 20015 km on Flat Earth! Globe Horizon at 2200 km.', AnimT2 ),
      Tpse( AnimT3 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Where is the Curve?", "Description": "400 km: We should see the Ice Wall at 20015 km on Flat Earth! Globe Horizon at 2200 km.", "Height": 400000, "FocalLengthField": 38, "Roll": 0, "Tilt": 8.89, "Pan": 0, "nLines": 45, "showModel": 4, "showGrid": 1, "showData": true, "showTangent": false, "showEyeLevel": true, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 3, 3 ], "NObjects": [ 0, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 100, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 0, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 10, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'Zooming (500 mm) makes the Horizon flat again, even at this Altitude!', AnimT1 ),
      Tval( 'showModel', 1, 0, AnimT3 ),
      Tval( 'Tilt', 0, AnimT1 ),
      Tval( 'FocalLengthField', 500, AnimT3 ),
      Tval( 'showEyeLevel', false ),
      Tpan( 0, 15 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Where is the Curve?", "Description": "Zooming (500 mm) makes the Horizon flat again, even at this Altitude!", "Height": 400000, "FocalLengthField": 500, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 1, "showGrid": 1, "showData": true, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 3, 3 ], "NObjects": [ 0, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 100, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 0, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 10, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'Lets have a look from inside the ISS at 400 km Altitude:', AnimT1 ),
      Tval( 'showData', false, 1 ),
      Tval( 'FocalLengthField', 50, AnimT3 ),
      {
        Mode: 'parallel',
        TaskList: [
          Tval( 'Tilt', -4.34, AnimT2 ),
          Tval( 'Roll', -1.38, AnimT2 ),
        ],
      },
      TshowImage( 'ISS007-E-10807-1200px.jpg',
        Tcredit( '../blog/index.asp?page=Bild%3AISS007%2DE%2D10807%2D1200px%2Ejpg', 'NASA Photo ID: ISS007-E-10807; More Infos' ) ),
      Tpse(),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Where is the Curve?", "Description": "Lets have a look from inside the ISS at 400 km Altitude:", "Height": 400000, "FocalLengthField": 50, "Roll": -1.38, "Tilt": -4.34, "Pan": 0, "nLines": 45, "showModel": 1, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 3, 3 ], "NObjects": [ 0, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 100, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 0, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 10, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543' + TjsonImage() + '}'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      ThideImage(),
      Ttxt( 'How does it look like from Elon Musk\'s Tesla at 4,000 km Altitude?', AnimT1 ),
      Tval( 'Height', 4000000, AnimT3 ),
      {
        Mode: 'parallel',
        TaskList: [
          Tval( 'FocalLengthField', 32, AnimT2 ),
          Tval( 'Pan', -4.1327, AnimT2 ),
          Tval( 'Tilt', -3.5, AnimT2 ),
          Tval( 'Roll', -61.8, AnimT2 ),
        ],
      },
      TshowImage( 'PRTeslaAt4000km0.jpg',
        Tcredit( '../bloge/index.asp?page=Image%3APRTeslaAt4000km0%2Ejpg', 'EXPRESS; Latest UK and World News; More Infos' ) ),
      Tpse(),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Where is the Curve?", "Description": "How does it look like from Elon Musk\'s Tesla at 4,000 km Altitude?", "Height": 4000000, "FocalLengthField": 32, "Roll": -61.8, "Tilt": -3.5, "Pan": -4.1327, "nLines": 45, "showModel": 1, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 3, 3 ], "NObjects": [ 0, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 100, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 0, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 10, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543' + TjsonImage() + ' }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      ThideImage(),
      Ttxt( 'Now the view from Elon Musk\'s Tesla at 7,000 km Altitude', AnimT1 ),
      {
        Mode: 'parallel',
        TaskList: [
          Tval( 'Height', 7000000, AnimT3 ),
          Tval( 'Pan', -0.031249, AnimT3 ),
          Tval( 'Tilt', -6.023, AnimT3 ),
          Tval( 'Roll', -83.7, AnimT3 ),
        ],
      },
      TshowImage( 'PRTeslaAt7000km0.jpg',
        Tcredit( '../bloge/index.asp?page=Image%3APRTeslaAt7000km0%2Ejpg', 'hypescience; O universo em um clique; More Infos' ) ),
      Tpse(),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Where is the Curve?", "Description": "Now the view from Elon Musk\'s Tesla at 7,000 km Altitude", "Height": 7000000, "FocalLengthField": 32, "Roll": -83.7, "Tilt": -6.023, "Pan": -0.031249, "nLines": 45, "showModel": 1, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 3, 3 ], "NObjects": [ 0, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 100, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 0, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 10, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543' + TjsonImage() + ' }'
);

Causeway Demo

// Causeway Demo

function PlaySoundly() {
  Demos.Play( 'Soundly', true );
}

Demos.New( 'Causeway',
  '<a target="_blank" href="https://www.youtube.com/watch?v=spEr5SEg1BI">Video showing the Curvature of the Causeway</a> on <a target="_blank" href="https://www.youtube.com/channel/UCDXr2cbK7WlfeYEtJxC9i3w/videos">Soundlys Channel</a>; Please compair with the Demo <b><a href="javascript:PlaySoundly()">Soundly</a></b>',
  [ 'PR_CausewayAir.jpg' ]
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Pontchartrain Causeway", "Description": "To prove that the Earth is flat...", "Height": 80, "FocalLengthField": 33.9, "Roll": 0, "Tilt": 0.301, "Pan": -5, "nLines": 45, "showModel": 1, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 6, 3 ], "NObjects": [ 41, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 967.5, 100 ], "ObjSideType": [ 1, 0 ], "ObjSidePos": [ -119, 0 ], "ObjSideVar": [ 30, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 5, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543, "showTheodolite": false, "OverlayImage": "", "OverlayImageAlpha": 0.5 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      TshowImage( 'PR_CausewayAir.jpg',
        Tcredit( 'http://www.axiomimages.com/aerial-stock-footage/view/AX60_094', 'www.axiomimages.com', 'AX60_094' ) ),
      Ttxt( 'they often use pictures like this of the 38.7 km long Causeway Bridge.' ),
      Tpse( AnimT3 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Pontchartrain Causeway", "Description": "they often use pictures like this of the 38.7 km long Causeway Bridge.", "Height": 80, "FocalLengthField": 33.9, "Roll": 0, "Tilt": 0.301, "Pan": -5, "nLines": 45, "showModel": 1, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 6, 3 ], "NObjects": [ 41, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 967.5, 100 ], "ObjSideType": [ 1, 0 ], "ObjSidePos": [ -119, 0 ], "ObjSideVar": [ 30, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 5, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543, "showTheodolite": false' + TjsonImage() + ' }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'From this Perspective, not the slightest Curvature of the Earth is visible.' ),
      ThideImage(),
      {
        Mode: 'parallel',
        TaskList: [
          Tval( 'Height', 100, AnimT5 ),
          Tval( 'Pan', 0, AnimT5 ),
          Tval( 'Tilt', 0, AnimT5 ),
          Tval( 'ObjSidePos[0]', 45, AnimT5 ),
        ],
      },
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Pontchartrain Causeway", "Description": "From this Perspective, not the slightest Curvature of the Earth is visible.", "Height": 100, "FocalLengthField": 33.9, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 1, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 6, 3 ], "NObjects": [ 41, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 967.5, 100 ], "ObjSideType": [ 1, 0 ], "ObjSidePos": [ 45, 0 ], "ObjSideVar": [ 30, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 5, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'Lets compare this Globe Simulation with the Flat Earth Simulation:', AnimT1 ),
      Tval( 'Description', '', 0, AnimT1 ),
      {
        Repeat: 2,
        TaskList: [
          Tval( 'Description', 'Flat Earth', 0, AnimT2 ),
          Tval( 'showModel', 2 ),
          Tval( 'viewcenterHorizon', 1 ),
          Tval( 'Description', 'Globe Earth', 0, AnimT2 ),
          Tval( 'showModel', 1 ),
          Tval( 'viewcenterHorizon', 0 ),
        ],
      },
      Tval( 'Description', 'Flat Earth', 0, AnimT2 ),
      Tval( 'showModel', 2 ),
      Tval( 'viewcenterHorizon', 1 ),
      Ttxt( 'Looks exactly the same! So where is the Curve hiding?', AnimT2 ),
      Ttxt( 'Lets compare side by side and look for Differences:', AnimT5 ),
      Tval( 'showModel', 3, 0, AnimT3 ),
      Tval( 'showGrid', 1 ),
      Tval( 'viewcenterHorizon', 2 ),
      Tval( 'showEyeLevel', true ),
      Ttxt( 'Aha! The Globe Horizon is not at Eye-Level.', AnimT4 ),
      Tpse(),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Pontchartrain Causeway", "Description": "Aha! The Globe Horizon is not at Eye-Level.", "Height": 100, "FocalLengthField": 33.9, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 3, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": true, "deviceRatio": 1.5, "viewcenterHorizon": 2, "ObjType": [ 6, 3 ], "NObjects": [ 41, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 967.5, 100 ], "ObjSideType": [ 1, 0 ], "ObjSidePos": [ 45, 0 ], "ObjSideVar": [ 30, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 5, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'But can this be noticed with the naked Eye? Certainly not!', AnimT1 ),
      Ttxt( 'Lets zoom in to f = 300 mm and take a closer look:', AnimT4 ),
      Tval( 'FocalLengthField', 300, AnimT3, AnimT4 ),
      Ttxt( 'The Bridge Segments are all 970 m long, but look much shorter now.', AnimT3 ),
      Ttxt( 'This is a well known Effect of Perspective: Zoom compresses Distances.', AnimT6 ),
      Ttxt( 'And we see a slight Down-Bending at the end of the Bridge on the Globe.', AnimT6 ),
      Tpse(),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Pontchartrain Causeway", "Description": "And we see a slight Down-Bending at the end of the Bridge on the Globe.", "Height": 100, "FocalLengthField": 300, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 3, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": true, "deviceRatio": 1.5, "viewcenterHorizon": 2, "ObjType": [ 6, 3 ], "NObjects": [ 41, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 967.5, 100 ], "ObjSideType": [ 1, 0 ], "ObjSidePos": [ 45, 0 ], "ObjSideVar": [ 30, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 5, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'The Bridge Segments go over the Horizon on the Globe!', AnimT1 ),
      Tval( 'FocalLengthField', 2000, AnimT3, AnimT3 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Pontchartrain Causeway", "Description": "The Bridge Segments go over the Horizon on the Globe!", "Height": 100, "FocalLengthField": 2000, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 3, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": true, "deviceRatio": 1.5, "viewcenterHorizon": 2, "ObjType": [ 6, 3 ], "NObjects": [ 41, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 967.5, 100 ], "ObjSideType": [ 1, 0 ], "ObjSidePos": [ 45, 0 ], "ObjSideVar": [ 30, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 5, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'We can enhance this Effect by lowering the Point of View to 2.5 m:', AnimT1 ),
      Tval( 'Height', 2.5, AnimT5, AnimT4 ),
      Tval( 'Description', '' ),
      Tval( 'ObjSidePos[0]', 25, AnimT5 ),
      Ttxt( 'Zoom and View along the Bridge shows the Curvature of the Earth!' ),
      Ttxt( 'To see more Images of the Causeway, click the Button >>> Soundly', AnimT4 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Pontchartrain Causeway", "Description": "To see more Images of the Causeway, click the button >>> Soundly", "Height": 2.5, "FocalLengthField": 2000, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 3, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": true, "deviceRatio": 1.5, "viewcenterHorizon": 2, "ObjType": [ 6, 3 ], "NObjects": [ 41, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 967.5, 100 ], "ObjSideType": [ 1, 0 ], "ObjSidePos": [ 25, 0 ], "ObjSideVar": [ 30, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 5, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

TrnsmLine Demo

// TrnsmLine Demo

Demos.New( 'TrnsmLine',
  '<a target="_blank" href="https://www.metabunk.org/soundly-proving-the-curvature-of-the-earth-at-lake-pontchartrain.t8939/">Soundly Proving the Curvature of the Earth at Lake Pontchartrain</a> [metabunk], <a target="_blank" href="https://www.youtube.com/channel/UCDXr2cbK7WlfeYEtJxC9i3w/videos">Soundlys Channel</a>',
  [ 'PR_RealTransmissionLine.JPG' ]
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Pontchartrain Transmission Line", "Description": "This Transmission Line crosses Lake Pontchartrain in 25.9 km.", "Height": 100, "FocalLengthField": 100, "Roll": 0, "Tilt": 0, "Pan": -10, "nLines": 45, "showModel": 1, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 3, 3 ], "NObjects": [ 85, 2 ], "ObjDist": [ 50, 25550 ], "ObjDeltaDist": [ 297.55, 373 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ -500, -509.6 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 23, 64 ], "ObjSizeVar": [ 0, 0 ], "refractionSync": 2, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Delay: AnimT1,
    Mode: 'parallel',
    TaskList: [
      Tval( 'ObjSidePos[0]', 500, AnimT10, 0 ),
      Tval( 'ObjSidePos[1]',  490.4, AnimT10, 0 ),
      Tval( 'Pan', 10, AnimT10, 0 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Pontchartrain Transmission Line", "Description": "This Transmission Line crosses Lake Pontchartrain in 25.9 km.", "Height": 100, "FocalLengthField": 100, "Roll": 0, "Tilt": 0, "Pan": 10, "nLines": 45, "showModel": 1, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 3, 3 ], "NObjects": [ 85, 2 ], "ObjDist": [ 50, 25550 ], "ObjDeltaDist": [ 297.55, 373 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 500, 490.4 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 23, 64 ], "ObjSizeVar": [ 0, 0 ], "refractionSync": 2, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'There are 85 identical Towers 300 m apart.', AnimT1 ),
      {
        Delay: 0,
        Mode: 'parallel',
        TaskList: [
          Tval( 'FocalLengthField', 1000, AnimT5, 0 ),
          Tval( 'Pan', 1.68, AnimT5, 0 ),
          Tval( 'Height', 55, AnimT5, 0 ),
        ],
      },
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Pontchartrain Transmission Line", "Description": "There are 85 identical Towers 300 m apart.", "Height": 55, "FocalLengthField": 1000, "Roll": 0, "Tilt": 0, "Pan": 1.68, "nLines": 45, "showModel": 1, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 3, 3 ], "NObjects": [ 85, 2 ], "ObjDist": [ 50, 25550 ], "ObjDeltaDist": [ 297.55, 373 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 500, 490.4 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 23, 64 ], "ObjSizeVar": [ 0, 0 ], "refractionSync": 2, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'The last few Towers curve down behind the Horizon.', AnimT1 ),
      {
        Delay: 0,
        Mode: 'parallel',
        TaskList: [
          Tval( 'ObjSidePos[0]', 35, AnimT5, 0 ),
          Tval( 'ObjSidePos[1]', 25.4, AnimT5, 0 ),
          Tval( 'Pan', 0, AnimT5, 0 ),
          Tval( 'Height', 15, AnimT5, 0 ),
        ],
      },
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Pontchartrain Transmission Line", "Description": "The last few Towers curve down behind the Horizon.", "Height": 15, "FocalLengthField": 1000, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 1, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 3, 3 ], "NObjects": [ 85, 2 ], "ObjDist": [ 50, 25550 ], "ObjDeltaDist": [ 297.55, 373 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 35, 25.4 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 23, 64 ], "ObjSizeVar": [ 0, 0 ], "refractionSync": 2, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'Zooming shows the Curvature clearly:', AnimT1 ),
      Tval( 'FocalLengthField', 2000, AnimT5, AnimT1 ),
      Tval( 'showGrid', 1, 0, AnimT1 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Pontchartrain Transmission Line", "Description": "Zooming shows the Curvature clearly:", "Height": 15, "FocalLengthField": 2000, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 1, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 3, 3 ], "NObjects": [ 85, 2 ], "ObjDist": [ 50, 25550 ], "ObjDeltaDist": [ 297.55, 373 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 35, 25.4 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 23, 64 ], "ObjSizeVar": [ 0, 0 ], "refractionSync": 2, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'Lets compare with Flat Earth.', AnimT1 ),
      Tval( 'showModel', 3, 0, AnimT1 ),
      Tpse( AnimT3 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Pontchartrain Transmission Line", "Description": "Lets compare with Flat Earth.", "Height": 15, "FocalLengthField": 2000, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 3, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 3, 3 ], "NObjects": [ 85, 2 ], "ObjDist": [ 50, 25550 ], "ObjDeltaDist": [ 297.55, 373 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 35, 25.4 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 23, 64 ], "ObjSizeVar": [ 0, 0 ], "refractionSync": 2, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'Removing Standard Refraction increases the Curvature even more.', AnimT1 ),
      Tval( 'showModel', 1, 0, AnimT3 ),
      Tval( 'refractionCoeff', 0, AnimT5, AnimT1 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Pontchartrain Transmission Line", "Description": "Removing Standard Refraction increases the Curvature even more.", "Height": 15, "FocalLengthField": 2000, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 1, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 3, 3 ], "NObjects": [ 85, 2 ], "ObjDist": [ 50, 25550 ], "ObjDeltaDist": [ 297.55, 373 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 35, 25.4 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 23, 64 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'Here is the Curvature!', AnimT1 ),
      {
        Delay: AnimT2,
        Mode: 'parallel',
        TaskList: [
          Tval( 'Height', 10.3, AnimT5, 0 ),
          Tval( 'FocalLengthField', 2870, AnimT5, 0 ),
          Tval( 'ObjSidePos[0]', 23.5, AnimT5, 0 ),
          Tval( 'ObjSidePos[1]', 13.9, AnimT5, 0 ),
          Tval( 'Pan', 0.2049, AnimT5, 0 ),
          Tval( 'Tilt', 0.023, AnimT5, 0 ),
          Tval( 'refractionCoeff', 0.05, AnimT5, 0 ),
        ],
      },
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Pontchartrain Transmission Line", "Description": "Here is the Curvature!", "Height": 10.3, "FocalLengthField": 2870, "Roll": 0, "Tilt": 0.023, "Pan": 0.2049, "nLines": 45, "showModel": 1, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 3, 3 ], "NObjects": [ 85, 2 ], "ObjDist": [ 50, 25550 ], "ObjDeltaDist": [ 297.55, 373 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 23.5, 13.9 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 23, 64 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0.05, "tempGradient": -0.026148243, "refractionSync": 1, "pressure": 1012.0133, "temperatureC": 14.93305, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543, "showTheodolite": false, "OverlayImage": "", "OverlayImageAlpha": 0.5 }'
);

Demos.AddAnimation(
  {
    Delay: AnimT1,
    Mode: 'serial',
    TaskList: [
      TshowImage( 'PR_RealTransmissionLine.JPG' ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Pontchartrain Transmission Line", "Description": "Here is the Curvature!", "Height": 10.3, "FocalLengthField": 2870, "Roll": 0, "Tilt": 0.023, "Pan": 0.2049, "nLines": 45, "showModel": 1, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 3, 3 ], "NObjects": [ 85, 2 ], "ObjDist": [ 50, 25550 ], "ObjDeltaDist": [ 297.55, 373 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 23.5, 13.9 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 23, 64 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0.05, "tempGradient": -0.026148243, "refractionSync": 1, "pressure": 1012.0133, "temperatureC": 14.93305, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543, "showTheodolite": false' + TjsonImage() + ' }'
);

Demos.AddAnimation(
  {
    Delay: AnimT1,
    Mode: 'serial',
    TaskList: [
      ThideImage(),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Pontchartrain Transmission Line", "Description": "Here is the Curvature!", "Height": 10.3, "FocalLengthField": 2870, "Roll": 0, "Tilt": 0.023, "Pan": 0.2049, "nLines": 45, "showModel": 1, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 3, 3 ], "NObjects": [ 85, 2 ], "ObjDist": [ 50, 25550 ], "ObjDeltaDist": [ 297.55, 373 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 23.5, 13.9 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 23, 64 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0.05, "tempGradient": -0.026148243, "refractionSync": 1, "pressure": 1012.0133, "temperatureC": 14.93305, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543, "showTheodolite": false, "OverlayImage": "", "OverlayImageAlpha": 0.5 }'
);

Grace Demo

// Grace Demo

Demos.New( 'Grace',
  '<a target="_blank" href="index.asp?page=Image%3AOil%2DPlattform%2DGrace%2Dbmlsb69%2Ejpg">Image of Platform Grace</a>; <a target="_blank" href="https://www.youtube.com/watch?v=XI5qKJm5eNQ">Original-Video</a> [bmlsb69]; <a target="_blank" href="https://www.youtube.com/watch?v=7W6h1oUVGPI">Oil Platforms and Islands | Observation and Analysis</a> [Jon McIntyre]'
);

Demos.AddState(
  'CurveApp = { "DemoText": "Anacapa Island and Oil Platform Grace", "Description": "This is a Scheme of the Stituation:", "Height": 72, "FocalLengthField": 2000, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 2, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 2, "ObjType": [ 6, 5 ], "NObjects": [ 2, 2 ], "ObjDist": [ 25000, 25000 ], "ObjDeltaDist": [ 20, 0 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 0, 14.6 ], "ObjSideVar": [ 12, -331 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 37.2, 75 ], "ObjSizeVar": [ 0, 0.0375 ], "refractionCoeff": 0.27266, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'Left: Observer at QAD Inc. Parking Lot, height = 72 m', AnimT1 ),
      Tpse( AnimT3 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Anacapa Island and Oil Platform Grace", "Description": "Left: Observer at QAD Inc. Parking Lot, height = 72 m", "Height": 72, "FocalLengthField": 2000, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 2, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 2, "ObjType": [ 6, 5 ], "NObjects": [ 2, 2 ], "ObjDist": [ 25000, 25000 ], "ObjDeltaDist": [ 20, 0 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 0, 14.6 ], "ObjSideVar": [ 12, -331 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 37.2, 75 ], "ObjSizeVar": [ 0, 0.0375 ], "refractionCoeff": 0.27266, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'Center: Oil Platform Grace, Distance = 28 km, Height = 37.2 m', AnimT1 ),
      Tpse( AnimT4 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Anacapa Island and Oil Platform Grace", "Description": "Center: Oil Platform Grace, Distance = 28 km, Height = 37.2 m", "Height": 72, "FocalLengthField": 2000, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 2, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 2, "ObjType": [ 6, 5 ], "NObjects": [ 2, 2 ], "ObjDist": [ 25000, 25000 ], "ObjDeltaDist": [ 20, 0 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 0, 14.6 ], "ObjSideVar": [ 12, -331 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 37.2, 75 ], "ObjSizeVar": [ 0, 0.0375 ], "refractionCoeff": 0.27266, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'Right: Anacapa Island, Distance = 50.1 km, Height = 75 m', AnimT1 ),
      Tpse( AnimT4 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Anacapa Island and Oil Platform Grace", "Description": "Right: Anacapa Island, Distance = 50.1 km, Height = 75 m", "Height": 72, "FocalLengthField": 2000, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 2, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 2, "ObjType": [ 6, 5 ], "NObjects": [ 2, 2 ], "ObjDist": [ 25000, 25000 ], "ObjDeltaDist": [ 20, 0 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 0, 14.6 ], "ObjSideVar": [ 12, -331 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 37.2, 75 ], "ObjSizeVar": [ 0, 0.0375 ], "refractionCoeff": 0.27266, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'The top horizontal line corresponds to the line of sight.', AnimT1 ),
      Ttxt( 'If we look to the Island, the Platform must appear way below Eye-Level.', AnimT4 ),
      Tpse( AnimT3 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Anacapa Island and Oil Platform Grace", "Description": "If we look to the Island, the Platform must appear way below Eye-Level.", "Height": 72, "FocalLengthField": 2000, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 2, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 2, "ObjType": [ 6, 5 ], "NObjects": [ 2, 2 ], "ObjDist": [ 25000, 25000 ], "ObjDeltaDist": [ 20, 0 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 0, 14.6 ], "ObjSideVar": [ 12, -331 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 37.2, 75 ], "ObjSizeVar": [ 0, 0.0375 ], "refractionCoeff": 0.27266, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'Lets build the Scene with the real Proportions', AnimT1 ),
      {
        Delay: AnimT1,
        Mode: 'parallel',
        TaskList: [
          Tval( 'ObjDist[1]', 0, AnimT5 ),
          Tval( 'ObjSidePos[0]', 55.4, AnimT5 ),
          Tval( 'ObjDeltaDist[1]', 50100, AnimT5 ),
          Tval( 'ObjDist[0]', 15000, AnimT5 ),
          Tval( 'FocalLengthField', 1000, AnimT5 ),
        ],
      },
      Tval( 'NObjects[1]', 11 ),
      Tval( 'ObjDist[1]', 50100 ),
      Tval( 'ObjDeltaDist[1]', 22.7 ),
      Tval( 'ObjSizeType[1]', 3 ),
      Tval( 'ObjSideVar[1]', -523 ),
      Tval( 'ObjSizeVar[1]', 0.234 ),
      {
        Mode: 'parallel',
        TaskList: [
          Tval( 'ObjDist[0]', 28000, AnimT5 ),
          Tval( 'ObjSidePos[0]', 97.5, AnimT5 ),
          Tval( 'ObjSidePos[1]', 34.7, AnimT5 ),
        ],
      },
      Tval( 'FocalLengthField', 2000, AnimT5 ),
      Ttxt( 'This is the Scene how it should look like on the Flat Earth', AnimT1 ),
      Tpse( AnimT3 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Anacapa Island and Oil Platform Grace", "Description": "This is the Scene how it should look like on the Flat Earth", "Height": 72, "FocalLengthField": 2000, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 2, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 2, "ObjType": [ 6, 5 ], "NObjects": [ 2, 11 ], "ObjDist": [ 28000, 50100 ], "ObjDeltaDist": [ 20, 22.7 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 97.5, 34.7 ], "ObjSideVar": [ 12, -523 ], "ObjSizeType": [ 0, 3 ], "ObjSize": [ 37.2, 75 ], "ObjSizeVar": [ 0, 0.234 ], "refractionCoeff": 0.27266, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'But this is not what we see in Reality!.', AnimT1 ),
      Tval( 'showModel', 1, 0, AnimT3 ),
      Tval( 'viewcenterHorizon', 0 ),
      Ttxt( 'In reality the Scene looks like this (click Link above):', AnimT1 ),
      Tpse( AnimT3 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Anacapa Island and Oil Platform Grace", "Description": "In reality the Scene looks like this (click Link above):", "Height": 72, "FocalLengthField": 2000, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 1, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 6, 5 ], "NObjects": [ 2, 11 ], "ObjDist": [ 28000, 50100 ], "ObjDeltaDist": [ 20, 22.7 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 97.5, 34.7 ], "ObjSideVar": [ 12, -523 ], "ObjSizeType": [ 0, 3 ], "ObjSize": [ 37.2, 75 ], "ObjSizeVar": [ 0, 0.234 ], "refractionCoeff": 0.27266, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'Medium Refraction has to be applied to align the Tops.', AnimT1 ),
      Ttxt( 'Lets see wether Refraction is the Reaoson why the Platform is Lifted so much.', AnimT4 ),
      Tval( 'refractionCoeff', 0, AnimT5, AnimT5 ),
      Ttxt( 'No, without Refraction the Platform appears even higher!', AnimT1 ),
      Tpse( AnimT3 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Anacapa Island and Oil Platform Grace", "Description": "In reality the Scene looks like this (click Link above):", "Height": 72, "FocalLengthField": 2000, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 1, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 6, 5 ], "NObjects": [ 2, 11 ], "ObjDist": [ 28000, 50100 ], "ObjDeltaDist": [ 20, 22.7 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 97.5, 34.7 ], "ObjSideVar": [ 12, -523 ], "ObjSizeType": [ 0, 3 ], "ObjSize": [ 37.2, 75 ], "ObjSizeVar": [ 0, 0.234 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'Lets see how Standard Refraction looks like:', AnimT1 ),
      Tval( 'refractionCoeff', 0.16974, AnimT5, AnimT1 ),
      Tval( 'refractionSync', 2, 0, 1 ),
      Ttxt( 'Reality tells the earth is a Globe.', AnimT2 ),
      Tval( 'showModel', 3 ),
      Tval( 'showEyeLevel', true ),
      Tval( 'viewcenterHorizon', 2 ),
      Tpse( AnimT3 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Anacapa Island and Oil Platform Grace", "Description": "Reality tells the earth is a Globe.", "Height": 72, "FocalLengthField": 2000, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 3, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": true, "deviceRatio": 1.5, "viewcenterHorizon": 2, "ObjType": [ 6, 5 ], "NObjects": [ 2, 11 ], "ObjDist": [ 28000, 50100 ], "ObjDeltaDist": [ 20, 22.7 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 97.5, 34.7 ], "ObjSideVar": [ 12, -523 ], "ObjSizeType": [ 0, 3 ], "ObjSize": [ 37.2, 75 ], "ObjSizeVar": [ 0, 0.234 ], "refractionCoeff": 0.16974, "tempGradient": -0.0343, "refractionSync": 2, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Bedford Demo

// Bedford Demo

Demos.New( 'Bedford',
  '<a target="_blank" href="https://en.wikipedia.org/wiki/Bedford_Level_experiment">Bedford Level Experiment</a> [Wikipedia]; <a target="_blank" href="https://www.metabunk.org/where-and-how-could-the-wallace-experiment-easily-be-repeated.t7920/">Where and How could the Wallace Experiment Easily Be Repeated?</a> [metabunk]'
);

Demos.AddState(
  'CurveApp = { "DemoText": "Bedford Level Experiment", "Description": "", "Height": 7, "FocalLengthField": 800, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 3, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 3, "ObjType": [ 0, 3 ], "NObjects": [ 3, 0 ], "ObjDist": [ -8600, 0 ], "ObjDeltaDist": [ 4830, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 0, 0 ], "ObjSideVar": [ 18, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 4.04, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      {
        Mode: 'parallel',
        TaskList: [
          Tval( 'Description', 'Bridge with Marker' ),
          Tval( 'Description', 'Middle Marker', 0, AnimT2 ),
          Tval( 'Description', 'and Telescope', 0, AnimT4 ),
          Tval( 'Description', 'are at the same height (4 m) and 4830 m apart', 0, AnimT6 ),
          Tval( 'Height', 5, AnimT6 ),
          Tval( 'ObjDist[0]', 370, AnimT6 ),
          Tval( 'ObjSidePos[0]', 11, AnimT6 ),
          Tval( 'Height', 4.04, AnimT2, AnimT7 ),
          Tval( 'ObjSidePos[0]', 9.23, AnimT2, AnimT7 ),
          Tval( 'ObjDist[0]', 124, AnimT2, AnimT7 ),
        ],
      },
      Tval( 'FocalLengthField', 5000, AnimT2, AnimT1 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Bedford Level Experiment", "Description": "are at the same height (4 m) and 4830 m apart", "Height": 4.04, "FocalLengthField": 5000, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 3, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 3, "ObjType": [ 0, 3 ], "NObjects": [ 3, 0 ], "ObjDist": [ 124, 0 ], "ObjDeltaDist": [ 4830, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 9.23, 0 ], "ObjSideVar": [ 18, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 4.04, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'On the Globe, the middle Marker appears ABOVE the Bridge Marker', AnimT1 ),
      Tval( 'Height', 4.135, AnimT1, AnimT3 ),
      Tpse( AnimT3 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Bedford Level Experiment", "Description": "On the Globe, the middle Marker appears ABOVE the Bridge Marker", "Height": 4.135, "FocalLengthField": 5000, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 3, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 3, "ObjType": [ 0, 3 ], "NObjects": [ 3, 0 ], "ObjDist": [ 124, 0 ], "ObjDeltaDist": [ 4830, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 9.23, 0 ], "ObjSideVar": [ 18, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 4.04, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'but both Markers appear below Eye-Level', AnimT1 ),
      Tval( 'showEyeLevel', true, 0, AnimT2 ),
      Tval( 'Height', 4.04, AnimT1, AnimT1 ),
      Tpse( AnimT2 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Bedford Level Experiment", "Description": "but both Markers appear below Eye-Level", "Height": 4.04, "FocalLengthField": 5000, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 3, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": true, "deviceRatio": 1.5, "viewcenterHorizon": 3, "ObjType": [ 0, 3 ], "NObjects": [ 3, 0 ], "ObjDist": [ 124, 0 ], "ObjDeltaDist": [ 4830, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 9.23, 0 ], "ObjSideVar": [ 18, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 4.04, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'Refraction makes the scene appear more flat', AnimT1 ),
      Tval( 'refractionCoeff', 0.714286, AnimT2, AnimT2 ),
      Ttxt( 'Note: the bridge appears no longer behind the horizon', AnimT3 ),
      Tpse(),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Bedford Level Experiment", "Description": "Note: the bridge appears no longer behind the horizon", "Height": 4.04, "FocalLengthField": 5000, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 3, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": true, "deviceRatio": 1.5, "viewcenterHorizon": 3, "ObjType": [ 0, 3 ], "NObjects": [ 3, 0 ], "ObjDist": [ 124, 0 ], "ObjDeltaDist": [ 4830, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 9.23, 0 ], "ObjSideVar": [ 18, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 4.04, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0.714286, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'Whithout Refraction the bridge is partially hidden behind the horizon', AnimT1 ),
      Tval( 'showGrid', 1, 0, AnimT2 ),
      Tval( 'refractionCoeff', 0, AnimT2, AnimT1 ),
      Tpse(),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Bedford Level Experiment", "Description": "Whithout Refraction the bridge is partially hidden behind the horizon", "Height": 4.04, "FocalLengthField": 5000, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 3, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": true, "deviceRatio": 1.5, "viewcenterHorizon": 3, "ObjType": [ 0, 3 ], "NObjects": [ 3, 0 ], "ObjDist": [ 124, 0 ], "ObjDeltaDist": [ 4830, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 9.23, 0 ], "ObjSideVar": [ 18, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 4.04, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'With more Markers (every 200 m)...', AnimT1 ),
      {
        Delay: AnimT3,
        Mode: 'parallel',
        TaskList: [
          Tval( 'ObjSidePos[0]', 5.63, AnimT1 ),
          Tval( 'ObjSideVar[0]', 1.25, AnimT1 ),
        ],
      },
      Tval( 'NObjects[0]', 49, 0, AnimT1 ),
      Tval( 'ObjDeltaDist[0]', 201.25 ),
      Ttxt( 'The Curvature of the Globe Earth is clearly visible', AnimT3 ),
      Tval( 'ObjSideVar[0]', 7.66, AnimT4, AnimT3 ),
      Tval( 'ObjSideVar[0]', 1.25, AnimT4, AnimT2 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Bedford Level Experiment", "Description": "The Curvature of the Globe Earth is clearly visible", "Height": 4.04, "FocalLengthField": 5000, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 3, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": true, "deviceRatio": 1.5, "viewcenterHorizon": 3, "ObjType": [ 0, 3 ], "NObjects": [ 49, 0 ], "ObjDist": [ 124, 0 ], "ObjDeltaDist": [ 201.25, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 5.63, 0 ], "ObjSideVar": [ 1.25, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 4.04, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Tensas Demo

// Tensas Demo

Demos.New( 'Tensas',
  '<a target="_blank" href="https://www.youtube.com/watch?v=1pglPcuarbg">Little Tensas Bayou</a> [YouTube]; <a target="_blank" href="https://www.youtube.com/channel/UCDXr2cbK7WlfeYEtJxC9i3w">Soundlys Channel</a>'
);

Demos.AddState(
  'CurveApp = { "DemoText": "Little Tensas Bayou", "Description": "This Animation shows 12.9 km of the Bridge", "Height": 18300, "FocalLengthField": 33.9, "Roll": 0, "Tilt": -66.2, "Pan": 0, "nLines": 60, "showModel": 1, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 7, 3 ], "NObjects": [ 87, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 150, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 0, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 1, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Delay: AnimT1,
    Mode: 'parallel',
    TaskList: [
      Tval( 'Height', 2000, AnimT5 ),
      Tval( 'FocalLengthField', 75, AnimT5 ),
      Tval( 'Tilt', -14.4, AnimT5 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Little Tensas Bayou", "Description": "This Animation shows 12.9 km of the Bridge", "Height": 2000, "FocalLengthField": 75, "Roll": 0, "Tilt": -14.4, "Pan": 0, "nLines": 60, "showModel": 1, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 7, 3 ], "NObjects": [ 87, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 150, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 0, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 1, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'parallel',
    Delay: 1,
    TaskList: [
      Tval( 'Height', 10.8, AnimT7 ),
      Tval( 'FocalLengthField', 150, AnimT5, AnimT2 ),
      Tval( 'Tilt', 0, AnimT6, AnimT1 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Little Tensas Bayou", "Description": "This Animation shows 12.9 km of the Bridge", "Height": 10.8, "FocalLengthField": 150, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 60, "showModel": 1, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 7, 3 ], "NObjects": [ 87, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 150, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 0, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 1, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'Bridge Segments in this Animation are 150 m long', AnimT1 ),
      {
        Mode: 'parallel',
        TaskList: [
          Tval( 'FocalLengthField', 3000, AnimT5 ),
          Tval( 'ObjSidePos[0]', -2, AnimT3, AnimT2 ),
        ],
      },
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Little Tensas Bayou", "Description": "Bridge Segments in this Animation are 150 m long", "Height": 10.8, "FocalLengthField": 3000, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 60, "showModel": 1, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 7, 3 ], "NObjects": [ 87, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 150, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ -2, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 1, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'Adding Standard Refraction', AnimT1 ),
      Tval( 'refractionCoeff', 0.16974, AnimT2, AnimT1 ),
      Tval( 'refractionSync', 2, 0, 1 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Little Tensas Bayou", "Description": "Adding Standard Refraction", "Height": 10.8, "FocalLengthField": 3000, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 60, "showModel": 1, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 7, 3 ], "NObjects": [ 87, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 150, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ -2, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 1, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0.16974, "tempGradient": -0.0343, "refractionSync": 2, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'Changing Observer Height', AnimT2 ),
      Tval( 'Height', 1.5, AnimT3, AnimT1 ),
      Tval( 'Height', 10.8, AnimT3, AnimT3 ),
      Ttxt( 'Note: lighter Parts lie behind the Horizon Line' ),
      Tval( 'Height', 1.5, AnimT3, AnimT3 ),
      Tval( 'Height', 10.8, AnimT3, AnimT3 ),
      Ttxt( 'Compare to Video linked above' ),
      Tval( 'Height', 1.5, AnimT3 ),
      Tval( 'Height', 10.8, AnimT3, AnimT1 ),
      Tval( 'Height', 1.5, AnimT3, AnimT1 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Little Tensas Bayou", "Description": "Compare to Video linked above", "Height": 1.5, "FocalLengthField": 3000, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 60, "showModel": 1, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 7, 3 ], "NObjects": [ 87, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 150, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ -2, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 1, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0.16974, "tempGradient": -0.0343, "refractionSync": 2, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Soundly Demo

// Soundly Demo

Demos.New( 'Soundly',
  'See <a target="_blank" href="https://youtu.be/spEr5SEg1BI?t=4216">Video</a> of: <a target="_blank" href="../blog/index.asp?page=Bild%3ASoundlyCausewayView1%2Ejpg">Scene 1</a>, <a target="_blank" href="../blog/index.asp?page=Bild%3ASoundlyCausewayView2%2Ejpg">Scene 2</a>, <a target="_blank" href="../blog/index.asp?page=Bild%3ASoundlyCausewayView3%2Ejpg">Scene 3</a>, <a target="_blank" href="../blog/index.asp?page=Bild%3ASoundlyCausewayView4%2Ejpg">Scene 4</a>, <a target="_blank" href="../blog/index.asp?page=Bild%3ASoundlyCausewayView5%2Ejpg">Scene 5</a>, <a target="_blank" href="../blog/index.asp?page=Bild%3ASoundlyCausewayView6%2Ejpg">Scene 6</a>, <a target="_blank" href="https://www.youtube.com/channel/UCDXr2cbK7WlfeYEtJxC9i3w">Soundlys Channel</a>',
  [
    'CausewayLiftSoundlyDrone1.jpg',
    'CausewayLiftSoundlyDrone2.jpg',
    'CausewayLiftSoundlyDrone3.jpg',
    'CausewayLiftSoundlyDrone4.jpg',
    'SoundlyCausewayView1.jpg',
    'SoundlyCausewayView2.jpg',
    'SoundlyCausewayView3.jpg',
    'SoundlyCausewayView4.jpg',
    'SoundlyCausewayView5.jpg',
    'SoundlyCausewayView6.jpg',
    'SoundyCausewayViewTheodolite.jpg',
  ]
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Ponchartrain Causeway, Soundly\'s Observations", "Description": "This Animation simulates the 38 km long Causeway Bridge on the Globe Model.", "Height": 200, "FocalLengthField": 100, "Roll": 0, "Tilt": -0.85, "Pan": 8, "nLines": 45, "showModel": 1, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 8, 3 ], "NObjects": [ 128, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 300, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 2850, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 1, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      {
        Mode: 'parallel',
        TaskList: [
          Tval( 'Height', 900, AnimT5 ),
          Tval( 'FocalLengthField', 650, AnimT5, AnimT2 ),
          Tval( 'Pan', 5.2, AnimT5 ),
        ],
      },
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Ponchartrain Causeway, Soundly\'s Observations", "Description": "This Animation simulates the 38 km long Causeway Bridge on the Globe Model.", "Height": 900, "FocalLengthField": 650, "Roll": 0, "Tilt": -0.85, "Pan": 5.2, "nLines": 45, "showModel": 1, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 8, 3 ], "NObjects": [ 128, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 300, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 2850, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 1, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      {
        Mode: 'parallel',
        TaskList: [
          Ttxt( 'The Bridge Model consists of 127 Segments of 300 m Length each.' ),
          Tval( 'ObjDist[0]', 22500, AnimT10 ),
          Tval( 'Pan', 5.8, AnimT10 ),
          Tval( 'Tilt', -0.85, AnimT10 ),
        ],
      },
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Ponchartrain Causeway, Soundly\'s Observations", "Description": "The Bridge Model consists of 127 Segments of 300 m Length each.", "Height": 900, "FocalLengthField": 650, "Roll": 0, "Tilt": -0.85, "Pan": 5.8, "nLines": 45, "showModel": 1, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 8, 3 ], "NObjects": [ 128, 0 ], "ObjDist": [ 22500, 0 ], "ObjDeltaDist": [ 300, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 2850, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 1, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      {
        Mode: 'parallel',
        TaskList: [
          Tval( 'Height', 100, AnimT5 ),
          Tval( 'Tilt', 0, AnimT5 ),
          Tval( 'ObjDist[0]', 0, AnimT5 ),
          Tval( 'ObjSidePos[0]', 1000, AnimT5 ),
          Tval( 'Pan', 3, AnimT5 ),
        ],
      },
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Ponchartrain Causeway, Soundly\'s Observations", "Description": "The Bridge Model consists of 127 Segments of 300 m Length each.", "Height": 100, "FocalLengthField": 650, "Roll": 0, "Tilt": 0, "Pan": 3, "nLines": 45, "showModel": 1, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 8, 3 ], "NObjects": [ 128, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 300, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 1000, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 1, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'From a low Observer Altitude (1 m)...', AnimT1 ),
      Tval( 'Height', 1, AnimT3, AnimT1 ),
      Ttxt( 'big Parts of the Bridge are hidden behind the Horizon.', AnimT1 ),
      Tpse( AnimT1 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Ponchartrain Causeway, Soundly\'s Observations", "Description": "big Parts of the Bridge are hidden behind the Horizon.", "Height": 1, "FocalLengthField": 650, "Roll": 0, "Tilt": 0, "Pan": 3, "nLines": 45, "showModel": 1, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 8, 3 ], "NObjects": [ 128, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 300, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 1000, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 1, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Tval( 'ObjType[0]', 9, 1 ),
      Tval( 'ObjType[1]', 1, 1 ),
      Tval( 'NObjects[1]', 4, 1 ),
      Tval( 'ObjDist[1]', 41800, 1 ),
      Tval( 'ObjDeltaDist[1]', 0.01, 1 ),
      Tval( 'ObjSidePos[1]', 569.444, 1 ),
      Tval( 'ObjSideVar[1]', 45.6, 1 ),
      Tval( 'ObjSize[1]', 116, 1 ),
      {
        Mode: 'parallel',
        TaskList: [
          Tval( 'FocalLengthField', 435, AnimT3 ),
          Tval( 'ObjSidePos[0]', 460.144, AnimT3 ),
          Tval( 'ObjDist[1]', 40500, 1 ),
          Tval( 'Pan', 1.8907, AnimT3 ),
          Tval( 'Tilt', 0.12668, AnimT3 ),
          Tval( 'refractionCoeff', 0.17063191, AnimT3 ),
        ],
      },
      TshowImage( 'CausewayLiftSoundlyDrone1.jpg', Tcredit( 'https://www.youtube.com/watch?v=NzY5du8LMgk', 'Lakeway Center Elevator 2; Video from Soundly' ), AnimT2 ),
      ThideImage( AnimT2, AnimT1 ),
      Tval( 'Height', 9.5117597, AnimT2 ),
      TshowImage( 'CausewayLiftSoundlyDrone2.jpg', Tcredit( 'https://www.youtube.com/watch?v=NzY5du8LMgk', 'Lakeway Center Elevator 2; Video from Soundly' ), AnimT2 ),
      ThideImage( AnimT2, AnimT1 ),
      {
        Mode: 'parallel',
        TaskList: [
          Tval( 'Height', 39.189318, AnimT3 ),
          Tval( 'ObjDist[1]', 41600, AnimT3 ),
          Tval( 'Pan', 1.8707, AnimT3 ),
          Tval( 'Tilt', 0.13468, AnimT3 ),
          Tval( 'refractionCoeff', 0.17015377, AnimT3 ),
        ],
      },
      TshowImage( 'CausewayLiftSoundlyDrone3.jpg', Tcredit( 'https://www.youtube.com/watch?v=NzY5du8LMgk', 'Lakeway Center Elevator 2; Video from Soundly' ), AnimT2 ),
      ThideImage( AnimT2, AnimT1 ),
      {
        Mode: 'parallel',
        TaskList: [
          Tval( 'Height', 96.975, AnimT3 ),
          Tval( 'refractionCoeff', 0.16943205, AnimT3 ),
        ],
      },
      TshowImage( 'CausewayLiftSoundlyDrone4.jpg', Tcredit( 'https://www.youtube.com/watch?v=NzY5du8LMgk', 'Lakeway Center Elevator 2; Video from Soundly' ), AnimT2 ),
      ThideImage( AnimT2, AnimT1 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Ponchartrain Causeway, Soundly\'s Observations", "Description": "big Parts of the Bridge are hidden behind the Horizon.", "Height": 96.975, "FocalLengthField": 435, "Roll": 0, "Tilt": 0.13468, "Pan": 1.8707, "nLines": 45, "showModel": 1, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 9, 1 ], "NObjects": [ 128, 4 ], "ObjDist": [ 0, 41600 ], "ObjDeltaDist": [ 300, 0.001 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 460.144, 569.444 ], "ObjSideVar": [ 0, 1 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 1, 116 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0.16943205, "tempGradient": -0.0065, "refractionSync": 2, "pressure": 1001.6544, "temperatureC": 14.369663, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543, "showTheodolite": false, "OverlayImage": "", "OverlayImageAlpha": 0.5, "Credit": "" }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( '' ),
      Tval( 'ObjType[0]', 8, 1 ),
      Tval( 'NObjects[1]', 0, 1 ),
      {
        Mode: 'parallel',
        TaskList: [
          Tval( 'FocalLengthField', 2000, AnimT5 ),
          Tval( 'Height', 50, AnimT5 ),
          Tval( 'Pan', 0.8, AnimT5 ),
          Tval( 'Tilt', 0, AnimT5 ),
          Tval( 'ObjSidePos[0]', 300, AnimT5 ),
          Tval( 'refractionCoeff', 0, AnimT5 ),
        ],
      },
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Ponchartrain Causeway, Soundly\'s Observations", "Description": "", "Height": 50, "FocalLengthField": 2000, "Roll": 0, "Tilt": 0, "Pan": 0.8, "nLines": 45, "showModel": 1, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 8, 3 ], "NObjects": [ 128, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 300, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 300, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 1, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'The Model predicts that we should see Curvature in Images of the Bridge.', AnimT1 ),
      {
        Mode: 'parallel',
        Delay: AnimT1,
        TaskList: [
          Tval( 'ObjSidePos[0]', 100, AnimT5 ),
          Tval( 'Height', 8, AnimT5 ),
          Tval( 'Pan', 0.5, AnimT5 ),
        ],
      },
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Ponchartrain Causeway, Soundly\'s Observations", "Description": "The Model predicts that we should see Curvature in Images of the Bridge.", "Height": 8, "FocalLengthField": 2000, "Roll": 0, "Tilt": 0, "Pan": 0.5, "nLines": 45, "showModel": 1, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 8, 3 ], "NObjects": [ 128, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 300, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 100, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 1, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Delay: AnimT1,
    Mode: 'serial',
    TaskList: [
      {
        Mode: 'parallel',
        TaskList: [
          Tval( 'FocalLengthField', 500, AnimT5 ),
          Tval( 'Height', 100, AnimT5 ),
        ],
      },
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Ponchartrain Causeway, Soundly\'s Observations", "Description": "The Model predicts that we should see Curvature in Images of the Bridge.", "Height": 100, "FocalLengthField": 500, "Roll": 0, "Tilt": 0, "Pan": 0.5, "nLines": 45, "showModel": 1, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 8, 3 ], "NObjects": [ 128, 0 ], "ObjDist": [ 0, 0 ], "ObjDeltaDist": [ 300, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 100, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 1, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Delay: AnimT1,
    Mode: 'serial',
    TaskList: [
      {
        Mode: 'parallel',
        TaskList: [
          Tval( 'Height', 11.101, AnimT5 ),
          Tval( 'FocalLengthField', 2110, AnimT5 ),
          Tval( 'Pan', 0.47, AnimT5 ),
          Tval( 'Roll', -1.3, AnimT5 ),
          Tval( 'Tilt', -0.004, AnimT5 ),
          Tval( 'ObjDist[0]', 504, AnimT5 ),
          Tval( 'ObjSidePos[0]', 56.3, AnimT5 ),
          Tval( 'refractionSync', 3, 1 ),
          Tval( 'refractionCoeff', 0.13, AnimT5 ),
        ],
      },
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Ponchartrain Causeway, Soundly\'s Observations", "Description": "The Model predicts that we should see Curvature in Images of the Bridge.", "Height": 11.101, "FocalLengthField": 2110, "Roll": -1.3, "Tilt": -0.004, "Pan": 0.47, "nLines": 45, "showModel": 1, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 8, 3 ], "NObjects": [ 128, 0 ], "ObjDist": [ 504, 0 ], "ObjDeltaDist": [ 300, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 56.3, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 1, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0.13, "tempGradient": -0.013104184, "refractionSync": 3, "pressure": 1011.9171, "temperatureC": 14.927843, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543, "showTheodolite": false, "OverlayImage": "", "OverlayImageAlpha": 0.5 }'
);

Demos.AddAnimation(
  {
    Delay: AnimT1,
    Mode: 'serial',
    TaskList: [
      Ttxt( 'To see Soundly\'s corresponding Image, click on Scene 1' ),
      TshowImage( 'SoundlyCausewayView1.jpg' ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Ponchartrain Causeway, Soundly\'s Observations", "Description": "To see Soundly\'s corresponding Image, click on Scene 1", "Height": 11.101, "FocalLengthField": 2110, "Roll": -1.3, "Tilt": -0.004, "Pan": 0.47, "nLines": 45, "showModel": 1, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 8, 3 ], "NObjects": [ 128, 0 ], "ObjDist": [ 504, 0 ], "ObjDeltaDist": [ 300, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 56.3, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 1, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0.13, "tempGradient": -0.013104184, "refractionSync": 3, "pressure": 1011.9171, "temperatureC": 14.927843, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543, "showTheodolite": false' + TjsonImage() + ' }'
);

Demos.AddAnimation(
  {
    Delay: AnimT1,
    Mode: 'serial',
    TaskList: [
      ThideImage(),
      Ttxt( '' ),
      {
        Mode: 'parallel',
        TaskList: [
          Tval( 'Height', 5.5, AnimT5 ),
          Tval( 'FocalLengthField', 3530, AnimT5 ),
          Tval( 'Pan', 0.278, AnimT5 ),
          Tval( 'Roll', -0.6, AnimT5 ),
          Tval( 'Tilt', 0.029, AnimT5 ),
          Tval( 'ObjDist[0]', 570, AnimT5 ),
          Tval( 'ObjSidePos[0]', 51.5, AnimT5 ),
          Tval( 'ObjSizeVar[0]', 0.15, AnimT5 ),
          Tval( 'refractionSync', 3, 1 ),
          Tval( 'refractionCoeff', 0.13, AnimT5 ),
        ],
      },
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Ponchartrain Causeway, Soundly\'s Observations", "Description": "Click on Scene 2 for this Image", "Height": 5.5, "FocalLengthField": 3530, "Roll": -0.6, "Tilt": 0.029, "Pan": 0.278, "nLines": 45, "showModel": 1, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 8, 3 ], "NObjects": [ 128, 0 ], "ObjDist": [ 570, 0 ], "ObjDeltaDist": [ 300, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 51.5, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 1, 10 ], "ObjSizeVar": [ 0.15, 0 ], "refractionCoeff": 0.13, "tempGradient": -0.013112903, "refractionSync": 3, "pressure": 1012.5895, "temperatureC": 14.96425, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543, "showTheodolite": false, "OverlayImage": "", "OverlayImageAlpha": 0 }'
);

Demos.AddAnimation(
  {
    Delay: AnimT1,
    Mode: 'serial',
    TaskList: [
      TshowImage( 'SoundlyCausewayView2.jpg' ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Ponchartrain Causeway, Soundly\'s Observations", "Description": "Click on Scene 2 for this Image", "Height": 5.5, "FocalLengthField": 3530, "Roll": -0.6, "Tilt": 0.029, "Pan": 0.278, "nLines": 45, "showModel": 1, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 8, 3 ], "NObjects": [ 128, 0 ], "ObjDist": [ 570, 0 ], "ObjDeltaDist": [ 300, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 51.5, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 1, 10 ], "ObjSizeVar": [ 0.15, 0 ], "refractionCoeff": 0.13, "tempGradient": -0.013112903, "refractionSync": 3, "pressure": 1012.5895, "temperatureC": 14.96425, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543, "showTheodolite": false' + TjsonImage() + ' }'
);

Demos.AddAnimation(
  {
    Delay: AnimT1,
    Mode: 'serial',
    TaskList: [
      ThideImage(),
      Ttxt( '' ),
      {
        Mode: 'parallel',
        TaskList: [
          Tval( 'FocalLengthField', 500, AnimT5 ),
          Tval( 'Height', 100, AnimT5 ),
          Tval( 'Pan', 0, AnimT5 ),
          Tval( 'Tilt', 0.048, AnimT5 ),
          Tval( 'Roll', 0, AnimT5 ),
          Tval( 'ObjDist[0]', 100, AnimT5 ),
          Tval( 'ObjSidePos[0]', 4.3, AnimT5 ),
          Tval( 'ObjSizeVar[0]', 0.1, AnimT5 ),
          Tval( 'refractionCoeff', 0, AnimT5 ),
          Tval( 'refractionSync', 1, 1 ),
        ],
      },
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Ponchartrain Causeway, Soundly\'s Observations", "Description": "", "Height": 100, "FocalLengthField": 500, "Roll": 0, "Tilt": 0.048, "Pan": 0, "nLines": 45, "showModel": 1, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 8, 3 ], "NObjects": [ 128, 0 ], "ObjDist": [ 100, 0 ], "ObjDeltaDist": [ 300, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 4.3, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 1, 10 ], "ObjSizeVar": [ 0.1, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Delay: AnimT1,
    Mode: 'serial',
    TaskList: [
      {
        Mode: 'parallel',
        TaskList: [
          Tval( 'FocalLengthField', 2030, AnimT5, AnimT3 ),
          Tval( 'Height', 2.41, AnimT5 ),
          Tval( 'Pan', -0.0868, AnimT5 ),
          Tval( 'Tilt', 0.066, AnimT5 ),
          Tval( 'Roll', 0, AnimT5 ),
          Tval( 'ObjDist[0]', 100, AnimT5 ),
          Tval( 'ObjSidePos[0]', 4.3, AnimT5 ),
          Tval( 'ObjSizeVar[0]', 0.053125, AnimT5 ),
        ],
      },
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Ponchartrain Causeway, Soundly\'s Observations", "Description": "Click on Scene 3 for this Image", "Height": 2.41, "FocalLengthField": 2030, "Roll": 0, "Tilt": 0.066, "Pan": -0.0868, "nLines": 45, "showModel": 1, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 8, 3 ], "NObjects": [ 128, 0 ], "ObjDist": [ 100, 0 ], "ObjDeltaDist": [ 300, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 4.3, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 1, 10 ], "ObjSizeVar": [ 0.053125, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1012.9605, "temperatureC": 14.984335, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543, "showTheodolite": false, "OverlayImage": "", "OverlayImageAlpha": 0.5 }'
);

Demos.AddAnimation(
  {
    Delay: AnimT1,
    Mode: 'serial',
    TaskList: [
      TshowImage( 'SoundlyCausewayView3.jpg' ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Ponchartrain Causeway, Soundly\'s Observations", "Description": "Click on Scene 3 for this Image", "Height": 2.41, "FocalLengthField": 2030, "Roll": 0, "Tilt": 0.066, "Pan": -0.0868, "nLines": 45, "showModel": 1, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 8, 3 ], "NObjects": [ 128, 0 ], "ObjDist": [ 100, 0 ], "ObjDeltaDist": [ 300, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 4.3, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 1, 10 ], "ObjSizeVar": [ 0.053125, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1012.9605, "temperatureC": 14.984335, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543, "showTheodolite": false' + TjsonImage() + ' }'
);

Demos.AddAnimation(
  {
    Delay: AnimT1,
    Mode: 'serial',
    TaskList: [
      ThideImage(),
      Ttxt( '' ),
      {
        Mode: 'parallel',
        Delay: AnimT1,
        TaskList: [
          Tval( 'FocalLengthField', 1000, AnimT5 ),
          Tval( 'Height', 100, AnimT5 ),
          Tval( 'ObjSidePos[0]', -17, AnimT5 ),
          Tval( 'ObjSizeVar[0]', 0, AnimT5 ),
          Tval( 'Pan', -0.14, AnimT5 ),
          Tval( 'Tilt', 0, AnimT5 ),
        ],
      },
      {
        Mode: 'parallel',
        Delay: 0,
        TaskList: [
          Tval( 'FocalLengthField', 1970, AnimT5, AnimT3 ),
          Tval( 'Height', 4.2, AnimT5 ),
          Tval( 'Pan', -0.432, AnimT5 ),
          Tval( 'Tilt', 0.057, AnimT5 ),
          Tval( 'ObjDist[0]', 100, AnimT5 ),
          Tval( 'ObjSidePos[0]', -43, AnimT5 ),
        ],
      },
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Ponchartrain Causeway, Soundly\'s Observations", "Description": "Click on Scene 4 for this Image", "Height": 4.2, "FocalLengthField": 1970, "Roll": 0, "Tilt": 0.057, "Pan": -0.432, "nLines": 45, "showModel": 1, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 8, 3 ], "NObjects": [ 128, 0 ], "ObjDist": [ 100, 0 ], "ObjDeltaDist": [ 300, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ -43, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 1, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1012.7455, "temperatureC": 14.9727, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543, "showTheodolite": false, "OverlayImage": "", "OverlayImageAlpha": 0.5 }'
);

Demos.AddAnimation(
  {
    Delay: AnimT1,
    Mode: 'serial',
    TaskList: [
      TshowImage( 'SoundlyCausewayView4.jpg' ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Ponchartrain Causeway, Soundly\'s Observations", "Description": "Click on Scene 4 for this Image", "Height": 4.2, "FocalLengthField": 1970, "Roll": 0, "Tilt": 0.057, "Pan": -0.432, "nLines": 45, "showModel": 1, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 8, 3 ], "NObjects": [ 128, 0 ], "ObjDist": [ 100, 0 ], "ObjDeltaDist": [ 300, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ -43, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 1, 10 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1012.7455, "temperatureC": 14.9727, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543, "showTheodolite": false' + TjsonImage() + ' }'
);

Demos.AddAnimation(
  {
    Delay: AnimT1,
    Mode: 'serial',
    TaskList: [
      ThideImage(),
      Ttxt( 'Lets go to the North side of the bridge:' ),
      {
        Mode: 'parallel',
        Delay: 1,
        TaskList: [
          Tval( 'FocalLengthField', 250, AnimT2 ),
          Tval( 'Height', 50, AnimT2 ),
        ],
      },
      {
        Mode: 'parallel',
        Delay: AnimT1,
        TaskList: [
          Tval( 'Height', 100, AnimT7 ),
          Tval( 'ObjDist[0]', -30720, AnimT7 ),
          Tval( 'ObjSidePos[0]', 300, AnimT7 ),
          Tval( 'Pan', 6, AnimT7 ),
          Tval( 'Tilt', -1.9, AnimT7 ),
        ],
      },
      Ttxt( '' ),
      {
        Mode: 'parallel',
        Delay: 0,
        TaskList: [
          Tval( 'Pan', 90, AnimT2 ),
          Tval( 'Tilt', -17.9, AnimT2 ),
        ],
      },
      Tval( 'ObjType[0]', 9, 0 ),
      Tval( 'ObjDist[0]', -7680, 0 ),
      Tval( 'Pan', -90, 0 ),
      Tval( 'ObjSidePos[0]', -300, 0 ),
      Tval( 'ObjType[1]', 1, 0 ),
      Tval( 'NObjects[1]', 4, 0 ),
      Tval( 'ObjDist[1]', 38751, 0 ),
      Tval( 'ObjDeltaDist[1]', 0.01, 0 ),
      Tval( 'ObjSidePos[1]', 23.3, 0 ),
      Tval( 'ObjSideVar[1]', 51.6, 0 ),
      Tval( 'ObjSize[1]', 116, 0 ),
      Tpse( 1 ),
      {
        Mode: 'parallel',
        Delay: 0,
        TaskList: [
          Tval( 'Tilt', 0, AnimT2 ),
          Tval( 'Pan', -0.8, AnimT2 ),
          Ttxt( 'On the South End you see the Marriott Hotel, Height = 116 m', AnimT1 ),
        ],
      },
      {
        Mode: 'parallel',
        Delay: AnimT1,
        TaskList: [
          Tval( 'Height', 3.5, AnimT3 ),
          Tval( 'ObjDist[0]', 85, AnimT3 ),
          Tval( 'ObjSidePos[0]', -86, AnimT3 ),
          Tval( 'ObjSizeVar[0]', 0.07, AnimT3 ),
          Tval( 'refractionCoeff', 0.233, AnimT3 ),
          Tval( 'Tilt', 0.052, AnimT3 ),
          Tval( 'Pan', -0.179, AnimT2 ),
          Tval( 'FocalLengthField', 4200, AnimT5, AnimT4 ),
        ],
      },
      Ttxt( 'Click on Scene 5 for this Image' ),
      Tpse( AnimT1 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Ponchartrain Causeway, Soundly\'s Observations", "Description": "Click on Scene 5 for this Image", "Height": 3.5, "FocalLengthField": 4200, "Roll": 0, "Tilt": 0.052, "Pan": -0.179, "nLines": 45, "showModel": 1, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 9, 1 ], "NObjects": [ 128, 4 ], "ObjDist": [ 85, 38751 ], "ObjDeltaDist": [ 300, 0.01 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ -86, 23.3 ], "ObjSideVar": [ 0, 51.6 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 1, 116 ], "ObjSizeVar": [ 0.07, 0 ], "refractionCoeff": 0.233, "tempGradient": 0.0036025572, "refractionSync": 1, "pressure": 1012.8296, "temperatureC": 14.97725, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543, "showTheodolite": false, "OverlayImage": "", "OverlayImageAlpha": 0.5 }'
);

Demos.AddAnimation(
  {
    Delay: AnimT1,
    Mode: 'serial',
    TaskList: [
      TshowImage( 'SoundlyCausewayView5.jpg' ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Ponchartrain Causeway, Soundly\'s Observations", "Description": "Click on Scene 5 for this Image", "Height": 3.5, "FocalLengthField": 4200, "Roll": 0, "Tilt": 0.052, "Pan": -0.179, "nLines": 45, "showModel": 1, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 9, 1 ], "NObjects": [ 128, 4 ], "ObjDist": [ 85, 38751 ], "ObjDeltaDist": [ 300, 0.01 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ -86, 23.3 ], "ObjSideVar": [ 0, 51.6 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 1, 116 ], "ObjSizeVar": [ 0.07, 0 ], "refractionCoeff": 0.233, "tempGradient": 0.0036025572, "refractionSync": 1, "pressure": 1012.8296, "temperatureC": 14.97725, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543, "showTheodolite": false' + TjsonImage() + ' }'
);

Demos.AddAnimation(
  {
    Delay: AnimT1,
    Mode: 'serial',
    TaskList: [
      ThideImage(),
      Ttxt( '' ),
      {
        Mode: 'parallel',
        Delay: AnimT1,
        TaskList: [
          Tval( 'ObjSizeVar[0]', 0, AnimT3 ),
          Tval( 'Pan', -0.22, AnimT3 ),
          Tval( 'FocalLengthField', 3000, AnimT3 ),
          Tval( 'Tilt', 0.035, AnimT3 ),
        ],
      },
      Ttxt( 'Looking through a Theodolite' ),
      Tval( 'showTheodolite', true, 0 ),
      Tpse( AnimT1 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Ponchartrain Causeway, Soundly\'s Observations", "Description": "Looking through a Theodolite", "Height": 3.5, "FocalLengthField": 3000, "Roll": 0, "Tilt": 0.035, "Pan": -0.22, "nLines": 45, "showModel": 1, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 9, 1 ], "NObjects": [ 128, 4 ], "ObjDist": [ 85, 38751 ], "ObjDeltaDist": [ 300, 0.01 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ -86, 23.3 ], "ObjSideVar": [ 0, 51.6 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 1, 116 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0.233, "tempGradient": 0.0064384313, "refractionSync": 1, "pressure": 1012.8296, "temperatureC": 14.97725, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543, "showTheodolite": true }'
);

Demos.AddAnimation(
  {
    Delay: AnimT1,
    Mode: 'serial',
    TaskList: [
      Tval( 'Tilt', 0, AnimT3 ),
      Tval( 'Tilt', 0.086, AnimT3 ),
      Tval( 'Tilt', 0.0526, AnimT3 ),
      Ttxt( 'Click on Scene 5 for this Theodolite Image' ),
      Tpse( AnimT1 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Ponchartrain Causeway, Soundly\'s Observations", "Description": "Click on Scene 5 for this Theodolite Image", "Height": 3.5, "FocalLengthField": 3000, "Roll": 0, "Tilt": 0.0526, "Pan": -0.22, "nLines": 45, "showModel": 1, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 9, 1 ], "NObjects": [ 128, 4 ], "ObjDist": [ 85, 38751 ], "ObjDeltaDist": [ 300, 0.01 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ -86, 23.3 ], "ObjSideVar": [ 0, 51.6 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 1, 116 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0.233, "tempGradient": 0.0064384313, "refractionSync": 1, "pressure": 1012.8296, "temperatureC": 14.97725, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543, "showTheodolite": true }'
);

Demos.AddAnimation(
  {
    Delay: AnimT1,
    Mode: 'serial',
    TaskList: [
      Ttxt( 'Looking through a real Theodolite, Note: Eye-Level matches' ),
      {
        Mode: 'parallel',
        TaskList: [
          Tval( 'ObjSizeVar[0]', 0, AnimT3 ),
          Tval( 'Pan', 0.017249, AnimT3 ),
          Tval( 'FocalLengthField', 1396.79, AnimT3 ),
        ],
      },
      TshowImage( 'SoundyCausewayViewTheodolite.jpg' ),
      Tpse( AnimT1 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Ponchartrain Causeway, Soundly\'s Observations", "Description": "Looking through a real Theodolite, Note: Eye-Level matches", "Height": 3.5, "FocalLengthField": 1396.79, "Roll": 0, "Tilt": 0.0526, "Pan": 0.017249, "nLines": 45, "showModel": 1, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 9, 1 ], "NObjects": [ 128, 4 ], "ObjDist": [ 85, 38751 ], "ObjDeltaDist": [ 300, 0.01 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ -86, 23.3 ], "ObjSideVar": [ 0, 51.6 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 1, 116 ], "ObjSizeVar": [ 0, 0 ], "refractionCoeff": 0.233, "tempGradient": 0.003668218, "refractionSync": 1, "pressure": 1012.8296, "temperatureC": 14.97725, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543, "showTheodolite": true' + TjsonImage() + ' }'
);

Demos.AddAnimation(
  {
    Delay: AnimT1,
    Mode: 'serial',
    TaskList: [
      ThideImage(),
      Tval( 'showTheodolite', false, 1, AnimT1 ),
      Tval( 'FocalLengthField', 250, AnimT2 ),
      Ttxt( 'Lets go into the Marriott Hotel:' ),
      {
        Mode: 'parallel',
        Delay: AnimT1,
        TaskList: [
          Tval( 'Height', 33.42, AnimT7 ),
          Tval( 'ObjDist[0]', -30720, AnimT7 ),
          Tval( 'ObjDist[1]', 7946, AnimT7 ),
          Tval( 'ObjSidePos[0]', -106, AnimT7 ),
          Tval( 'ObjSidePos[1]', 6, AnimT7 ),
          Tval( 'Pan', -3.6, AnimT7 ),
          Tval( 'Tilt', -1.9, AnimT7 ),
        ],
      },
      {
        Mode: 'parallel',
        Delay: 0,
        TaskList: [
          Tval( 'Pan', -90, AnimT2 ),
          Tval( 'Tilt', -17.9, AnimT2 ),
        ],
      },
      Tval( 'ObjType[0]', 8, 0 ),
      Tval( 'ObjDist[0]', -7680, 0 ),
      Tval( 'Pan', 90, 0 ),
      Tval( 'ObjSidePos[0]', 106, 0 ),
      Tval( 'NObjects[1]', 0, 0 ),
      Tpse( 1 ),
      {
        Mode: 'parallel',
        Delay: 0,
        TaskList: [
          Tval( 'Tilt', 0, AnimT2 ),
          Tval( 'Pan', 0.61, AnimT2 ),
        ],
      },
      {
        Mode: 'parallel',
        Delay: 0,
        TaskList: [
          Tval( 'Height', 41.2, AnimT3 ),
          Tval( 'Tilt', -0.0925, AnimT3 ),
          Tval( 'Pan', 0.591, AnimT2 ),
          Tval( 'ObjDist[0]', 402, AnimT3 ),
          Tval( 'ObjSidePos[0]', 103.422, AnimT3 ),
          Tval( 'ObjSizeVar[0]', 0.1375, AnimT3 ),
          Tval( 'refractionCoeff', 0.25, AnimT3 ),
          Tval( 'FocalLengthField', 1980, AnimT5, AnimT4 ),
        ],
      },
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Ponchartrain Causeway, Soundly\'s Observations", "Description": "Click on Scene 6 for this Image", "Height": 41.2, "FocalLengthField": 1980, "Roll": 0, "Tilt": -0.0925, "Pan": 0.591, "nLines": 45, "showModel": 1, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 8, 3 ], "NObjects": [ 128, 0 ], "ObjDist": [ 402, 0 ], "ObjDeltaDist": [ 300, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 103.422, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 1, 10 ], "ObjSizeVar": [ 0.1375, 0 ], "refractionCoeff": 0.25, "tempGradient": 0.0065514445, "refractionSync": 1, "pressure": 1008.3104, "temperatureC": 14.7322, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543, "showTheodolite": false, "OverlayImage": "", "OverlayImageAlpha": 0.5 }'
);

Demos.AddAnimation(
  {
    Delay: AnimT1,
    Mode: 'serial',
    TaskList: [
      TshowImage( 'SoundlyCausewayView6.jpg' ),
      Tpse( AnimT1 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Ponchartrain Causeway, Soundly\'s Observations", "Description": "Click on Scene 6 for this Image", "Height": 41.2, "FocalLengthField": 1980, "Roll": 0, "Tilt": -0.0925, "Pan": 0.591, "nLines": 45, "showModel": 1, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 8, 3 ], "NObjects": [ 128, 0 ], "ObjDist": [ 402, 0 ], "ObjDeltaDist": [ 300, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 103.422, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 1, 10 ], "ObjSizeVar": [ 0.1375, 0 ], "refractionCoeff": 0.25, "tempGradient": 0.0065514445, "refractionSync": 1, "pressure": 1008.3104, "temperatureC": 14.7322, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543, "showTheodolite": false' + TjsonImage() + ' }'
);

Demos.AddAnimation(
  {
    Delay: AnimT1,
    Mode: 'serial',
    TaskList: [
      ThideImage(),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Lake Ponchartrain Causeway, Soundly\'s Observations", "Description": "Click on Scene 6 for this Image", "Height": 41.2, "FocalLengthField": 1980, "Roll": 0, "Tilt": -0.0925, "Pan": 0.591, "nLines": 45, "showModel": 1, "showGrid": 0, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 8, 3 ], "NObjects": [ 128, 0 ], "ObjDist": [ 402, 0 ], "ObjDeltaDist": [ 300, 100 ], "ObjSideType": [ 0, 0 ], "ObjSidePos": [ 103.422, 0 ], "ObjSideVar": [ 0, 0 ], "ObjSizeType": [ 0, 0 ], "ObjSize": [ 1, 10 ], "ObjSizeVar": [ 0.1375, 0 ], "refractionCoeff": 0.25, "tempGradient": 0.0065514445, "refractionSync": 1, "pressure": 1008.3104, "temperatureC": 14.7322, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543, "showTheodolite": false, "OverlayImage": "", "OverlayImageAlpha": 0.5 }'
);

Chicago Demo

// Chicago Demo

Demos.New( 'Chicago',
  '<a target="_blank" href="https://joshuanowicki.smugmug.com/Looking-toward-Chicago-from-Mi/i-3dCDGJX">Image: Looking toward Chicago from Michigan</a> [Eric Young]; <a target="_blank" href="https://www.metabunk.org/standard-atmospheric-refraction-empirical-evidence-and-derivation.t8703/">Standard Atmospheric Refraction</a> [metabunk]'
);

Demos.AddState(
  'CurveApp = { "DemoText": "Chicago Skyline", "Description": "Observer Altitude = 2 m, City Distance = 3.4 km, Tallest Building = 442 m", "Height": 2, "FocalLengthField": 34, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 3, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": true, "deviceRatio": 1.5, "viewcenterHorizon": 2, "ObjType": [ 4, 3 ], "NObjects": [ 6, 0 ], "ObjDist": [ 3400, 0 ], "ObjDeltaDist": [ 200, 100 ], "ObjSideType": [ 2, 0 ], "ObjSidePos": [ 1040, 0 ], "ObjSideVar": [ -30.5, 0 ], "ObjSizeType": [ 3, 0 ], "ObjSize": [ 442, 10 ], "ObjSizeVar": [ 0.381, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'Lets cross Lake Michigan to Grand Mere State Park', AnimT3 ),
      Tval( 'showEyeLevel', false ),
      Tval( 'ObjDist[0]', 91100, AnimT5, AnimT3 ),
      Ttxt( 'Distance = 91.1 km', AnimT1 ),
      Ttxt( 'On the Globe, Chicago disappeared behind the Curvature of the Earth', AnimT3 ),
      Tpse( AnimT3 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Chicago Skyline", "Description": "On the Globe, Chicago disappeared behind the Curvature of the Earth", "Height": 2, "FocalLengthField": 34, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 3, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 2, "ObjType": [ 4, 3 ], "NObjects": [ 6, 0 ], "ObjDist": [ 91100, 0 ], "ObjDeltaDist": [ 200, 100 ], "ObjSideType": [ 2, 0 ], "ObjSidePos": [ 1040, 0 ], "ObjSideVar": [ -30.5, 0 ], "ObjSizeType": [ 3, 0 ], "ObjSize": [ 442, 10 ], "ObjSizeVar": [ 0.381, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'Zooming in (f = 800 mm) does not bring the Skyline back into view', AnimT1 ),
      Tval( 'FocalLengthField', 800, AnimT5, AnimT1 ),
      Tval( 'showEyeLevel', true ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Chicago Skyline", "Description": "Zooming in (f = 800 mm) does not bring the Skyline back into view", "Height": 2, "FocalLengthField": 800, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 3, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": true, "deviceRatio": 1.5, "viewcenterHorizon": 2, "ObjType": [ 4, 3 ], "NObjects": [ 6, 0 ], "ObjDist": [ 91100, 0 ], "ObjDeltaDist": [ 200, 100 ], "ObjSideType": [ 2, 0 ], "ObjSidePos": [ 1040, 0 ], "ObjSideVar": [ -30.5, 0 ], "ObjSizeType": [ 3, 0 ], "ObjSize": [ 442, 10 ], "ObjSizeVar": [ 0.381, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'Lets climb a nearby Hill of Height = 200 m', AnimT1 ),
      Tval( 'Height', 200, AnimT5, AnimT3 ),
      Ttxt( 'Now 313 m of the Skyline comes into view, 129 m are still hidden', AnimT1 ),
      Ttxt( 'H = 200 m: Note that the whole Skyline is BELOW Eye-Level', AnimT5 ),
      Tpse( AnimT3 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Chicago Skyline", "Description": "H = 200 m: Note that the whole Skyline is BELOW Eye-Level", "Height": 200, "FocalLengthField": 800, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 3, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": true, "deviceRatio": 1.5, "viewcenterHorizon": 2, "ObjType": [ 4, 3 ], "NObjects": [ 6, 0 ], "ObjDist": [ 91100, 0 ], "ObjDeltaDist": [ 200, 100 ], "ObjSideType": [ 2, 0 ], "ObjSidePos": [ 1040, 0 ], "ObjSideVar": [ -30.5, 0 ], "ObjSizeType": [ 3, 0 ], "ObjSize": [ 442, 10 ], "ObjSizeVar": [ 0.381, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'Lets go down to the Beach (2 m) again', AnimT1 ),
      Tval( 'Height', 2, AnimT5, AnimT3 ),
      Ttxt( 'Now lets apply severe Refraction of 3.5 R (Looming)', AnimT1 ),
      Tval( 'refractionCoeff', 0.714286, AnimT3, AnimT3 ),
      Ttxt( 'H = 2 m: Now 292 m of the Skyline comes into view again, 150 m are hidden', AnimT1 ),
      Tpse( AnimT3 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Chicago Skyline", "Description": "H = 2 m: Now 292 m of the Skyline comes into view again, 150 m are hidden", "Height": 2, "FocalLengthField": 800, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 3, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": true, "deviceRatio": 1.5, "viewcenterHorizon": 2, "ObjType": [ 4, 3 ], "NObjects": [ 6, 0 ], "ObjDist": [ 91100, 0 ], "ObjDeltaDist": [ 200, 100 ], "ObjSideType": [ 2, 0 ], "ObjSidePos": [ 1040, 0 ], "ObjSideVar": [ -30.5, 0 ], "ObjSizeType": [ 3, 0 ], "ObjSize": [ 442, 10 ], "ObjSizeVar": [ 0.381, 0 ], "refractionCoeff": 0.714286, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'Lets remove Refraction and climb to 660 m', AnimT5 ),
      Tval( 'refractionCoeff', 0, AnimT3, AnimT3 ),
      Tval( 'Height', 660, AnimT5, AnimT2 ),
      Ttxt( 'At an Altitude of 660 m the whole City is now visible.', AnimT1 ),
      Ttxt( 'On the Flat Earth the Skyline never disapeared!', AnimT3 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Chicago Skyline", "Description": "On the Flat Earth the Skyline never disapeared!", "Height": 660, "FocalLengthField": 800, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 3, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": true, "deviceRatio": 1.5, "viewcenterHorizon": 2, "ObjType": [ 4, 3 ], "NObjects": [ 6, 0 ], "ObjDist": [ 91100, 0 ], "ObjDeltaDist": [ 200, 100 ], "ObjSideType": [ 2, 0 ], "ObjSidePos": [ 1040, 0 ], "ObjSideVar": [ -30.5, 0 ], "ObjSizeType": [ 3, 0 ], "ObjSize": [ 442, 10 ], "ObjSizeVar": [ 0.381, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Canigou Demo

// Canigou Demo

Demos.New( 'Canigou',
  '<a target="_blank" href="https://www.metabunk.org/explained-observations-of-canigou-curvature-of-the-earth-atmospheric-refraction.t8688/">Observations of Canigou, Curvature of the Earth & Atmospheric Refraction</a> [metabunk]'
);

Demos.AddState(
  'CurveApp = { "DemoText": "Canigou Mountain", "Description": "This represents the Canigou Mountain in France; Height = 2790 m", "Height": 244, "FocalLengthField": 34, "Roll": 0, "Tilt": 7.36, "Pan": 0, "nLines": 45, "showModel": 1, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 5, 3 ], "NObjects": [ 40, 0 ], "ObjDist": [ 7230, 0 ], "ObjDeltaDist": [ 60, 100 ], "ObjSideType": [ 2, 0 ], "ObjSidePos": [ 0, 0 ], "ObjSideVar": [ -5620, 0 ], "ObjSizeType": [ 3, 0 ], "ObjSize": [ 2790, 10 ], "ObjSizeVar": [ 0.125, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'Lets fly to Allauch near Marseille: Distance = 257 km:', AnimT3 ),
      Tval( 'showData', true ),
      {
        Delay: AnimT2,
        Mode: 'parallel',
        TaskList: [
          Tval( 'ObjDist[0]', 257000, AnimT5 ),
          Tval( 'Height', 1000, AnimT5 ),
          Tval( 'Tilt', 0, AnimT5 ),
        ],
      },
      Ttxt( 'We are currently at an Altiude of 1000 m and can only see the top half of the Mountain.', AnimT1 ),
      Tpse( AnimT3 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Canigou Mountain", "Description": "We are currently at an Altiude of 1000 m and can only see the top half of the Mountain.", "Height": 1000, "FocalLengthField": 34, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 1, "showGrid": 1, "showData": true, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 5, 3 ], "NObjects": [ 40, 0 ], "ObjDist": [ 257000, 0 ], "ObjDeltaDist": [ 60, 100 ], "ObjSideType": [ 2, 0 ], "ObjSidePos": [ 0, 0 ], "ObjSideVar": [ -5620, 0 ], "ObjSizeType": [ 3, 0 ], "ObjSize": [ 2790, 10 ], "ObjSizeVar": [ 0.125, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'Lets zoom in to f = 1000 mm to take a closer look:', AnimT1 ),
      Tval( 'showData', false, AnimT3 ),
      Tval( 'FocalLengthField', 1000, AnimT5 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Canigou Mountain", "Description": "Lets zoom in to f = 1000 mm to take a closer look:", "Height": 1000, "FocalLengthField": 1000, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 1, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 5, 3 ], "NObjects": [ 40, 0 ], "ObjDist": [ 257000, 0 ], "ObjDeltaDist": [ 60, 100 ], "ObjSideType": [ 2, 0 ], "ObjSidePos": [ 0, 0 ], "ObjSideVar": [ -5620, 0 ], "ObjSizeType": [ 3, 0 ], "ObjSize": [ 2790, 10 ], "ObjSizeVar": [ 0.125, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'Lets go down to a Hill in Allauch at 244 m Altitude:', AnimT1 ),
      Ttxt( 'According to some Curvature Calculators we should NOT be able to see the Mountain:', AnimT3 ),
      Tval( 'Height', 244, AnimT5, AnimT3 ),
      Ttxt( 'H = 244 m: Yes indeed, the whole Mountain is now hidden behind the Curvature of the Earth!', AnimT1 ),
      Tpse( AnimT3 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Canigou Mountain", "Description": "H = 244 m: Yes indeed, the whole Mountain is now hidden behind the Curvature of the Earth!", "Height": 244, "FocalLengthField": 1000, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 1, "showGrid": 1, "showData": false, "showTangent": false, "showEyeLevel": false, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 5, 3 ], "NObjects": [ 40, 0 ], "ObjDist": [ 257000, 0 ], "ObjDeltaDist": [ 60, 100 ], "ObjSideType": [ 2, 0 ], "ObjSidePos": [ 0, 0 ], "ObjSideVar": [ -5620, 0 ], "ObjSizeType": [ 3, 0 ], "ObjSize": [ 2790, 10 ], "ObjSizeVar": [ 0.125, 0 ], "refractionCoeff": 0, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'But according to some Pictures (see Link above) we should be able to see Part of it !?', AnimT1 ),
      Ttxt( 'Maybe Refraction plays a role. Lets add Standard Refraction:', AnimT3 ),
      Tval( 'showEyeLevel', true, 0, AnimT3 ),
      Tval( 'showData', true ),
      Tval( 'refractionCoeff', 0.16761, AnimT5 ),
      Ttxt( 'Standard Refraction raises the Mountain relative to the Horizon about 672 m!', AnimT2 ),
      Tpse( AnimT3 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Canigou Mountain", "Description": "Standard Refraction raises the Mountain relative to the Horizon about 672 m!", "Height": 244, "FocalLengthField": 1000, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 1, "showGrid": 1, "showData": true, "showTangent": false, "showEyeLevel": true, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 5, 3 ], "NObjects": [ 40, 0 ], "ObjDist": [ 257000, 0 ], "ObjDeltaDist": [ 60, 100 ], "ObjSideType": [ 2, 0 ], "ObjSidePos": [ 0, 0 ], "ObjSideVar": [ -5620, 0 ], "ObjSizeType": [ 3, 0 ], "ObjSize": [ 2790, 10 ], "ObjSizeVar": [ 0.125, 0 ], "refractionCoeff": 0.16761, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'How can that be?', AnimT1 ),
      Ttxt( 'The Refraction Angle is 0.194 degrees.', AnimT2 ),
      Ttxt( 'The Angular Size of the Mountain at this Distance is only 0.622 degrees.', AnimT4 ),
      Ttxt( 'So the Mountain is raised 0.194 / 0.622 = 31.2% of its Height: that is 869 m!', AnimT4 ),
      Tpse( AnimT3 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Canigou Mountain", "Description": "So the Mountain is raised 0.194 / 0.622 = 31.2% of its Height: that is 869 m!", "Height": 244, "FocalLengthField": 1000, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 1, "showGrid": 1, "showData": true, "showTangent": false, "showEyeLevel": true, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 5, 3 ], "NObjects": [ 40, 0 ], "ObjDist": [ 257000, 0 ], "ObjDeltaDist": [ 60, 100 ], "ObjSideType": [ 2, 0 ], "ObjSidePos": [ 0, 0 ], "ObjSideVar": [ -5620, 0 ], "ObjSizeType": [ 3, 0 ], "ObjSize": [ 2790, 10 ], "ObjSizeVar": [ 0.125, 0 ], "refractionCoeff": 0.16761, "tempGradient": -0.0343, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'But the Horizon raises too, so the raise relative to the Horizon is reduced to 672 m.', AnimT1 ),
      Ttxt( 'The Temperature Gradient is now Standard dT/dh = -0.65°C/100m.', AnimT4 ),
      Ttxt( 'Lets see what a stable Inversion with a Gradient dT/dh = +1°C/100m can achieve:', AnimT4 ),
      Tval( 'refractionCoeff', 0.267083, AnimT5 ),
      Ttxt( 'On the real Globe there is no Problem to see Mount Canigou!', AnimT1 ),
      Tpse( AnimT3 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Canigou Mountain", "Description": "On the real Globe there is no Problem to see Mount Canigou!", "Height": 244, "FocalLengthField": 1000, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 1, "showGrid": 1, "showData": true, "showTangent": false, "showEyeLevel": true, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 5, 3 ], "NObjects": [ 40, 0 ], "ObjDist": [ 257000, 0 ], "ObjDeltaDist": [ 60, 100 ], "ObjSideType": [ 2, 0 ], "ObjSidePos": [ 0, 0 ], "ObjSideVar": [ -5620, 0 ], "ObjSizeType": [ 3, 0 ], "ObjSize": [ 2790, 10 ], "ObjSizeVar": [ 0.125, 0 ], "refractionCoeff": 0.267083, "tempGradient": 0.01, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

Demos.AddAnimation(
  {
    Mode: 'serial',
    TaskList: [
      Ttxt( 'Lets compare how the Scene would look like on the Flat Earth:', AnimT1 ),
      {
        Delay: AnimT3,
        Mode: 'parallel',
        TaskList: [
          Tval( 'FocalLengthField', 350, AnimT5 ),
          Tval( 'ObjSidePos[0]', 6490, AnimT5 ),
        ],
      },
      Tval( 'showModel', 3 ),
      Ttxt( 'On Flat Eath the whole Mountain should be visible, but is not in Reality!', AnimT1 ),
    ],
  }
);

Demos.AddState(
  'CurveApp = { "DemoText": "Canigou Mountain", "Description": "On Flat Eath the whole Mountain should be visible, but is not in Reality!", "Height": 244, "FocalLengthField": 350, "Roll": 0, "Tilt": 0, "Pan": 0, "nLines": 45, "showModel": 3, "showGrid": 1, "showData": true, "showTangent": false, "showEyeLevel": true, "deviceRatio": 1.5, "viewcenterHorizon": 0, "ObjType": [ 5, 3 ], "NObjects": [ 40, 0 ], "ObjDist": [ 257000, 0 ], "ObjDeltaDist": [ 60, 100 ], "ObjSideType": [ 2, 0 ], "ObjSidePos": [ 6490, 0 ], "ObjSideVar": [ -5620, 0 ], "ObjSizeType": [ 3, 0 ], "ObjSize": [ 2790, 10 ], "ObjSizeVar": [ 0.125, 0 ], "refractionCoeff": 0.267083, "tempGradient": 0.01, "refractionSync": 1, "pressure": 1013.0098, "temperatureC": 14.987, "refractionFactMin": 0.5, "refractionFactMax": 10000, "rEarth": 6371000, "rFEarth": 10007543 }'
);

</jscript>
{{end data|code}}

Weitere Infos zur Seite
Erzeugt Sunday, December 3, 2017
von wabis
Zum Seitenanfang
Geändert Friday, March 16, 2018
von wabis