How can I calculate the derivative of a Catmull-Rom spline with nonuniform parameterization?

5.7k Views Asked by At

Allow me to preface this by saying I am not a trained mathematician in any sense, so it's entirely possible I'm missing something rather fundamental. That said, I'm trying to take the derivative of a centripetal or chordal Catmull-Rom spline. Using the uniform equation calculating the tangents for the control points as well as the derivative is very simple. But when you want to make a spline with nonuniform $t$ values, you have to go through this:

Catmull-Rom curve formulation

Arrows indicate that you multiply by the coefficient and add to the adjacent to form the next coefficient up in the pyramid. When you get up to $C$ you have your coordinate on the curve. $P$ values are your control points and $t$ values are calculated with the following:

Parameterization

If I'm just plugging values into $t$ then I can get the curve coordinates, but I need the derivative to do some other calculations. I tried to expand the entire thing manually and take the derivative at $t_1$ and $t_2$, but it was a mess, and I think I did it completely wrong, so I ask here. Looking at the answer here, this person claims to have done it and got these very simple formulas, but the only methodology listed is "mathematica."

How can I get a usable, general derivative? Is it necessary to choose an alpha value beforehand, or can it be done easily without choosing a parameterization type?

Images in this question were borrowed from an answer here.

2

There are 2 best solutions below

4
On BEST ANSWER

The linked answer from eriatarka84 essentially gives you the equation of the curve. Then you just have to differentiate this equation to get the first derivative vector as a function of $t$.

His (or her) answer gives you the position $P_1$ and the derivative vector $Q_1=C(t_1)$ at the start of the curve segment. And, similarly, his formulas give you the position $P_2$ and the derivative vector $Q_2=C(t_2)$ at the end of the curve segment. As he points out, these four pieces of data make it easy to construct a fairly simple equation for the segment, which you can then differentiate.

The easiest (and most familiar) approach would be to use the Bézier form of the curve. So, let $$ R_1 = P_1 + \frac13 (t_2 - t_1)Q_1 \quad ; \quad R_2 = P_2 - \frac13 (t_2 - t_1)Q_2 $$

Then the Bézier control points of the segment are $P_1$, $R_1$, $R_2$, $P_2$. Let's introduce a new normalized parameter $u=(t-t_1)/(t_2-t_1)$, so that $u$ ranges over $[0,1]$ as $t$ goes from $t _1$ to $t_2$. Then the equation of the segment is $$ C(u) = (1-u)^3 P_1 + 3t (1-u)^2 R_1 + 3u^2(1-u) R_2 + u^3 P_2 \quad (0 \le u \le 1) $$ If you already have a software function that calculates the derivative at a point on a Bézier curve, you're done. If not, then we have to differentiate this formula to get $C'(u)$. We get $$ \frac{dC}{du}(u) = 3\big( (1-u)^2(R_1 - P_1) +2u (1-u)(R_2 - R_1) + u^2(P_2 - R_2) \big ) $$ Then, finally, by the chain rule for differentiation $$ \frac{dC}{dt}(t) = \frac{1}{t_2-t_1}\frac{dC}{du}(u) $$ If you plug in values for $R_1$ and $R_2$, then you'll get a big mess, but I don't see any point in doing this.

If you really want to simplify the formulae, and you're not adept at algebraic manipulation, you ought to use a computer algebra system. There are some free ones available.

0
On

Denis Kovacs wrote about finding the derivatives here: http://denkovacs.com/2016/02/catmull-rom-spline-derivatives/. He even provides a Matlab code to compute the spline and its derivatives.

Please see his site, here I just quote the solution:

You can use the same pyramid structure to evaluate the tangent C′(t) as well:

\begin{align} A_1' &= \frac{1}{t_1 - t_0}(P_1 - P_0)\\ A_2' &= \frac{1}{t_2 - t_1}(P_2 - P_1)\\ A_3' &= \frac{1}{t_3 - t_2}(P_3 - P_2)\\ \\ B_1' &= \frac{1}{t_2 - t_0}(A_2 - A_1) + \frac{t_2 - t}{t_2 - t_0} A_1' + \frac{t - t_0}{t_2 - t_0} A_2'\\ B_2' &= \frac{1}{t_3 - t_1}(A_3 - A_2) + \frac{t_3 - t}{t_3 - t_1} A_2' + \frac{t - t_1}{t_3 - t_1} A_3'\\ \\ C' &= \frac{1}{t_2 - t_1}(B_2 - B_1) + \frac{t_2 - t}{t_2 - t_1} B_1'(t) + \frac{t - t_1}{t_2 - t_1} B_2'(t) \end{align}

P.S. A and B are the same as your L's were A is the 2nd level and B the 3rd level of the pyramid, see the wiki.