组合速度大于初始速度
combined velocity is larger than initial velocity
我正在 Java 制作台球游戏。我使用 this 冲突解决指南。在测试过程中,我注意到碰撞后两个碰撞池球之间的速度更快。额外速度的量似乎是 0%-50%。直射约为 0%,极广角射约为 50%。我假设组合速度将保持不变。是我的代码还是我对物理学的理解有误?
private void solveCollision(PoolBall b1, PoolBall b2) {
System.out.println(b1.getMagnitude() + b2.getMagnitude());
// vector tangent to collision point
float vTangX = b2.getY() - b1.getY();
float vTangY = -(b2.getX() - b1.getX());
// normalize tangent vector
float mag = (float) (Math.sqrt((vTangX * vTangX) + (vTangY * vTangY)));
vTangX /= mag;
vTangY /= mag;
// get new vector based on velocity of circle being collided with
float NVX1 = b1.getVector().get(0) - b2.getVector().get(0);
float NVY1 = b1.getVector().get(1) - b2.getVector().get(1);
// dot product
float dot = (NVX1 * vTangX) + (NVY1 * vTangY);
// adjust length of tangent vector
vTangX *= dot;
vTangY *= dot;
// velocity component perpendicular to tangent
float vPerpX = NVX1 - vTangX;
float vPerpY = NVY1 - vTangY;
// apply vector to pool balls
b1.setVector(b1.getVector().get(0) - vPerpX, b1.getVector().get(1) - vPerpY);
b2.setVector(b2.getVector().get(0) + vPerpX, b2.getVector().get(1) + vPerpY);
System.out.println(b1.getMagnitude() + b2.getMagnitude());
}
并不是所有的解释都严格针对主题,我将假设有最少的先见之明以适应未来的潜在用户——不幸的是,有些人可能会因此觉得它迂腐。
速度不是守恒量,因此碰撞前速度的大小总和不一定等于大小-在 之后的速度总和 。
这对于非弹性碰撞更直观,特别是当您考虑小行星与地球月球碰撞等场景时1,其中典型的撞击速度约为 10 - 每秒 20 公里。如果在这种情况下标量速度守恒——即使在 'wide' 45° 的撞击角(最有可能)——月球的最终速度将足以将其从地球轨道弹出。
很明显,对于非弹性碰撞,标量速度不一定守恒。弹性碰撞不太直观。
正如您所指出的,这是因为存在这样一种情况,即完全弹性碰撞(直线碰撞)中的标量速度是守恒的,而非弹性碰撞从不 守恒速度2。这造成了不可接受的不一致。
为了纠正这个问题,我们必须将速度视为矢量而不是标量。考虑两个球之间最简单的弹性碰撞:一个球静止,第二个球撞击第一个 'straight-on'(撞击角为 90°)。第二个球将停止,第一个球将以等于第二个初始速度的速度离开碰撞。速度是守恒的——前后速度的大小和相等——一切都很好。
但是,对于 90° 以外的撞击角,情况并非如此,因为 幅度总和无法说明向量分量抵消 。举例来说,你有一个球再次静止,第二个球以 45° 击打它。然后,两个球将以与第二个球的初始行进方向成 45° 角的方式离开碰撞3。这两个球也将具有相同的平行于初始运动方向的速度分量,并且等于 但相反 的垂直速度分量。当您取矢量和时,两个垂直分量将抵消,两个平行分量的和将恢复初始速度矢量。但是,每个球的最终速度矢量的大小将大于第二个球的初始速度的大小 - 因为大小是由平方值的总和计算的,因此不考虑相反的分量。
当然,最好的方法不是看速度,而是看动量——动量守恒支配着上面概述的行为,就动量而言,解释非常简单:它决定了在完美弹性碰撞质心的速度一定不会改变。
1 更大的一个 - 因为地球最近捕获了一个 second true satellite.
2 这实际上是非弹性碰撞定义的一部分。
3 有关计算离去角的其他背景,请参阅 here。
我正在 Java 制作台球游戏。我使用 this 冲突解决指南。在测试过程中,我注意到碰撞后两个碰撞池球之间的速度更快。额外速度的量似乎是 0%-50%。直射约为 0%,极广角射约为 50%。我假设组合速度将保持不变。是我的代码还是我对物理学的理解有误?
private void solveCollision(PoolBall b1, PoolBall b2) {
System.out.println(b1.getMagnitude() + b2.getMagnitude());
// vector tangent to collision point
float vTangX = b2.getY() - b1.getY();
float vTangY = -(b2.getX() - b1.getX());
// normalize tangent vector
float mag = (float) (Math.sqrt((vTangX * vTangX) + (vTangY * vTangY)));
vTangX /= mag;
vTangY /= mag;
// get new vector based on velocity of circle being collided with
float NVX1 = b1.getVector().get(0) - b2.getVector().get(0);
float NVY1 = b1.getVector().get(1) - b2.getVector().get(1);
// dot product
float dot = (NVX1 * vTangX) + (NVY1 * vTangY);
// adjust length of tangent vector
vTangX *= dot;
vTangY *= dot;
// velocity component perpendicular to tangent
float vPerpX = NVX1 - vTangX;
float vPerpY = NVY1 - vTangY;
// apply vector to pool balls
b1.setVector(b1.getVector().get(0) - vPerpX, b1.getVector().get(1) - vPerpY);
b2.setVector(b2.getVector().get(0) + vPerpX, b2.getVector().get(1) + vPerpY);
System.out.println(b1.getMagnitude() + b2.getMagnitude());
}
并不是所有的解释都严格针对主题,我将假设有最少的先见之明以适应未来的潜在用户——不幸的是,有些人可能会因此觉得它迂腐。
速度不是守恒量,因此碰撞前速度的大小总和不一定等于大小-在 之后的速度总和 。
这对于非弹性碰撞更直观,特别是当您考虑小行星与地球月球碰撞等场景时1,其中典型的撞击速度约为 10 - 每秒 20 公里。如果在这种情况下标量速度守恒——即使在 'wide' 45° 的撞击角(最有可能)——月球的最终速度将足以将其从地球轨道弹出。
很明显,对于非弹性碰撞,标量速度不一定守恒。弹性碰撞不太直观。
正如您所指出的,这是因为存在这样一种情况,即完全弹性碰撞(直线碰撞)中的标量速度是守恒的,而非弹性碰撞从不 守恒速度2。这造成了不可接受的不一致。
为了纠正这个问题,我们必须将速度视为矢量而不是标量。考虑两个球之间最简单的弹性碰撞:一个球静止,第二个球撞击第一个 'straight-on'(撞击角为 90°)。第二个球将停止,第一个球将以等于第二个初始速度的速度离开碰撞。速度是守恒的——前后速度的大小和相等——一切都很好。
但是,对于 90° 以外的撞击角,情况并非如此,因为 幅度总和无法说明向量分量抵消 。举例来说,你有一个球再次静止,第二个球以 45° 击打它。然后,两个球将以与第二个球的初始行进方向成 45° 角的方式离开碰撞3。这两个球也将具有相同的平行于初始运动方向的速度分量,并且等于 但相反 的垂直速度分量。当您取矢量和时,两个垂直分量将抵消,两个平行分量的和将恢复初始速度矢量。但是,每个球的最终速度矢量的大小将大于第二个球的初始速度的大小 - 因为大小是由平方值的总和计算的,因此不考虑相反的分量。
当然,最好的方法不是看速度,而是看动量——动量守恒支配着上面概述的行为,就动量而言,解释非常简单:它决定了在完美弹性碰撞质心的速度一定不会改变。
1 更大的一个 - 因为地球最近捕获了一个 second true satellite.
2 这实际上是非弹性碰撞定义的一部分。
3 有关计算离去角的其他背景,请参阅 here。