Billiard simulation - part 1: model and animation
April 28, 2013 at 6:25 PM
—
Michele Mottini
The simulation model is pretty straightforward: the table is just a rectangle, represented by the coordinates of its top left corner and its width and height; the balls are spheres, represented by the position of their center \(\vec p_k=(x_k, y_k)\), their velocity \(\vec v_k=(v_k, w_k)\) and their radius \(r_k\) – where \(k\) is the index identifying the ball.

I kept the radius as a property of each ball instead than a global parameter, to be able to model balls of different size.
This is just the geometrical part of the model; I’ll introduce additional parameters for the physics part (mass, friction, restitution) as I develop the physics model.
The animation logic is simple as well: the screen needs to be updated with a certain frequency – let’s say 30 times a second to provide a smooth display. To do this a timer calls an update function every \(\Delta t = 1/30\) seconds, and this function computes the new positions of all the balls and then re-draws everything.
The update function has to compute the change of the balls positions in the \(\Delta t\) seconds elapsed since the last update. For a ball moving freely this change is simply its velocity times \(\Delta t\). The balls do not move freely though: they can hit other balls or the sides of the table, and every time there is a collision the velocity of the colliding balls(s) changes. The complete update algorithm then is:
- Compute the time \(t_{min}\) of the first collision(s)
- If \(t_{min}\) is equal or greater than \(\Delta t\) then move all the balls freely for \(\Delta t\) seconds and we are done (no collisions to consider)
- Otherwise: move all the balls freely for \(t_{min}\) seconds
- Compute the new velocities of all the balls that collide
- Repeat from (1), reducing \(\Delta t \) to \(\Delta t – t_{min}\)
Next time: detecting collisions.