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