# TP8 : Uniform B-splines as Subdivision Surfaces

1 April 2016 in

## Code

Do

git pull


or, if you don’t have the local repo,

git clone https://github.com/bbrrck/geo-num-2016.git


As usual, test by

cd TP8/
mkdir build
cd build
cmake ..
make
./geonum_TP8 torus


If everything goes well, you should see a cube. The viewer can be controlled with the mouse: click and drag to rotate, scroll to zoom (also works with pageup/pagedown keys), press W to toggle the wireframe mode (or Z on AZERTY keyboard).

In case the SimpleViewer does not work, you can still export and visualise the surfaces via the python script, included in plots/.

## Algorithm

Much like in the curve case (recall Chaikin in TP4 or Lane-Riesenfeld in TP5), a uniform bi-quadratic B-spline surface ($k=2,l=2$) can be evaluated by iterative subdivision of the initial control net $V^0_{i,\;j}$. Here’s the algorithm to perform one step of the subdivision.

At the $k$-th iteration, for each cell of the grid composed of the vertices $V^k_{i,\;j}$ $V^k_{i+1,\;j}$ $V^k_{i,\;j+1}$ $V^k_{i+1,\;j+1}$ we define a new grid as follows

$\begin{array}{ll} V^{k+1}_{2i,\;2j} &= \frac1{16} \left( 9V^k_{i,\;j} + 3V^k_{i+1,\;j} + 3V^k_{i,\;j+1} + 1V^k_{i+1,\;j+1} \right), \\ V^{k+1}_{2i+1,\;2j} &= \frac1{16} \left( 3V^k_{i,\;j} + 9V^k_{i+1,\;j} + 1V^k_{i,\;j+1} + 3V^k_{i+1,\;j+1} \right), \\ V^{k+1}_{2i,\;2j+1} &= \frac1{16} \left( 3V^k_{i,\;j} + 1V^k_{i+1,\;j} + 9V^k_{i,\;j+1} + 3V^k_{i+1,\;j+1} \right), \\ V^{k+1}_{2i+1,\;2j+1} &= \frac1{16} \left( 1V^k_{i,\;j} + 3V^k_{i+1,\;j} + 3V^k_{i,\;j+1} + 9V^k_{i+1,\;j+1} \right). \end{array}$

Important: If the surface is closed (cyclic) in the direction $u$, the subscripts $i+1$ of $V^k$ are taken modulo the number of vertices in the direction $u$. The same applies for the direction $v$ and the subscripts $j+1$.   A subdivision step, open surface.     A subdivision step, surface closed in the $u$ direction.

## Implementation

As before, the surfaces are represented via three coordinate matrices X, Y, Z. Apply the algorithm to each matrix individually. The openness/closedness of a surface in a particular direction is controled via the parameters u_closed, v_closed (these are read from the input file).

Start by implementing the algorithm for a surface closed in both directions as this is easier to do; test on [torus]. Don’t forget to use the modulo arithmetic where needed. Then, think about what needs to be changed if the surface is open in one or both directions.

## ToDo

1. Implement one step of the above subdivision algorithm for closed uniform B-spline surfaces. [torus]
2. Modify you implementation for surfaces which are open: either in one direction only [cylinder] or in both directions [grid].