public void advance(double dt) { for (int i = 0; i < bodies.length; ++i) { NBody iBody = bodies[i]; for (int j = i + 1; j < bodies.length; ++j) { final NBody body = bodies[j]; double dx = iBody.x - body.x; double dy = iBody.y - body.y; double dz = iBody.z - body.z; double dSquared = dx * dx + dy * dy + dz * dz; double distance = Math.sqrt(dSquared); double mag = dt / (dSquared * distance); iBody.vx -= dx * body.mass * mag; iBody.vy -= dy * body.mass * mag; iBody.vz -= dz * body.mass * mag; body.vx += dx * iBody.mass * mag; body.vy += dy * iBody.mass * mag; body.vz += dz * iBody.mass * mag; } } for (NBody body : bodies) { body.x += dt * body.vx; body.y += dt * body.vy; body.z += dt * body.vz; } }