Subversion Repositories wimsdev

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.         DynAPI Distribution
  3.         Bezier Class
  4.        
  5.         Bezier Algorithm Reference: http://astronomy.swin.edu.au/~pbourke/curves/bezier/
  6.  
  7.         The DynAPI Distribution is distributed under the terms of the GNU LGPL license.
  8.  
  9.         requires: dynapi.fx.Thread
  10. */
  11.  
  12.  
  13. function Bezier(cp, n) {
  14.         var l = cp.length;
  15.         var p = [];
  16.         for (var i=0; i<n; i++) p = p.concat(Bezier._plot(cp,i/n));
  17.         return p.concat([cp[l-2],cp[l-1]]);
  18. }
  19.  
  20. Bezier._plot = function (cp, mu) {
  21.         var n = (cp.length/2)-1;
  22.         var k,kn,nn,nkn;
  23.         var blend;
  24.         var b = [0,0];
  25.  
  26.         var muk = 1;
  27.         var munk = Math.pow(1-mu, n);
  28.  
  29.         for (k=0;k<=n;k++) {
  30.                 nn = n;
  31.                 kn = k;
  32.                 nkn = n - k;
  33.                 blend = muk * munk;
  34.                 muk *= mu;
  35.                 munk /= (1-mu);
  36.                 while (nn >= 1) {
  37.                         blend *= nn;
  38.                         nn--;
  39.                         if (kn > 1) {
  40.                                 blend /= kn;
  41.                                 kn--;
  42.                         }
  43.                         if (nkn > 1) {
  44.                                 blend /= nkn;
  45.                                 nkn--;
  46.                         }
  47.                 }
  48.                
  49.                 b[0] += cp[k*2] * blend;
  50.                 b[1] += cp[k*2+1] * blend;
  51.         }
  52.         b[0] = Math.round(b[0]);
  53.         b[1] = Math.round(b[1]);
  54.         return b;
  55. }
  56.  
  57. /*function Bezier3(cp,mu) {
  58.         var x1=cp[0],y1=cp[1],x2=cp[2],y2=cp[3],x3=cp[4],y3=cp[5];
  59.         var mu2 = mu * mu;
  60.         var mum1 = 1 - mu;
  61.         var mum12 = mum1 * mum1;
  62.         var x = Math.round(x1 * mum12 + 2 * x2 * mum1 * mu + x3 * mu2);
  63.         var y = Math.round(y1 * mum12 + 2 * y2 * mum1 * mu + y3 * mu2);
  64.         return [x,y];
  65. }
  66.  
  67. function Bezier4(cp,mu) {
  68.         var x1=cp[0],y1=cp[1],x2=cp[2],y2=cp[3],x3=cp[4],y3=cp[5],x4=cp[6],y4=cp[7];
  69.         var mum1 = 1 - mu;
  70.         var mum13 = mum1 * mum1 * mum1;
  71.         var mu3 = mu * mu * mu;
  72.         var x = Math.round(mum13*x1 + 3*mu*mum1*mum1*x2 + 3*mu*mu*mum1*x3 + mu3*x4);
  73.         var y = Math.round(mum13*y1 + 3*mu*mum1*mum1*y2 + 3*mu*mu*mum1*y3 + mu3*y4);
  74.         return [x,y];
  75. }*/
  76.