Use your fingers or mouse to control the model (hold shift key or use mouse wheel to zoom it). Canvas is matched to your browser window.

Cubic Bezier patch with adaptive subdivision

As we known that a cubic spline curve with control points a0 , a1 , a2 , a3 can be subdivided in two sub curves with control points b0 , b1 , b2 , b3 and c0 , c1 , c2 , c3 as shown to the left
  function subdiv(a0,a1,a2,a3){
    var b1 = av(a0,a1), a12 = av(a1,a2), b2 = av(b1, a12),
        c2 = av(a2,a3), c1 = av(a12,c2), b3 = av(b2,c1);
    return [[a0,b1,b2,b3],[b3,c1,c2,a3]];
  function av(v1, v2){
    return [.5*(v1[0]+v2[0]), .5*(v1[1]+v2[1]), .5*(v1[2]+v2[2])];
where av(v1, v2) is the midpoint between v1 and v2.
A cubic Bezier spline patch can be subdivided recursively in 4 sub patches by subdivision of spline curves (see the page source). For parallel patch normals N0 , N1 , N2 , N3
    S = |N0 + N1 + N2 + N3 |2 = 16
therefore subdivision is stopped when 16 - S < eps.

This algorithm is simple but not very accurate. E.g. for eps = 0.1 you can see small holes between quads with different sizes (and subdivision orders).

Contents   Previous: Tensor product spline surfaces   Next: Subdivision spline curves
updated 14 June 2010