views:

130

answers:

2

Im trying to make what is (essentially) a simple pool game, and would like to be able to predict where a shot will go once it hits another ball.

The first part is, I believe, to calculate if the cueball will hit anything, and if it does, where it collides. I can work out collision points for a line and a ball, but not 2 balls.

So given the x/y positions and velocities of 2 balls, how do I calculate the point at which they collide?

Many thanks.

(PS: Im aware I can do this by calculating the distance between the two balls every step along the way, but I was hoping for something a little more elegant and optimal.)

Example of setup: trying to calcuate the red dot

http://dl.dropbox.com/u/6202117/circle.PNG

+10  A: 

Some things to take note of:

  • When two balls, each of radius r collide their centers are 2r apart.
  • Your first ball can be assumed to travel in a straight line (well, first approximation, but start with this), and you can find the angle, alpha between this path and the direction from the first ball to the second.
  • You know the center of the stationary ball, no?

Now you have some geometry to do.

Do this construction:

  1. Mark the current center of the first (moving) ball as point A.
  2. Mark the center of the stationary ball as point B.
  3. Construct line segment AB.
  4. Construct the ray, R, from A in the direction of movement.
  5. Construct a circle of radius 2r around B.
  6. Drop a segment from B perpendicular to R call the point of intersection C.
  7. You know the distance AB and you can find the angle alpha between AB and R, with the Law of Sines find the length of BC.
  8. From that length determine if there are 0, 1 or 2 solutions. If there are 0 or 1 you are done.
  9. Construct point D where the circle meets R closer to A, and use the Law of Sines again to find the distance AD.
  10. The point of collision is the midpoint of BD

and now you know everything.

Constructing efficient code from this is left as an exercise.


BTW-- This construction won't work if both balls are moving, but you can transform into a frame where one is stationary, solve it that way, then transform back. Just be sure to check that the solution is in the allowed area after the reverse transformation...

/ Physicists can't not make comments like this. I tried to resist. I really did.

dmckee
Gah, Im an idiot. Ive had several people explain this to me previously, its only now that I get it. For some reason I was convinced doing 2r would cause collisions to be wonky.Appreciate the help, I should be able to work this out from here.
After you've done this kind of thing a few times you'll reach for a pad or a whiteboard automatically. That's point at which you're are forever lost to the world of men...
dmckee
Is it bad that this answer made me feel like I was in high school geometry again... and kind of liked it?
userx
+1 - Nicely written.
duffymo
Just checked your profile, dmckee. Neutrinos - nice work. Sounds like it's starting pay off after many years. I really liked this answer and look forward to more from you.
duffymo
+8  A: 

Drawing of @dmckee's answer

alt text

belisarius