
// *******************************************************
//   Version la plus basique qui nécessite une fonction
//      pour calculer les coefficients binomiaux
//                A savoir refaire !
// *******************************************************

function r=binom(k,n)
    // si k>n/2 on peut réduire le nombre de multiplications en calculant n-k parmi n au lieu de k parmi n
    if k > n/2
        k=n-k
    end
    p1=1
    for i=2:k
        p1=p1*i
    end
    p2=1
    for i=n-k+1:n
        p2=p2*i
    end
    r=p2/p1
endfunction

function M=bezier(P,m)
    M=[]
    
    // On détermine n le nombre de colonne de P
    S=size(P)
    n=S(2)
    
    for i=1:m+1
        s=[0;0]
        for k=0:n-1
            s=s+binom(k,n-1)*((i-1)/m)^k*(1-(i-1)/m)^(n-1-k)*P(:,k+1)
        end
        M=[M,s]
    end
endfunction


// *******************************************************
//                   Version optimisée
// *******************************************************

function M=bezierOP(P,m)
    M=[]
    // On calcule d'abord le tableau des coefficients binomiaux
    S=size(P)
    n=S(2)-1
    CBin=ones(n+1,n+1)
    for i=3:n+1
        for k=2:(i-1)
            CBin(k,i)=CBin(k-1,i-1)+CBin(k,i-1)
        end
    end
    
    // T correspond à une subdivision de l'intervalle [0,1] en m+1 points
    T=linspace(0,1,m+1)
    
    for i=1:length(T)
        // On calcule ensuite, pour chaque valeur de la liste T, la liste des T(i)^k*(1-T(i))^n-k
        if T(i)==1
            LPuiss=[zeros(1,n),1]
        else
            LPuiss=[(1-T(i))^n]
            for k=1:n
                LPuiss=[LPuiss,LPuiss($)*T(i)/(1-T(i))]
            end
        end
        
        
        // Finalement on calcule la valeur de la courbe de Bézier
        s=0
        for k=1:n+1
            s=s+CBin(k,n+1)*LPuiss(k)*P(:,k)
        end
        M=[M,s]
    end
endfunction
