Реалистичный отскок мяча (вне линии) в координатной сетке


Задача

Итак, я пытаюсь создать программу, которая заставляет мяч отскакивать от линии, вычисляя угол, который мяч сделал бы с линией - если бы это была пересекающаяся линия - и поворачивая эту линию вокруг точки пересечения, чтобы найти новый наклон. У меня есть все алгоритмы и формулы для всего, кроме той части, где я возвращаю наклон к импульсу мяча. Конечным продуктом всех вычислений (которые я убедился, что работают) является наклон линия и точка пересечения, или отскока. Если бы у меня был только наклон, как бы я мог сказать, в каком направлении мяч будет двигаться по наклону после отскока?

Sidenote : Язык, на котором я работаю, - Java 1.8 с некоторой произвольной внешней графической библиотекой, но я не ищу код, чтобы просто подключиться к моему уже существующему коду, я ищу общее представление о том, что, по вашему мнению, я мог бы сделать. Кроме того, критически важным для проблемы является весь проект. на основе координат.

Большое спасибо за любой ввод или возможный ответ, и спросите меня, если вы хотели бы спецификации по проблеме!

1 3

1 ответ:

Www.cwynn.com/bounce это небольшая вещь html5 canvas, которую я сделал несколько лет назад, которая иллюстрирует, как op хотел справиться с "отказом"

У вас есть мяч B, который ударит линию L в точке столкновения C. B->C образует линию. Возьмите точку на этой линии за C и отразите ее через L, чтобы получить точку отражения R. Когда мяч ударяется о C, вы можете удалить его вектор направления и дать ему вектор C - >R. Однако вам нужно сбросить их скорость. Так что берите размер вектор направления, и масштабировать новый вектор направления, чтобы соответствовать.

Edit: решил добавить код (что заставило меня понять, что я забыл масштабировать их скорость)

    //closestCollPt[0] is the line the 'player' will hit next
    var dist = player.position.dist(closestCollPt[0]);

    //the 'player' in my case is a circle, so this indicates collision
    if(dist < player.radius*2)
    {
        //the collision point to the reflection like I mentioned
        //in the text above
        var newDir = closestCollPt[0].vecTo(reflection);

        //I break out their parts, b/c I want to scale the vector
        //doable in one line, but hard to debug
        var newDirX = newDir.x;
        var newDirY = newDir.y;
        var newDirDist = newDir.dist(new Vector(0,0));
        //for whatever reason I was calling the size of a vector
        //'dist' when I wrote this


        var currDirDist = player.direction.dist(new Vector(0,0));

        //give the player the direction we got from Coll->Ref
        //scale it so their speed doesn't change
        player.direction = newDir.scale(currDirDist).scale(1/newDirDist);
    }

Решил добавить изображение...

Единственные "реальные" вещи-это мяч и коричневая линия

"шарик" розовый, направляясь к точке контакта в центре на пути луча,

Проекция-это отражение шара через точку контакта, а отражение-это отражение точки проекции через точку контакта. линия.

Как только шар соприкоснется с коричневой линией, его вектор направления должен измениться с "пути" на "новый путь" (линия, которая находится на контакте и отражении)

Введите описание изображения здесь