Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 组合速度大于初始速度_Java_Game Physics_Physics - Fatal编程技术网

Java 组合速度大于初始速度

Java 组合速度大于初始速度,java,game-physics,physics,Java,Game Physics,Physics,我在用爪哇做台球游戏。我使用指南来解决冲突。在测试过程中,我注意到碰撞后两个碰撞的台球之间有更多的速度。额外速度的数量似乎是0%-50%。在直射时约为0%,在极宽射程时约为50%。我假设组合速度将保持不变。是我的代码还是我对物理的理解错了 private void solveCollision(PoolBall b1, PoolBall b2) { System.out.println(b1.getMagnitude() + b2.getMagnitude()); // ve

我在用爪哇做台球游戏。我使用指南来解决冲突。在测试过程中,我注意到碰撞后两个碰撞的台球之间有更多的速度。额外速度的数量似乎是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());

}

并不是所有的解释都是严格围绕这个主题的,我将假设最小的先见之明,以适应未来的潜在用户-不幸的是,一些人可能会因此觉得它迂腐


速度不是一个守恒量,因此碰撞前的速度之和不一定等于碰撞后的速度之和

这对于非弹性碰撞更为直观,特别是当你考虑一个场景,比如小行星撞击地球的月球时,一个典型的撞击速度是每秒10到20公里的量级。如果标量速度在这种情况下是守恒的——即使是在45°(最有可能的)的“宽”撞击角下——月球产生的速度将足以将其从地球轨道上弹射出去

很明显,对于非弹性碰撞,标量速度不一定守恒。弹性碰撞不那么直观

正如你所注意到的,这是因为在一个场景中,完美弹性碰撞中的标量速度是守恒的(直接碰撞),而非弹性碰撞永远不会守恒速度2。这造成了不可接受的不一致

要纠正这一点,我们必须将速度视为一个向量,而不是一个标量。考虑两个球之间最简单的弹性碰撞:静止的一个球,第二个球击中第一个“直”(冲击角为90°)。第二个球将静止,第一个球将以与第二个球的初始速度相等的速度离开碰撞。速度是守恒的——前后速度之和相等——一切都很好

但是,对于90°以外的碰撞角,情况并非如此,因为幅值和无法考虑抵消的矢量分量。例如,假设你有一个球再次静止,第二个球以45°击打它。然后,两个球将以与第二个球的初始移动方向3成45°的角度离开碰撞。然后,两个球也将具有与初始运动方向平行的相同速度分量,并且相等但相反垂直速度分量。取矢量和时,两个垂直分量将相消,两个平行分量的和将恢复初始速度矢量。但是,每个球产生的速度向量的大小将大于第二个球的初始速度的大小-因为大小是通过平方值的总和计算的,因此不考虑相反的分量

当然,最好的方法不是看速度,而是看动量——正是动量守恒决定了上述行为,就动量而言,解释非常简单:它规定在完全弹性碰撞中,质心的速度不得改变


1更大的一个——因为地球最近捕获了一颗行星

事实上,这是非弹性碰撞定义的一部分


3有关计算偏离角的更多背景信息,请参见。

不要使用浮动。用双倍来代替。@FredK好的,但是为什么?两个球的组合速度不一定等于单个球的初始速度-唯一必须守恒的量是能量和动量。为了在高入射碰撞中保持动量守恒,两个球的动量向量的垂直分量必须相等且相反。这就产生了两个速度向量,它们的大小和可能大于碰撞前第一个球的速度大小。@WilliamMiller我使用了碰撞前后两个球的大小和,而不仅仅是一个球和两个球的大小和。我理解这一点,但在这两种情况下,相加的是大小而不是向量,这个量值不一定是守恒的。有关原因的详细解释,请参见我的答案