# A = old position, c = center of ball, v = current moving vector def reflection_vector(ax,ay,cx,cy,xv,yv) # Bouncing of resulting point: R rx = ax + xv ry = ay + yv ux = rx - cx uy = ry - cy r = (-ux*cx + ux*ax -uy*cy + uy*ay).to_f / ( ux * ux + uy * uy).to_f fx = cx + r * ux fy = cy + r * uy afx = fx - ax afy = fy - ay gx = ax + 2 * afx gy = ay + 2 * afy rgx = gx - rx rgy = gy - ry return rgx,rgy end # x,y further away than r allows? def bouncing?(x,y,cx,cy,r) # d(cx,cy,x,y) > r? d = Math.sqrt((x - cx)*(x-cx) + ( y - cy)*( y - cy)) d > r end # if the speed vector is higher than the radius, we are done (2x radius would be still okay actually) def too_fast?(vx,vy,r) d = Math.sqrt(vx*vx+vy*vy) d > r end