ODE Solvers (單擺)
by j91157j91157
HTML
<div id="info">Homework 5 Helper
<br>Right click to move RED dot<br>
<select id="method">
<option value="euler">Euler</option>
<option value="midpoint" selected="">Mid-point</option>
<option value="rk4">Runge-Kutta 4th (RK4)</option>
</select>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/92/three.min.js"></script>
<script src="https://rawgit.com/mrdoob/three.js/master/examples/js/Detector.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/stats.js/r16/Stats.min.js"></script>
<script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
CSS
#info {
position: absolute;
top: 0px;
width: 100%;
padding: 10px;
text-align: center;
color: #ffff00
}
body {
overflow: hidden;
}
JavaScript
$('#method').change( function() {
console.log ( $(this).val() );
let Type = $(this).val();
if (Type === 'euler') {
x[0] = Math.PI/6;
x[1] = 0;
Euler = true;
MidPoint = false;
RK4 = false;
}
else if (Type === 'midpoint') {
x[0] = Math.PI/6;
x[1] = 0;
Euler = false;
MidPoint = true;
RK4 = false;
}
else if (Type === 'rk4') {
x[0] = Math.PI/6;
x[1] = 0;
Euler = false;
MidPoint = false;
RK4 = true;
}
});
var camera, scene, renderer;
var ring, line;
var x = []; // x0: theta, x1: theta_dot
var mousePoint;
var mouse = new THREE.Vector2();
var stats;
var t, dt;
var g, l;
var lastTime = 0;
var Euler = false, MidPoint = true, RK4 = false;
init();
animate();
function init() {
renderer = new THREE.WebGLRenderer({
antialias: true
});
// STATS
stats = new Stats();
stats.domElement.style.position = 'absolute';
stats.domElement.style.top = '0px';
stats.domElement.style.zIndex = 100;
document.body.appendChild( stats.domElement );
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setClearColor(0x888888);
document.body.appendChild(renderer.domElement);
t = 0;
dt = 0.2;
l = 3;
g = 10;
x[0] = Math.PI/6;
x[1] = 0;
scene = new THREE.Scene();
camera = new THREE.OrthographicCamera(-5, 5, 7, -3, -10, 100);
camera.position.z = 10;
pointLight = new THREE.PointLight(0xffffff);
pointLight.position.set(0, 1, 2);
pointLight.rotation.x = Math.PI/2;
scene.add(pointLight);
/////////////////////////////
let grid = new THREE.GridHelper (20,20, 'white','white')
scene.add (grid)
grid.rotation.x = Math.PI/2
ring = new THREE.Mesh (new THREE.RingGeometry (0.2, 0.5 ,32),
new THREE.MeshLambertMaterial({color: 0xffff00}));
scene.add (ring);
let geometry = new THREE.Geometry();
geometry.vertices.push (new THREE.Vector3(0,4,0));
geometry.vertices.push (new THREE.Vector3());
let material = new...