# Deformation - Free Form Deformation

*Path of the code: [04_ffd]*

*ffd_deform()*is called. This function, currently empty, is expected to apply the FFD deformation to the shape. Note that a timer system ensure that

*ffd_deform*function is called periodically (and not at every mouse event) in order to limit the computation. >

**Implement the FFD deformation**on the shape using Bezier functions \(\forall m\,,\;\; \displaystyle q_m = \sum_i \sum_j \sum_k b_i(x_m)\,b_j(y_m)\,b_k(z_m)\;g_{ijk}\) With \(b_{i/j/k}\) the Bezier basis function, \(g_{ijk}\) the absolute coordinates of the grid vertices, \(p_m=(x_m,y_m,z_m)\in[0,1]^3\) the original shape vertex coordinates associated to the parametric coordinates of Bezier function, and \(q_m\) are the deformed coordinates.

*Hints*

- - You will need to complete the functions
*precompute_weights()*and*ffd_deform()*. - - The grid-vertex coordinates \(g_{ijk}\) can be accessed as grid(kx,ky,kz) for the integer indices kx, ky, kz. Its dimension along the three directions can be accessed as grid.dimension.x/y/z.
- - A function computing \({N \choose i}\) is provided as
*binomial_coeff(N,k)*(in file ffd.cpp). - - Beware that to approximate \(N\) points (\(p_k\,, \;k\in[\![0,N[\![\)) with a Bezier polynomial, you need to consider a polynomial of degree \(N-1\) (linear for 2 points, cubic for 4 points, etc).
- - You may need to precompute values related to the parameteric coordinates of the vertices in the grid, and pass these values as argument of the function
*ffd_deform()*.