Thanks for the advice on speeding up collision detection. I combine it with calculating the gravitational forces. The below snippet should give some idea: if (dist < r1+r2) { s = 1000*Math.min(100,(1/dist)*(square(((r1+r2 - dist)/(r1+r2))))); collisions.push([objects[i]._id, objects[j]._id]);} else { s = -G * Math.pow(dist,-3);}[source] so there is a repulsive field when two objects get too close together, and that makes them bounce off each other. Calculating dist does require a square root, but both conditions in the if need the square root I suppose. It doesn't use Verlet, just a very standard Runge Kutta. That's fast and seems to get the physics right... at least ellipses close back in on themselves when there are 2 bodies.