Finding Collision Angles in Pool Ball Refraction

  • Thread starter Thread starter Kristy234
  • Start date Start date
  • Tags Tags
    Balls Refraction
AI Thread Summary
The discussion centers on solving collision detection and response in a pool/snooker game being developed using Visual Basic 6. The main challenge is calculating the correct angle for a moving ball when it collides with another ball, particularly when the collision is not head-on. The initial approach involves determining the angle of impact based on the tangent line between the centers of the two balls. Participants clarify that when one ball hits another, it should transfer some energy, allowing both balls to move post-collision, rather than one stopping completely. A proposed solution involves drawing a perpendicular line between the centers of the balls to determine the bounce angle. The developer shares their code for collision detection, which checks if two balls intersect and attempts to calculate the new trajectory for the balls post-collision using trigonometric functions. The discussion also references external resources for further understanding of collision physics.
Kristy234
Messages
10
Reaction score
0
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 that's 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 that's any help)
Thankyou
 
Technology news on Phys.org
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.
 
mgb_phys said:
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.

With your logic, only one ball would be moving on the table at anyone 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 transferred into the other ball but some also remains.
 
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.
 
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.
 
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:
http://www.cc.uoa.gr/~ctrikali/aplets_web/fysiki_i/collisions.pdf" contains the trig you need to solve this.
 
Last edited by a moderator:
Thanks, that really helped :)
 
Back
Top