解决圆之间的2D弹性碰撞的简单方法

时间:2019-02-01 16:05:59

标签: java 2d android-canvas collision resolve

我需要最简单的解决方案来解决圆之间的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 :(得分:1)

如果您知道两个质量的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);