# Refraction of pool balls ?

1. Nov 23, 2007

### Kristy234

Hi, I'm currently working on a game of pool/snooker. Its all going great, but i have this problem when the balls hit each other. I can get them to bounce off the walls correctly, but thats because the walls are either vertical or horizontal...hitting a ball is more difficult.
At the moment, when a collision is detected, i need to find the angle that it hits against the tangent of two balls. I then need to alter this angle so that the output angle is the same as the input angle. Can anyone help with this? (I'm using Visual basic 6 if thats any help)
Thankyou

2. Nov 23, 2007

### mgb_phys

Do you mean hitting another stationary ball?
Then it shouldn't bounce off - the other ball should continue in a straight line in the direction the first one was going, the first one should stop at the point of contact.

3. Nov 23, 2007

### Kristy234

With your logic, only one ball would be moving on the table at any one time. The ball would continue in a straight line and the other would stop only if it was hit head on. my main problem is when it kinda clips the ball so that some of the energy is transfered into the other ball but some also remains.

4. Nov 23, 2007

### mgb_phys

Yes, sorry was thinking of another problem I'm working on at the same time!
Draw a line between the centres of the two balls, in the middle of this draw a line at right angles. The ball bounces off this line exactly as it would from a cushion.

5. Nov 23, 2007

### Kristy234

Yes, that is what I'm trying to do, however it is a little difficult as I'm working on coordinates. Each ball has an x and y position and moves a certain x and y every say millisecond. So i need to find the angle that it collides with, and all i have is an (x,y) position of ball1, and an (x,y) position of ball2, as well as the width and height of the ball, and the (x,y) that it moves by.

6. Nov 23, 2007

### Kristy234

So far this is what i have...I've commented it heavily because i don't know if you are familiar with vb6. 'n' represents a ball in an array, it is the ball that is originally moving. 'm' represents each other ball to test for a collision.

For m = 0 To 15 '(m is the variable for the array, so for all balls)
If (ball(m).Left - ball(n).Left) ^ 2 + (ball(m).Top - ball(n).Top) ^ 2 <= (ball(n).Width) ^ 2 And m <> n And (ball(m).Left - ball(n).Left) ^ 2 + (ball(m).Top - ball(n).Top) ^ 2 > 0 Then '(basically, if it has collided)
Dim alpha, beta, gamma As Double '(just some angles to use)
alpha = theta(n) '(theta(n) is the angle that the moving ball is traveling at)
'(then i try to define some angles...its hard to show how i got this without a diagram, but hopefully you will understand it)
If Abs(ball(m).Top - ball(n).Top) <> 0 Then
beta = Atn(Abs(ball(m).Left - ball(n).Left) / Abs(ball(m).Top - ball(n).Top))
Else
beta = 0
End

s(m) = s(n) '(s is just the speed, so transfer all the speed...i do this at the moment just for experimental purposes until i can get the rest of it working)

'(this is my attempt at getting the set correct angle)
theta(m) = 180 + alpha - 2 * beta '(theta(m) is the angle that the hit ball needs to travel at)
Y(m) = Sin(theta(m)) '(the y distance it should move every millisecond)
X(m) = Sin(90 - theta(m)) '(the x distance it should move every millisecond)

End If
Next

It's a bit messy, sorry.

Last edited: Nov 23, 2007
7. Nov 23, 2007

### out of whack

8. Nov 30, 2007

### Kristy234

Thanks, that really helped :)