## Billiard simulation - part 1: model and animation

April 28, 2013 at 6:25 PM

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:

1. Compute the time $$t_{min}$$ of the first collision(s)
2. 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)
3. Otherwise: move all the balls freely for $$t_{min}$$ seconds
4. Compute the new velocities of all the balls that collide
5. Repeat from (1), reducing $$\Delta t$$ to  $$\Delta t – t_{min}$$

Next time: detecting collisions.

Posted in: Programming

Tags: , ,