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...