Простой способ разрешить 2D упругое столкновение между кругами - PullRequest
0 голосов
/ 01 февраля 2019

Мне нужно самое простое решение для разрешения 2D упругого столкновения между кругами, каждый круг имеет равную массу с остальными.

Среда - это холст Android, в котором ось Y растет вниз.Логическим представлением круга является класс PlayerBall , который успешно обнаружил столкновение.В PlayerBall есть поля:

x и y положение центра круга

velX и velY вектор скорости движения круга представлен двумя скалярными значениями, которые могут быть положительными или отрицательными.

диаметр - диаметр круга

public static void resolveCollision(PlayerBall ballOne, PlayerBall ballTwo) 
{
    double collisionAngle = Math.atan2(ballTwo.y - ballOne.y, ballTwo.x - ballOne.x); // angle for ball one
    // calculating new velocities between ballOne and ballTwo
    ...
    // setting the new velocities for both balls
    ballOne.setVelocity((float)ballOneVelX, (float)ballOneVelY);
    ballTwo.setVelocity((float)ballTwoVelX, (float)ballwTwoVelY);

}

Я ожидаючто скорости шариков меняются по формуле, определенной в этой статье https://en.wikipedia.org/wiki/Elastic_collision#Two-dimensional_collision_with_two_moving_objects

1 Ответ

0 голосов
/ 01 февраля 2019

Если вы знаете скорость x и y обеих масс, вам не нужен угол столкновения.Результирующие силы x и y на шарах могут быть рассчитаны как произведение их соответствующих масс и скоростей.

Вы можете определить это соотношение по формуле:

V_xr1 = (V_x1 * (m1 - m2) + (2 * m2 * V_x2)) / (m1 + m1)

Где V_x1 представляет скорость чисто в плоскости x, m1 и m2 - массы шаров.Это даст вам результирующую скорость x.Вы можете применить ту же логику для вычисления результирующих сил в направлении y.

let newVelX1 = (vel1.vX * (m1 - m2) + (2 * m2 * vel2.vX)) / (m1 + m2);
let newVelY1 = (vel1.vY * (m1 - m2) + (2 * m2 * vel2.vY)) / (m1 + m2);
...