B-spline Curves: Subdividing a B-spline Curve

Subdividing a B-spline curve follows exactly the same procedure for subdividing a Bézier curve. However, de Boor's algorithm will be used.

Selecting Control Points

Suppose we want to subdivide a B-spline curve at u into two B-spline curves, one on [0,u] and the other on [u,1]. The first thing to do is to apply de Boor's algorithm at u. Note that if u is in [uk, uk+1), then at most p+1 control points will be used in the computation, namely: Pk, Pk-1, ..., Pk-p. To find the control points of the B-spline curve on [0,u], we start with P0 and follow the control polyline. When we encounter a control point or a point computed in the process of de Boor's algorithm, we select that point and make a turn. This process continues until we reach C(u) which is also selected as a control point. These points, in the visiting order, form the control points that define the B-spline curve on [0,u]. For the B-spline curve defined on [u,1], we start with the point C(u) and apply the same process. We select each encountered point and make a turn until Pn is reached. Note that this order is important!!!

The following shows a B-spline curve of degree 3 defined by 11 (n = 10) control points. Suppose we wish to subdivide this curve at u = 0.5. The computation process of C(0.5) using de Boor's algorithm generates a de Boor net. In the figure below, points on column 0 are marked with circles, points on column 1 are marked with squares, points on column 2 are marked with triangles, points on column 3 are marked with pentagons, and the point on the curve C(u) is on column 4. Therefore, the control points of the B-spline curve on [0,u] are P0, P1, P2, P3, P4, a (take a turn), b (take a turn), c (take a turn), and C(0.5). The control points of the B-spline curve defined on [u,1] are C(0.5), d (take a turn), e (take a turn), f (take a turn), P8, P9 and P10.

Thus, the control points for the curve on [0,u] include the original unaffected control points and the first point of each polyline of the de Boor net. Similarly, the control points for the curve on [u,1] consists of the last point of each polyline of the de Boor net, followed by the other unaffected control points. Since the first and last points of a polyline of a de Boor net are the first and last points on the same column, they can be extracted once a column is completely computed.

In the following diagram showing the triangular computation scheme of de Boor's algorithm, we can immediately extract Pk-p (curve on [0,u]) and Pk-s (curve on [u,1]). Once column 1 is computed, we can extract Pk-p+1,1 (curve on [0,u]) and Pk-s,1 (curve on [u,1]). After column 2 is computed, we can extract Pk-p+2,2 (curve on [0,u]) and Pk-s,2 (curve on [u,1]). This process continues until we reach Pk-s,p-s = C(u) which will be selected for both curves. Thus, graphically, points on the upper edge of the wedge from P0 to Pk-s,p-s form the control points of the curve on [0,u], and points on the lower edge from Pk-s,p-s to Pn form the control points of the curve on [u,0].

Selecting Knots

The knot vector for the curve on [0,u] includes all knots in [0,u) followed by p+1 copies of u, and the knot vector for the curve on [u,1] includes p+1 copies of u followed by all knots in (u,1].

For example, if the original knot vector of a B-spline curve of degree 4 is { 0(5), 0.3, 0.4, 0.6, 0.7, 0.85, 0.9, 1(5) }. If the curve is divided at u = 0.65, the curve on [0,0.65] has a knot vector { 0(5), 0.3, 0.4, 0.6, 0.65(5) } and the curve on [0.65, 1] has a knot vector { 0.65(5), 0.7, 0.85, 0.9, 1(5) }.

It can be shown that the component curves constructed this way are also B-spline curves with the original degree and are part of the original curve on [0,u] and [u,1].

Subdividing a B-spline Curve into Bézier Curve Segments

If a B-spline curve of degree p is subdivided at its knots, then each curve segment becomes a Bézier curve of degree p. The following figures show an example. Figure (a) is a B-spline curve of degree 4 defined by 7 (n = 6) control points and knot vector { 0(5), 1/3, 2/3, 1(5) }. Figure (b) shows the de Boor net at u = 1/3 and Figure (c) shows the selected control points after the subdivision completes. The curve segment on [0,1/3] is now a Bézier curve of degree 3, while the second curve segment on [2/3,1] is still a B-spline curve of degree 4 defined by 6 (n = 5) control points and a knot vector { 1/3(5), 2/3, 1(5) }. Figure (d) shows the de Boor net at u = 2/3 and Figure (e) shows the subdivided curves, one on [1/3,2/3] and the other on [2/3,1]. Finally, Figure (f) shows the original control polyline and the control polylines of the three Bézier segments. The original B-spline curve has 7 control points. However, the total number of control points for the three Bézier curves is 13! It is almost doubled.

(a) (b) (c)
(d) (e) (f)

Why is each segment a Bézier curve? Since the given B-spline curve is subdivided at its knots, each curve segment has no internal knots. Moreover, the subdivision process makes the internal knots to have multiplicity p+1, and the curve segment is "clamped" at the first and last control points of each curve segment. From a previous page, we know that these curve segments must be Bézier curves.

In the process of subdividing a B-spline curve, a large number of control points will be introduced. Therefore, manipulating a B-spline curve is easier than manipulating its component Bézier curves. Moreover, the B-spline curve is Cp-k continuous at a knot point, where k is the multiplicity of the corresponding knot. When we manipulate a B-spline curve by moving control points, this continuity is always maintained. However, if a B-spline curve is subdivided into a sequence of Bézier curves, maintaining the continuity at the joining control points would be a challenging task. Consequently, handling a B-spline curve is much easier than handling a sequence of Bézier curves.