I have a very peculiar problem. Assuming that you know how B-Splines or Bézier Curves work, you may also know that if we assume the result of the function, let's say tri-dimmensional, as a position in 3D space, and the parameter as time, we can use it to "plot" the variation of a point in space through time. (Did I make myself clear?) Although these functions are primarily used in computer graphics nowadays, I'm interested in using them to create trajectories. (They are so smooth...) Anyway, there is a serious problem. Even predetermining the required time to achieve a specific mean velocity, I can not do much more. There is no more room for control. The big question is: Can I create a function (let's say a Bézier curve, to make it simple and smooth), only "take its shape", and somehow create another function for the parameter (in my case would be the time) so I can, maintaining the shape of the function and changing the parameter variation form linear to something else I want, so it produces the velocity profile I need. I know its almost to much to ask. I've read something about arc length reparameterization, but still I have no idea if that even has something to do with it. Another idea I had, was to interpolate the time function changing it from linear to something else, so that the final velocity profile is close to the one I need. Is that doable? Can a normal computer handle such optimization? This is for PhD thesis in Aeronautical Engineering, hence my lack of proper mathematical knowledge... Just give me some pointers, ideas, something, so I can start learning


Yes, what you want to do is possible, within certain limits. Suppose we denote the Bezier curve by the function $u \mapsto \mathbf{C}(u)$. So, given a parameter value $u$, we can calculate a 3D point $\mathbf{C}(u)$ on the curve. Assume, as usual, that $u$ ranges over the interval $[0,1]$ while traversing the curve.

Now you want to change the "timing" of the point's travel along the curve. In other words, at any given time $t$, you want to have some corresponding parameter value $u = \alpha(t)$, and then the point will be at $\mathbf{F}(t) = \mathbf{C}(u) = \mathbf{C}(\alpha(t))$. This is just a technique that mathematicians call "composition of functions" -- the new function $\mathbf{F}$ is the composition of $\mathbf{C}$ and $\alpha$.

You can do whatever you want by fabricating suitable functions $\alpha$. For example, if $\alpha(t) = \sin(t)$, the point will oscillate back and forth along the curve forever. If you want the point to always be traveling "forward", without reversing direction, you just have to make sure that your function $\alpha$ is increasing. For example, if you use $\alpha(t) = t^2$, then the point will always move forwards, but it will move faster towards the end of the curve. In general, $\tfrac{d\mathbf{F}}{dt} = \left( \tfrac{d\mathbf{C}}{du} \right) \left( \tfrac{d\alpha}{dt} \right)$, of course.

One approach is to use a polynomial for your $\alpha$ function. You can use standard techniques to fit a polynomial function to your desired velocity profile. If your original curve $\mathbf{C}$ is a Bezier curve of degree $m$, and $\alpha$ is a polynomial of degree $n$, then the composition function $\mathbf{F}$ will be a Bezier curve of degree $m \times n$. The difference of degrees might seem strange, given that $\mathbf{F}$ and $\mathbf{C}$ have the same shape, but it's true, nonetheless. The increased degree gives you the freedom you need to control the moving point's speed. You could also use a rational function for your $\alpha$. This gives you more freedom, but will result in a rational Bezier curve (rather than a polynomial one).

See Theorem 3.1 in this paper. It's much more general than you need, though. There are simpler ways to achieve similar results.

  • $\begingroup$ Thanks! I'm going to try it. It may be possible after all...! :) $\endgroup$ – TAG Mar 10 '14 at 22:14

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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