判斷曲線與圓形之交點

Bezier curve

by j91157j91157

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 radius = 10;
var p0x, p1x, p2x, p3x;
var p0y, p1y, p2y, p3y;

init();
animate();

////////////////////// From borgar uniroot.js (Brent RootFinder) ////////////////////////////////
function uniroot ( func, lowerLimit, upperLimit, errorTol, maxIter ) {
  var a = lowerLimit, b = upperLimit, c = a;
  var fa = func(a), fb = func(b), fc = fa;
  var s = 0, fs = 0, 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 func(t){
	var t3 = t*t*t;
  var t2 = t*t;
  var oneMt3 = (1-t)*(1-t)*(1-t);
  var...