首页 > 解决方案 > 解决圆之间二维弹性碰撞的简单方法

问题描述

我需要最简单的解决方案来解决圆之间的 2D 弹性碰撞,每个圆与其他圆具有相同的质量。

环境是 Y 轴向下增长的 Android 画布。圆的逻辑表示是具有成功碰撞检测的PlayerBall类。PlayerBall 具有以下字段:

圆心的xy位置

圆运动的velXvelY速度向量表示为两个标量值,可以是正数或负数。

直径- 圆的直径

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

标签: java2dandroid-canvascollisionresolve

解决方案


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

推荐阅读