判斷曲線與圓形之交點
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...