Хотел, чтобы объект подпрыгивал внутри круга, в итоге заставляя объект двигаться вдоль края круга

Вот этот код:

public void calculate() {
        // Center of circle is at (250, 250).
        //THIS ALGORITHM IS NOW PROVEN TO BE WORSE THAN I FEARED...

        /*      What it does:
         *          Moves object around in a circle.
         *          Does not move the object towards the center.
         *          Object always stays on the rim of the circle.
         * 
         *      Algorithm I used. (DOES NOT WORK):
         *          N is normalized vector. 
         *          R = -2*(V dot N)*N + V
         */

        vx += Accelero.X * 0.1;
        vy += Accelero.Y * 0.1;
        double nx = x - 250;
        double ny = y - 250;
        double nd = Math.hypot(nx, ny);
        if (nd == 0)
            nd = 1;
        nx /= nd;
        ny /= nd;
        double dotProduct = vx * nx + vy * ny;
        vx += (float) (-2 * dotProduct * nx);
        vy += (float) (-2 * dotProduct * ny);
        x -= vx * 2;
        y -= vy * 2;
        vx *= 0.99;
        vy *= 0.99;
    }

И это то, что происходит.

Picture.

Черная линия, которую вы видите, - это место, куда перемещается фиолетовый объект (коробка). Так уж получилось, что он находится прямо на линии круга, с которой я нарисовалCanvas.drawCircle().

Я не понимаю, почему рефлексия не работает. Если объект должен ударить по круглой стене, не должен ли он отражать направление скорости объекта, каким должен быть алгоритм? Или я использовал неправильный алгоритм?

Любая помощь приветствуется. Заранее спасибо.

Ответы на вопрос(3)

Ваш ответ на вопрос