## Mathematical Principles

The following chapter describes some basics about splines and how to use them in TinySpline. At first, we start with a mathematical examination of NURBS, B-Splines, Bézier curves, lines, and points. The given code examples are using the C interface.

Let \(\supset\) be the superset relation so that we can write \(A \supset B\) in case of two sets \(A, B\) with \(A\) being the superset of \(B\). Furthermore, we define the following sets of splines:

- \(\text{NURBS}\)

The set of all NURBS curves. - \(\text{BSPLINES}\)

The set of all B-Spline curves. - \(\text{BEZIERS}\)

The set of all Bézier curves. - \(\text{LINES}\)

The set of all lines. - \(\text{POINTS}\)

The set of all points.

Then, the following equation holds:

$$\text{NURBS} \supset \text{BSPLINES} \supset \text{BEZIERS} \supset \text{LINES} \supset \text{POINTS}.$$

To put it differently, we can say that every point is a line, every line is a Bézier curve, every Bézier curve is a B-Spline, and ever B-Spline is a NURBS. In order to understand this relation, we will start with a (simple) definition of B-Splines that is more code- than maths-related.

A B-Spline \(b\) consists of four attributes:

- The degree of \(b\) describing the (general)
*smoothness*of \(b\). - The control points of \(b\) used to shape \(b\).
- The knot vector of \(b\) (simply knots) used to define the continuity of \(b\) at certain points (not the control points!).
- The dimension of \(b\) defining how many components each control point has (for instance, (x, y) in 2D).

A B-Spline \(b\) of degree \(p\) with \(m\) control points has \(n = m+p+1\) knots. The knot vector \(knots\) must be in ascending order (monotonically increasing). That is, \(u_i \leq u_{i+1}\) for all knot values \(u\) in \(knots\) and \(0 \leq i < n-1\). The domain of \(b\) is given by \(u_p\) and \(u_{n-p}\). That means, one can retrieve points laying on \(b\) by evaluating \(b\) at any knot value \(u\) with \(u_p \leq u \leq u_{n-p}\). The evaluation of \(b\) at \(u\) is denoted by \(b(u)\).

The following example illustrates the domain of B-Splines. Let's say \(b\) is a B-Spline of degree 3 (cubic B-Spline) with the following knot vector:

$$knots = [4, 5, 6, 10, 11, 11, 18, 19, 20]$$

This implies that \(p = 3\), \(n = 9\), and \(m = n-p-1 = 9-3-1 = 5\). The domain of \(b\) is \([6, 18]\) so that \(b\) can be evaluated at any knot value \(u\) with \(6 \leq u \leq 18\), for instance, \(6, 6,1316, 11, 17,999999, 18\) and so on. As you may have noticed, the knot value \(11\) occurs twice in \(knots\). Repeating knot values is permitted in principle, but is limited to the degree of a B-Spline (as we will see in the following definition).

Given a B-Spline \(b\) of degree \(p\) with knot vector \(knots\), the multiplicity \(s(u)\) of any \(u \in knots\) is limited by the order (\(p+1\)) of \(b\). That is, \(\forall u \in knots: s(u) \leq p+1\). Furthermore, \(b\) is \(C^{p-s(u)}\) continuous at \(u\) so that increasing \(s(u)\) by \(1\) decreases \(b\)'s continuity at \(u\) by \(1\).

That said, you will notice that B-Splines are discontinuous (\(C^{-1}\)
continuous) at certain points if the corresponding knot values have
multiplicity \(p+1\). Evaluating a B-Spline \(b\) at \(u\) with
\(s(u) = p+1\) almost always returns two points \(q, r\) rather than one,
though \(q\) and \(r\) may be the *same* point. As if all this wasn't
complicated enough, there is a special case in which evaluating \(b\) always
returns a single point regardless of \(b\)'s continuity at this point. It
occurs when the evaluated point is the very first or rather very last point of
a B-Spline (you can think of a B-Spline's *ending* points).

To be continued