WaBis

walter.bislins.ch

Sim: Anwendung

Sim : Demo | Download | Anwendung | Properties | Funktionen

Kopiere die Datei Sim.js in ein beliebiges Verzeichnis. Für die folgende Beschreibung wird angenommen, dass sich die Datei im selben Verzeichnis wie die Webseite befindet.

1. JavaScripts includen

<script src="x.js" type="text/javascript"></script>
<script src="Sim.js" type="text/javascript"></script>

2. Sim erzeugen

<script type="text/javascript">
var MySim = new Sim( Parameters );
  :
</script>

3. Properties und Funktionen verwenden

Das folgende Beispiel zeigt exemplarisch, wie mit dem Sim gearbeitet werden kann. Es ist ein Auschnitt des Codes der Demo.

var PendulumModel = {
  v0: 4,    // start speed
  a: 0,     // current angle 
  da: 0,    // current angular speed
  dda: 0,   // current angular acceleration
  d1: 0,    // linear damping
  d2: 0.1,  // quadratic damping
  m: 1,     // pendulum mass
  l: 1,     // pendulum length
  g: 9.81,  // gravitational acceleration
  Fl: 0,    // current string force
  Fg: 0,    // current gravity force
  Fd: 0,    // current damping force
  Ft: 0,    // current total force
  graph: null,
  sim: null,

  Create: function( sim ) {
    this.sim = sim;
    var me = this;
    this.graph = NewGraph2D( {
      Id: 'PendulumModel-Graph',
      Width: '100%',
      Height: '60%',
      DrawFunc: function(){ me.Draw(); },
      OnClick: function(){ sim.Pause(true); },
      AutoReset: false,
      AutoClear: false,
    } );
  },

  Reset: function() {
    this.a = 0;
    this.da = this.v0;
    this.dda = 0;
  },

  Update: function() {
    // is called from sim to compute next time step values

    // compute all forces
    this.Fg = this.m * this.g;
    this.Fl = this.Fg * Math.cos( this.a );
    this.Fd = this.d1 * Math.abs( this.da ) + this.d2 * this.da * this.da;
    var vdir = this.da >= 0 ? -1 : 1;
    this.Ft = -this.Fg * Math.sin( this.a ) + vdir * this.Fd;

    // compute new acceleration, speed and position by simple numerical integration
    this.dda = this.Ft / this.m;
    this.da += this.dda * this.sim.DeltaTime;
    this.a += this.da * this.sim.DeltaTime;
  },

  Draw: function() {
    // is called from sim once per frame to draw pendulum

    var g = this.graph;

    g.Reset();
    g.MapWindow( 0, 0.5, 2.2, 0, 0 );

    // compute pendulum position
    var x = this.l * Math.sin( this.a );
    var y = -this.l * Math.cos( this.a ) + 1;
  
    // draw pendulum
    g.SetLineAttr( 'black', 2 );
    g.Line( 0, 1, x, y );
    g.SetMarkerAttr( 'Circle', 20, 'black', 'yellow', 2 );
    g.Marker( x, y );

    // draw zero marker
    g.SetMarkerAttr( 'ArrowUp', 10, 'black', 'white', 1 );
    g.Marker( 0, -0.04 );
  },

};

var PendulumSim = new Sim( {
  SimObj:        PendulumModel,
  ResetFuncs:    function(sim) { sim.SimObj.Reset(); },
  TimeStepFuncs: function(sim) { sim.SimObj.Update(); },
  FrameFuncs:    function(sim) { sim.SimObj.Draw(); },
} );

PendulumModel.Create( PendulumSim );

PendulumSim.Run( true );


Weitere Infos zur Seite
Erzeugt Donnerstag, 13. Juli 2017
von wabis
Zum Seitenanfang
Geändert Sonntag, 16. Juli 2017
von wabis