hw3p helper

Bezier curve

by Bai Shiuan Huang

HTML

<div id="info">THREE.JS 2D
  <br>cubic Bezier curve
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/84/three.min.js"></script>

CSS

#info {
  position: absolute;
  top: 0px;
  width: 100%;
  padding: 10px;
  text-align: center;
  color: #ffff00
}

body {
  overflow: hidden;
}

JavaScript

var camera, scene, renderer;
var mouse = new THREE.Vector2();
var halfSize = 25;
var bezier, ctrlPolygon, ctrlPtMesh, ctrlPts;
var intersect;
var p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y;
init();
animate();

function uniroot ( func, lowerLimit, upperLimit, errorTol, maxIter ) {
  var a = lowerLimit, b = upperLimit, c = a;
  var fa = func(a), fb = func(b), fc = fa, s = 0, fs = 0;
  var tol_act, new_step, prev_step, p, q;  

  errorTol = errorTol || 0;
  maxIter  = maxIter  || 1000;

  while ( maxIter-- > 0 ) {
  
    prev_step = b - a;
   
    if ( Math.abs(fc) < Math.abs(fb) ) {
      a = b, b = c, c = a;
      fa = fb, fb = fc, fc = fa;
    }
    tol_act = 1e-15 * Math.abs(b) + errorTol / 2;
    new_step = ( c - b ) / 2;
    if ( Math.abs(new_step) <= tol_act || fb === 0 ) {
      return b;
    }
    if ( Math.abs(prev_step) >= tol_act && Math.abs(fa) > Math.abs(fb) ) {
      var t1, cb, t2;
      cb = c - b;
      if ( a === c ) { 
        t1 = fb / fa;
        p = cb * t1;
        q = 1.0 - t1;
      }
      else { 
        q = fa / fc, t1 = fb / fc, t2 = fb / fa;
        p = t2 * (cb * q * (q - t1) - (b - a) * (t1 - 1));
        q = (q - 1) * (t1 - 1) * (t2 - 1);
      }
      if ( p > 0 ) {
        q = -q; 
      }
      else {
        p = -p; 
      }
      if ( p < ( 0.75 * cb * q - Math.abs( tol_act * q ) / 2 ) &&
           p < Math.abs( prev_step * q / 2 ) ) { 
        new_step = p / q;
      }
    }
    if ( Math.abs( new_step ) < tol_act ) { 
      new_step = ( new_step > 0 ) ? tol_act : -tol_act;
    }
    a = b, fa = fb;
    b += new_step, fb = func(b);

    if ( (fb > 0 && fc > 0) || (fb < 0 && fc < 0) ) {
      c = a, fc = fa;
    }
  }
}

function expo(x, times){
  if (times == 0)
  	return 1;
  else  
		return x * expo(x,times-1);
}

function rootfind(t){

  return...