ベジェ曲線。その5ぐらい?
教えてgoo で使えるくらいにコンパクトにしてみる
// ベジェ曲線ジェネレータ // x0=0, y0=0, x1=a, y1=b, x2=c, y2=d, x3=1, y3=1 を通るベジェ曲線の y = f(x) を返す function BezierGenerator (a, b, c, d) { var p = [a || 0, b || 0, c || 1, d || 1]; switch (String (a).toLowerCase()) { case 'ease': p = [.25, .1, .25, 1]; break; case 'linear': p = [0, 0, 1, 1]; break; case 'ease-in': p = [0.42, 0, 1, 1]; break; case 'ease-out': p = [0, 0, 0.58, 1]; break; } var e = 3 * p[0], f = 3 * (p[2] - p[0]) - e, g = 1 - e - f; var h = 3 * p[1], i = 3 * (p[3] - p[1]) - h, j = 1 - h - i; return function (t) { if (t < 0 || 1 < t) throw new Error; for (var x = t, m = 5, n; m--;) if (1e-3 < Math.abs (n = x * (e + x * (f + x * g)) - t)) x -= n / (e + x * (2 * f + 3 * g * x)); return ((x * j + i) * x + h) * x; } }
圧縮
function BG(a,b,c,d){var e=3*a,f=3*(c-a)-e,g=3*b,h=1-e-f,i=3*(d-b)-g,j=1-g-i;return function(a){for(var b=a,c=5,d;c--;)if(.001<Math.abs(d=b*(e+b*(f+b*h))-a))b-=d/(e+b*(2*f+3*h*b));return((b*j+i)*b+g)*b}};