OxfordCroquet Logo

Dr Ian Plummer

Donation Button

Modelling Roquets

I wanted the equations of motion of a croquet balls so that I could model them on a virtual croquet lawn. The basic equations of motion relating initial velocity, distance and time, given Plummers for a lawn, were given here.

The main results linking the initial velocity of a ball, u, the time, t, and distance travelled, s, and the friction (deceleration), a, against the grass were:

u  =-a. √-2.sfinal / a(1)

s =-a. √-2.sfinal / a.t + ½.a.t2(2)

tfinal = √-2.sfinal / a(3)

Cut rush
Figure 1. Aiming at a phantom ball whose centre and that of the roquetted ball lie on the rush line.

Where sfinal is the total distance travelled.

The aim is to get a realistic cut rush-type action. For the person doing the modelling they will know the initial positions of the striker's ball, SB, and the roquetted ball, RB. They also know the desired final position of the roquetted ball. The balls are assumed to be elastic hard spheres.

The position of the striker's ball when it first makes contact against the target ball can be calculated since we know that, on contact with the roquetted ball, the centres of the striker's ball and roquetted ball lie along the rush line (Figure 1.)

Figure 2 below shows this in more detail.

Striker's ball contacting roquetted ball
Figure 2. Detail of the balls on collision.

The angle θ is derived from the start and final positions, RB(x1,y1) and RB(x2,y2), of the roquetted ball. Simple trigonometry gives values for Δx and Δy from the centre of the roquetted ball:

Tan(θ) = (RBy2 - RBy1) / (RBx2 - RBx1)(4a)

Δx = 2r.Cos(θ) (4b)

Δy = 2r.Sin(θ)(4c)

It can also be done by equivalent triangles:

-2r / sRB = Δx / (RBx2 - RBx1) = Δy / (RBy2 - RBy1)(5a)


sRB = √(RBx2 - RBx1)2 + (RBy2 - RBy1)2(5b)

From the diagram:

SB(x1,y1) = RB(x1 - Δx, y1 - Δy)(6)

We now know the location SB(x1,y1) through which the striker's ball must pass to rush the roquetted ball at angle θ.

Providing the striker's ball approaches anywhere less than perpendicular to the rush line (and from the right side!) and passes through SB(x1,y1) then the roquetted ball will move down the rush line.

From the above we know the line along which to launch the striker's ball. We still have to find the energy (via the initial velocity, uS) to put into the striker's ball so that when it hits the roquetted ball the roquetted ball is driven the correct distance. Also we would like to calculate the scatter angle and striker's ball's subsequent velocity.

Just to confirm the notation, the striker's ball is 'struck' from its starting position, SB(x0,y0), through SB(x1,y1), collides with the roquetted ball at RB(x1,y1) and then the roquetted ball moves away along the rush line to RB(x2,y2). The striker's ball scatters off to SB(x2,y2).

Vector diagram of a roquet

Figure 3. The blue striker's ball is travelling at velocity vS and angle Φ. It hits the red roquetted ball and drives it at velocity vR at angle θ. After the collision the striker's ball is indicated leaving at velocity v'S.

As we now know SB(x1,y1) and SB(x0,y0), we can calculate the distance the striker's ball travels to the collision point using Pythagoras.

scol = √(SBx1 - SBx0)2 + (SBy1 - SBy0)2(7)

Hence to start the animation the striker's ball is launched through the collision position to a virtual end position sfinal. However when it has travelled scol we start the roquetted ball moving to its new rest position. After the collision the sfinal is no longer appropriate since the striker's ball has lost energy in the collision and hence will travel a shorter distance, s' (s-primed), in a new direction.

Figure 3 indicates velocity vectors not distances, at the instant of the roquet (not to scale).

We can use the conservation of momentum here to form some equations. Momentum, p, is given by:

p = m.v(8)

At this stage we will assume that we have an instantaneous elastic collision. The total momentum therefore is conserved. The instant before collision the striker's ball has momentum:

p = m.vS(9)

The 'roquetted' ball has zero momentum at this time. The instant after collision the momentum is partitioned between the roquetted ball and the recoiling striker's ball.

p = m.vS = m.vR + m.v'S(10)

where vS is the velocity of the striker's ball before collision, v'S its velocity after collision (not to scale in the diagram) and vR, the velocity of the roquetted ball after collision. All the ball masses, m, are the same so we can extract them.

The angle between the balls after a collision is 90'. This arises from the conservation of kinetic energy, EK= ½mv2, as well as momentum, i.e.

vS = v'S+ vR = p / m(11a)

vS2 = v'S2+ vR2 = 2.EK / m(11b)

Note (11a) is a vector addition; (11b) is scalar addition.

From (11a) and (11b) the vector triangle must be right angled; the triangle which satisfies a2 + b2 = c2 is right angled (Pythagoras).

We now have most of the pieces to work out the problem.

