單擺+彈簧
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]...