# FreeBSD Manual Pages

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

NAME
exspline	- Constructing smooth movement paths from spline curves. Alle-
gro 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 con-
structing 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 val-
ues 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  de-
cent  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  tan-
gent 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.

ror(3), allegro_init(3),	 allegro_message(3),  calc_spline(3),  circle-
fill(3),	 clear_keybuf(3),  clear_to_color(3), desktop_palette(3), fix-
atan2(3),  fixcos(3),  fixed(3),	 fixmul(3),   fixsin(3),   fixsqrt(3),
fixtof(3),  fixtoi(3),  font(3),	 ftofix(3),  install_keyboard(3),  in-
stall_mouse(3),	install_timer(3),  itofix(3),  key(3),	keypressed(3),
line(3),	  makecol(3),	mouse_b(3),   mouse_x(3),   mouse_y(3),	  pal-