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

OK, so I got my ships moving along the bezier in time T, now I need to factor in acceleration, but I don't really know how to do it.

I'm using the DeCasteljau Algorithm, that's what my code looks like:

function linp(d, a, b, t) {
    d.x = a.x + (b.x - a.x) * t;
    d.y = a.y + (b.y - a.y) * t;

// a, b, c, d are the 4 controls points, dest will contain the x/y coordinates and t is the time value from 0.0 to 1.0
Ship.prototype.bezier = function(dest, a, b, c, d, delta) {
    var ab = {x:0, y: 0}, bc = {x:0, y: 0}, cd = {x:0, y: 0};
    var abbc = {x:0, y: 0}, bccd = {x:0, y: 0};
    linp(ab, a, b, t);
    linp(bc, b, c, t);
    linp(cd, c, d, t);
    linp(abbc, ab, bc, t);
    linp(bccd, bc, cd, t);
    linp(dest, abbc, bccd, t);

So the question is, what is a simple way to factor in the acceleration from the starting speed to the end speed?

Here's a small video how the thing looks when it's not working. I hope this helps.

share|cite|improve this question
Could you please clarify what exactly do you mean by "factoring in the acceleration"? The expression for curvature (and thus acceleration) will depend on what parametrization you're using. – J. M. Nov 5 '10 at 11:58
The object starts to move along the bezier with speed X and then accelerates until it reaches speed Y at the end. Right now the object moves along the path with constant speed based on time T. I hope that's a bit more clear. – Ivo Wetzel Nov 5 '10 at 12:05
What sort of acceleration are you expecting? Replacing the parameter t with any smooth function like $t^{\alpha}$ (I'm assuming here that $0\leq t\leq 1$ as is usual with such applications) should allow you to vary the acceleration as you please. – J. M. Nov 5 '10 at 12:09
Linear acceleration would be just fine, I gonna look up smooth functions, and yes I admit, I'm not that big into maths, so sorry if the question maybe really simple. – Ivo Wetzel Nov 5 '10 at 12:13
OK so I looked up smooth functions but I can't find one that behaves like I want, the object has a long movement pause at the beginning and the end when I use something like: x * x * (3 - 2 * x) – Ivo Wetzel Nov 5 '10 at 13:04

OK, got it figured out my self, before including the acceleration I first had to parameterize the curve itself, you can read all the stuff over at my gamedev question:

share|cite|improve this answer

For each component (x,y)

linp(acc, 6*(a-2*b+c), 6*(b-2*c+d), t)

Obviously linp is the linear interpolation between two values. The bezier is constructed form a sequence of linear inerpolations as shown here. Bezier Definition

The linp module can be made into a well defined function $\mathrm{L}(a,b,t)=a+t\,(b-a)$, with known derivatives. All you have to do is calculate the following

$$ \mathrm{bez}(a,b,c,d,t)=\mathrm{L}( \mathrm{L}( \mathrm{L}(a,b,t), \mathrm{L}(b,c,t), t), \mathrm{L}( \mathrm{L}(b,c,t), \mathrm{L}(c,d,t), t) ) $$ $$ \mathrm{acc}(a,b,c,d,t)=\frac{\mathrm{d}^2}{\mathrm{d}t^2}{\mathrm{bez}(a,b,c,d,t)} $$

With the derivative

$$ \frac{\mathrm{d}}{\mathrm{d}t}{L(f(t),g(t),t) = (1-t)\frac{\mathrm{d}f}{\mathrm{d}t}+t\frac{\mathrm{d}g}{\mathrm{d}t}-f(t)+g(t)} $$

The rest is just math.

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.