Subversion Repositories wimsdev

Rev

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
}*/