public void step() {
        double x0 = x, y0 = y, t0 = t;
        x += v * Math.cos(t) * dt;
        y += - v * Math.sin(t) * dt;
        t += vt * dt;
        while (t < - Math.PI)
            t += 2 * Math.PI;
        while (t >= Math.PI)
            t -= 2 * Math.PI;
        if (playfield.collision(this, true)) {
            x = x0; y = y0; t = t0;
            return;
        }
        v += a * dt;
        double drag = r * r * CDRAG;
        if (drag >= 0.95) {
            System.err.println("internal error: CDRAG too big");
            System.exit(1);
        }
        v -= v * drag;
    }