Mathematics Stack Exchange is a question and answer site for people studying math at any level and professionals in related fields. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I'm stuck with developing algorithm to trim b-spline so it begins at certain point without changing it's shape. I'm using these formulas: link. I have already implemented inserting knot at given t. Let me show you example of what I'm trying to do.

Control points of my spline are: ((0, 0), (19, 0), (0, 12), (28, 38), (56, 14), (34, 0), (56, 0))
Knot vector of original spline is: (0, 0, 0, 0, 0,25, 0,5, 0,75, 1, 1, 1, 1)
Degree of spline: 3.

Now I would like add a knot at let's say 0.3 and then cut all that preceeds 0.3 without changing the shape of curve so it starts at inserted point.

share|cite|improve this question
You're supposed to be able to use the Cox-de Boor recursion for something like this (analogous to the use of the de Casteljau recursion to cut off Bézier curves). – J. M. Jul 17 '12 at 12:21

Suppose your spline curve is $C(t)$, and let $m$ denote its degree. You need to insert the knot $t = 0.3$ repeatedly until its multiplicity is $m$. So, in your example, this will give you a new curve whose knot sequence is $(0,0,0,0,0.25,0.3,0.3,0.3, 0.5, 0.75, 1,1,1,1)$. Let $Q_1,Q_2, \ldots, Q_n$ be the control points of this curve, in your example, $n$ will be equal to 10.

The point $C(0.3)$ will be a control point of the new refined curve; call it $Q_r$. This control point divides the list of control points into two halves. The first half of the curve will be defined by the control points $Q_1,Q_2, \ldots, Q_r$ and the second half will be defined by the control points $Q_r, \ldots, Q_n$. The first half will have knots $(0,0,0,0,0.25,0.3,0.3,0.3, 0.3)$, and the second half will have knots $(0.3, 0.3, 0.3, 0,3, 0.5, 0.75, 1,1,1,1)$. If you want to, you can normalise each of these knot sequences to the range $[0,1]$. For example, normalising the first half would give (0,0,0,0, 2.5/3, 1,1,1,1).

share|cite|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.