# exspline

```exspline(3alleg4)                Allegro manual                exspline(3alleg4)

NAME
exspline - Constructing smooth movement paths from spline curves. Allegro
game programming library.

SYNOPSIS
#include <allegro.h>

Example exspline

DESCRIPTION
This program demonstrates the use of spline curves to create smooth paths
connecting a number of node points. This can be useful for constructing
realistic motion and animations.

The technique is to connect the series of guide points p1..p(n) with
spline curves from p1-p2, p2-p3, etc. Each spline must pass though both
of its guide points, so they must be used as the first and fourth of the
spline control points. The fun bit is coming up with sensible values for
the second and third spline control points, such that the spline segments
will have equal gradients where they meet. I came up with the following
solution:

For each guide point p(n), calculate the desired tangent to the curve at
that point. I took this to be the vector p(n-1) -> p(n+1), which can
easily be calculated with the inverse tangent function, and gives decent
looking results. One implication of this is that two dummy guide points
are needed at each end of the curve, which are used in the tangent
calculations but not connected to the set of splines.

Having got these tangents, it becomes fairly easy to calculate the spline
control points. For a spline between guide points p(a) and p(b), the
second control point should lie along the positive tangent from p(a), and
the third control point should lie along the negative tangent from p(b).
How far they are placed along these tangents controls the shape of the
curve: I found that applying a 'curviness' scaling factor to the distance
between p(a) and p(b) works well.

One thing to note about splines is that the generated points are not all
equidistant. Instead they tend to bunch up nearer to the ends of the
spline, which means you will need to apply some fudges to get an object
to move at a constant speed. On the other hand, in situations where the
curve has a noticeable change of direction at each guide point, the
effect can be quite nice because it makes the object slow down for the
curve.

END_OF_MAIN(3alleg4), SCREEN_W(3alleg4), acquire_screen(3alleg4),
allegro_message(3alleg4), calc_spline(3alleg4), circlefill(3alleg4),
clear_keybuf(3alleg4), clear_to_color(3alleg4), desktop_palette(3alleg4),
fixatan2(3alleg4), fixcos(3alleg4), fixed(3alleg4), fixmul(3alleg4),
fixsin(3alleg4), fixsqrt(3alleg4), fixtof(3alleg4), fixtoi(3alleg4),
font(3alleg4), ftofix(3alleg4), install_keyboard(3alleg4),
install_mouse(3alleg4), install_timer(3alleg4), itofix(3alleg4),
key(3alleg4), keypressed(3alleg4), line(3alleg4), makecol(3alleg4),
mouse_b(3alleg4), mouse_x(3alleg4), mouse_y(3alleg4),