Conservation of momentum - vector triangle
Figure 4. Velocity vectors before and after collision.
  1. From (4a) we have the angle, θ, that the roquetted ball follows relative to the x-axis.

  2. From (5b) we know the distance, sRB, that the roquetted ball travels.

  3. We can use sRB in (1) to find the roquetted ball's initial velocity vR.

  4. The striker's ball will travel from a known starting position SB(x0,y0) to the calculated position SB(x1,y1) where it makes contact with the roquetted ball.

    From (6) we calculate the position of SB(x1,y1).

  5. From (7) we can calculate scol, the distance between SB(x1,y1) and SB(x0,y0).

    When the striker's ball hits the roquetted ball it must have the correct energy, given the angles, to punch the roquetted ball to its destination. Figure 4 may help visualise the constraints. It is the top part of the Figure 3 rotated so that the roquetted ball moves to the right. It shows a selection of angles and vectors of vS which have the component vR.

    We know that the roquetted ball requires a set velocity vR (red vector). Further we know that after the roquet the striker's ball must move at right angles to the roquetted ball (green vectors). The initial momentum, proportional to vS, must be conserved, hence the resultant of vR and v'S must equal vS. Three example solutions of v'S and impact angle for different vS yielding a constant vR are drawn. Although not drawn, a straight roquet is represented by a ball launched horizontally with vS = vR.

  6. Calculate the angle, Φ, that the striker's ball is travelling at with respect to the normal coordinate frame. Figure 5 shows the geometry.

    Tan(Φ) = (SBy1 - SBy0) / (SBx1 - SBx0(12))

    where SB(x1,y1) is the calculated position of the striker's ball on contact, and SB(x0,y0) is the launch position.

    We can now calculate Ω, the angle between the roquetted ball and the scattered striker's ball.

    Ω = Φ - θ(13)

  7. Calculate the velocity of the striker's ball after collision. From Figure 5 again:

    Vector angles
    Figure 5. Showing the angle of the striker's ball after collision.

    v'S = vR.Sin(Ω) (14)

  8. A little more work to do now before we can obtain the coordinates of where the striker's ball comes to rest. Whilst we know its velocity immediately after collision, we need to know the distance it will travel, s'final. Rearranging (1), we get:

    s'final = -½.v'S2 / a(15)

    The angle that the striker's balls travels is (90 - θ), see Figure 5. We can now use s'final and (90 - θ) to get the distances it travels in the x and y axes:

    Δx' = -s'final.Cos(90 - θ) = -s'final.Sin(θ)(16a)

    Δy' = s'final.Sin(90 - θ) = s'final.Cos(θ)(16b)

    using the standard identities Sin(90 - θ) = Cos(θ), etc.

    We can now produce the final position of the striker's ball SB(x2,y2):

    SB(x2,y2) = SB(x1 + Δx', y1 + Δy')(17)

See Appendix 1 for notes on getting the correct angle for the departing striker's ball after the roquet.

Where are we now?

  • We know the start and end positions, RB(x1,y1) and RB(x2,y2), of the roquetted ball and consequentially its initial velocity, vR.
  • We know the collision position of the striker's ball SB(x1,y1), its final position SB(x2,y2) and its velocity immediately after collision, v'S.


  1. We can now calculate the velocity vS, the punch which the striker's ball needs at the time of collision. Referring to Figure 4 we can use trigonometry to find vS:

    vS = vR / Cos(Ω) (18)

  2. If the striker's ball was initially almost touching the roquetted ball, then it would need to start travelling at a very tiny bit more than vS. If it was a great distance away from the roquetted ball, it would have to be hit very hard as it would lose velocity (due to friction against the grass) as it travelled towards the collision point. We know the velocity, vS, and the distance it has travelled, scol, to get to the collision point and can work back to derive uS, the starting velocity of the striker's ball.

    Here we use one of Newton's equations:

    vS = uS + a.tcol(19)

    rearranging to give the time of the collision:

    tcol = (vS - uS ) / a(20)

    The second Newton's equation (derived from the first by integration) is

    scol =uS.tcol + ½.a.tcol2(21)

    Rearranging for uS:

    uS= (-a.tcol2 + 2.scol) / (2.tcol)(22)

    Substituting in (20) for tcol and rearranging in terms of uS yields:

    uS = ± √-2.a.scol + vS2(23)

    At last we have uS in terms of values we already know.

  3. Finally we need to derive a virtual aiming point for the striker's ball. This is the point at which the striker's ball would stop if correctly aimed for the roquet with the correct starting velocity, but in the absence of the roquetted ball. Equation (1) links uS, sfinal and a

    sfinal = -uS2 / 2.a(24)

    We know the launch angle θ, distance sfinal and the starting position SB(x0,y0), hence the coordinates where the ball would come to rest in the absence of the collision, SB(x", y") are:

    SBx" = SBx0 + sfinal.Cos(Φ)(25a)

    SBy" = SBy0 + sfinal.Sin(Φ)(25b)

Appendix 1

arctan function from Wolfram.comUsing the standard JavaScript Math.sin, Math.cos and Math.atan functions gives some programming headaches.

The atan function returns values only between ±π/2 hence further logic is required to work out whether the returned angle is α or (α±π).

When modelling the roquet, sin and cos are used to calculate the launch angle, Φ, of the striker's ball and the exit angle, θ, of the roquetted ball, equation (13). The signs of Δx' and Δy' need to be correctly set in equations (16a)(16b) to get the striker's ball to kick off in the correct direction after the collision.

If you consider a roquet without reference to any axes some rules can be defined.
The following diagram may assist.

Angles in a roquetA representative track of the striker's ball, SB, is shown approaching from the left. Given that you cannot produce a cut-rush of more than 90º, the yellow sector shows allowed approach directions of the striker's ball towards the roquetted ball, RB. The angle Ω, as calculated in in (13) is the 'approach direction' of the striker's ball. When Ω is zero we get a straight rush and when it is ±90º, the roquetted ball is barely moved.

Clearly if the striker's ball approaches in the left half of the yellow semi-circle, the striker's ball kick off to the right and vice versa.

To get the correct angle of exit of the striker's ball I used a decision tree based on my sign conventions similar to:

if ((omega > 0) && (omega <= (pi/2))) {
    SBx2 = SBx1 - delta_x;
    SBy2 = SBy1 - delta_y;
if ((omega > (pi/2)) && (omega <= (pi))) {
    SBx2 = sbx1 - delta_x;
    SBy2 = sby1 + delta_y;


* Elastic collisions and snooker

All rights reserved © 2014-2018

Updated 28.i.16
About, Feedback
on www.oxfordcroquet.com
Hits: 2335