單擺+彈簧

by yi hom

HTML

<div id="info">Spring<br/>
    <a href="javascript:reset();">reset</a>
</div>
<script src="http://cdnjs.cloudflare.com/ajax/libs/three.js/r70/three.min.js"></script>

CSS

#info {
    position: absolute;
    top: 0px;
    width: 100%;
    padding: 10px;
    text-align: center;
    color: #ffff00
}
#midpt{
  position: absolute;
  top:50%;
  left:10%;
  color: red;
}
#euler{
  position: absolute;
  top:30%;
  left:10%;
  color: red;
}
#rk4{
  position: absolute;
  top:70%;
  left:10%;
  color: red;
}
body {
    overflow: hidden;
}

JavaScript

var camera, scene, renderer;
var mesh, border,mesh1, mesh2;
var clock = new THREE.Clock();

var l=20, g = 9.8;
var x = [];
var x1,x2,x3,x4;
var x1=[], x2=[];
var M=200,m=1;
var P = new THREE.Object3D();
var Pa = new THREE.Object3D();
function print2x2 (a) {
	console.log (a[0][0] + ' ' + a[0][1]);
	console.log (a[1][0] + ' ' + a[1][1]);
}

function AxB (a,b) {
	var ab = [];
    ab.push ([a[0][0]*b[0][0] + a[0][1]*b[1][0], a[0][0]*b[0][1]+a[0][1]*b[1][1]]);
    ab.push ([a[1][0]*b[0][0] + a[1][1]*b[1][0], a[1][0]*b[0][1]+a[1][1]*b[1][1]]);
    return ab;
}
// invert a
function invert (a) {
    var ainv = [];
    
    var det = a[0][0] * a[1][1] - a[0][1]*a[1][0];
    ainv.push ([a[1][1]/det, -a[0][1]/det]);
    ainv.push ([-a[1][0]/det, a[0][0]/det]);
    return ainv;
}
var a = [[165,300*Math.cos(x3)],[Math.cos(x3)/20,1]];
var ainv = invert (a);
var ident = AxB(a,ainv);

function reset() {
	x[0] = 150, x[1] = 0;
}

function deriv (x) {
	var ff = [];
    ff.push (x[1]);                  // x_dot = v;
    ff.push (-g/l*Math.sin(x[0]*Math.PI/180));  // v_dot = 1/m *(-cx_dot -kx)
    return ff;
}

function deriv1 (x1) {
	var ff = [];
  var a = [[M+m,m*l*Math.cos(x1[2]*Math.PI/180)],[Math.cos(x1[2]*Math.PI/180)/l,1]];
  var ainv = invert(a);
  dx2=(ainv[0][0]*m*l*x1[3]*x1[3]*Math.sin(x1[2]*Math.PI/180))+(ainv[0][1]*(-g/l)*Math.sin(x1[2]*Math.PI/180));
  dx4=(ainv[1][0]*m*l*x1[3]*x1[3]*Math.sin(x1[2]*Math.PI/180))+(ainv[1][1]*(-g/l)*Math.sin(x1[2]*Math.PI/180));
  print2x2(a);

  
  	ff.push (x1[1]);                  // x_dot = v;
    ff.push (dx2);  
    ff.push (x1[3]);                  // x_dot = v;
    ff.push (dx4);
    // v_dot = 1/m *(-cx_dot -kx)
    return ff;
}
function EulerSolver(x1, dt) {
  var n = x1.length;

  // Euler's method
  var f = deriv1(x1);
  for (var i = 0; i < n; i++) {
    x1[i] += f[i] * dt;
  }
}

function MidPoint(x1, dt) {
  var n = x1.length;
  var f = deriv1(x1);
  var xmid = [];
  for (var i = 0; i < n; i++) {
    xmid[i] = x1[i] + f[i]...