void Collision_Response(void)
{
for (int ball_a = 0; ball_a < NUM_BALLS; ball_a++)
{
for (int ball_b = ball_a+1; ball_b < NUM_BALLS; ball_b++)
{
if (ball_a == ball_b)
continue;
// compute the normal vector from a->b
float nabx = (balls[ball_b].GetX()-balls[ball_a].GetX());
float naby = (balls[ball_b].GetY()-balls[ball_a].GetY());
float length = sqrt(nabx*nabx + naby*naby);
// is there a collision?
if (length <= 2.0*(BALL_RADIUS*.78))
{
// normalize normal vector
nabx/=length;
naby/=length;
// compute the tangential vector perpendicular to normal,
// simply rotate vector 90
float tabx = -naby;
float taby = nabx;float vait = DOT_PRODUCT(balls[ball_a].GetVelX(),
 balls[ball_a].GetVelY(),
 tabx, taby);
float vain = DOT_PRODUCT(balls[ball_a].GetVelX(),
 balls[ball_a].GetVelY(),
 nabx, naby);
float vbit = DOT_PRODUCT(balls[ball_b].GetVelX(),
 balls[ball_b].GetVelY(),
 tabx, taby);
float vbin = DOT_PRODUCT(balls[ball_b].GetVelX(),
 balls[ball_b].GetVelY(),
 nabx, naby);float ma = 1.0;
float mb = 1.0;
float vafn = (mb*vbin*(1.0+1) + vain*(ma-1.0*mb))/(ma + mb);
float vbfn = (ma*vain*(1.0+1) - vbin*(ma-1.0*mb))/(ma + mb);float vaft = vait;
float vbft = vbit;float xfa = vafn*nabx + vaft*tabx;
float yfa = vafn*naby + vaft*taby;
float xfb = vbfn*nabx + vbft*tabx;
float yfb = vbfn*naby + vbft*taby;balls[ball_a].SetVelX(xfa);
balls[ball_a].SetVelY(yfa);
balls[ball_b].SetVelX(xfb);
balls[ball_b].SetVelY(yfb);
// update position
balls[ball_a].SetX(balls[ball_a].GetX()+xfa);
balls[ball_a].SetY(balls[ball_a].GetY()+yfa);
balls[ball_b].SetX(balls[ball_b].GetX()+xfb);
balls[ball_b].SetY(balls[ball_b].GetY()+yfb);
} 
} 
} 
}