ベジェ曲線。その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}};