Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Angle that a moving ball will bounce off of an inert ball

Let there be two balls, one of which is moving about in the Cartesian coordinate plane, while the other is stationary and immobile. At some point, the moving ball collides with the inert ball. Assuming the moving ball is traveling in a straight line, how can one derive the new angle that the moving ball will be propelled given the following information:

The moving ball's center coordinates (X0, Y0), radius (R0), and angle of travel before impact (A0)

The stationary ball's center coordinates (X1, Y1) and radius (R1)

like image 571
farm ostrich Avatar asked Nov 29 '22 17:11

farm ostrich


2 Answers

If your second ball has infinite mass:

enter image description here

Where phi (after a long calc) is:

phi=  -ArcTan[
         ( 2 R^2 Sin[A0] + 2 (YD Cos[A0] - XD Sin[A0]) (2 H Cos[A0] + 
           2 XD Sin[A0]^2 - YD Sin[2 A0]))  /
         ((2 R^2 - XD^2 - 3 YD^2) Cos[A0] + (XD^2 - YD^2) Cos[3 A0] + 
           8 XD YD Cos[A0]^2 Sin[A0] + 4 H Sin[A0] (-YD Cos[A0] + XD Sin[A0]))
           ]

Where:

H   = (R0 + R1)^2 - ((Y0 - Y1) Cos[A0] + (X0 - X1) Sin[A0])^2  
R^2 = (R0 + R1)^2
XD  =  X1 - X0
YD  =  Y1 - Y0

Edit

To determine the whole trajectory, you'll also need the coordinates for the center of the moving ball at the time of impact. They are:

  {X,Y}= {X1+Sin[A0] ((Y1-Y0) Cos[A0]+ (X0-X1) Sin[A0])-Cos[A0] Sqrt[H],
          Y1+Cos[A0] ((Y0-Y1) Cos[A0]+(-X0+X1) Sin[A0])-Sin[A0] Sqrt[H]}
like image 64
Dr. belisarius Avatar answered Dec 05 '22 01:12

Dr. belisarius


Page 3 of Pool Hall Lessons by Joe van den Heuvel, Miles Jackson gives a great example of how to do this.

// First, find the normalized vector n from the center of circle1 to the center of circle2
Vector n = circle1.center - circle2.center;
n.normalize();
// Find the length of the component of each of the movement vectors along n. 
float a1 = v1.dot(n);
float a2 = v2.dot(n);

float optimizedP = (2.0 * (a1 - a2)) / (circle1.mass + circle2.mass);

// Calculate v1', the new movement vector of circle1
// v1 = v1 - optimizedP * m2 * n
Vector v1 = v1 - optimizedP * circle2.mass * n;

// Calculate v2', the new movement vector of circle2
// v2 = v2 + optimizedP * m1 * n
Vector v2 = v2 + optimizedP * circle1.mass * n;

circle1.setMovementVector(v1);
circle2.setMovementVector(v2);

Read at least page three to understand whats going on here.

like image 33
Adam Harte Avatar answered Dec 05 '22 01:12

Adam Harte