exspline - Constructing smooth movement paths from spline curves. Allegro game
programming library.
#include <allegro.h>
Example exspline
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(3),
SCREEN_W(3),
acquire_screen(3),
alert(3),
allegro_error(3),
allegro_init(3),
allegro_message(3),
calc_spline(3),
circlefill(3),
clear_keybuf(3),
clear_to_color(3),
desktop_palette(3),
fixatan2(3),
fixcos(3),
fixed(3),
fixmul(3),
fixsin(3),
fixsqrt(3),
fixtof(3),
fixtoi(3),
font(3),
ftofix(3),
install_keyboard(3),
install_mouse(3),
install_timer(3),
itofix(3),
key(3),
keypressed(3),
line(3),
makecol(3),
mouse_b(3),
mouse_x(3),
mouse_y(3),
palette_color(3),
poll_mouse(3),
readkey(3),
release_screen(3),
screen(3),
set_gfx_mode(3),
set_palette(3),
show_mouse(3),
spline(3),
textout_centre_ex(3),
textprintf_centre_ex(3),
textprintf_ex(3),
vsync(3),
xor_mode(3)