Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
20 | reyssat | 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 | }*/ |