2d elastic collision response
(it's finally working! I can't believe it.)