【问题标题】:What is wrong with this circle-to-circle collision?这个圆到圆的碰撞有什么问题?
【发布时间】:2012-08-27 08:15:19
【问题描述】:

我有一个简单的 Java 应用程序,可以测试 4 个墙壁和 10 个球中的每一个的碰撞...我已经弄清楚了墙壁,但圆到圆似乎对我不起作用。当我与程序的其余部分一起运行该部分时,我得到了 10 个非常摇晃的圆圈(它们似乎在与自己发生碰撞)并且它们根本不动。如果我把这个部分拿出来,我会得到 10 个圆,它们会平稳地移动并从 4 个墙壁上碰撞。有人可以告诉我可能导致问题的原因吗?谢谢

for (int j = 0; j < ballnum; ++j) {
    for (int k = 0; k < ballnum; ++k) {
        if (Math.sqrt((Math.pow(balls[j].givebackpoint().x - balls[k].givebackpoint().x, 2))
            + (Math.sqrt(Math.pow(balls[j].givebackpoint().y - balls[k].givebackpoint().y, 2)))) <= 2 * RADIUS) {
            if (balls[j].givebackangle() >= 180) {
                balls[j].setangle(balls[j].givebackangle()-180);
                                        }
            else{
                balls[j].setangle(360-balls[j].givebackangle());
                }
            }
        }
    }

【问题讨论】:

    标签: java physics collision


    【解决方案1】:

    您正在检查每个球本身。

    当 j == k 时,你需要跳过运行测试,在你的内部 for 循环的顶部使用这样的一行:

    if (j == k)
        continue;
    

    【讨论】:

    • 似乎仍然没有解决它。我明白你在说什么。我会继续玩弄它,稍后再回帖...
    • 您确定您的角度修改代码是正确的吗?我似乎无法弄清楚...
    • 我不完全确定......它似乎对我有用。但是你会怎么做呢?只是好奇
    • 现在可以使用了。我拿出单独的 Math.sqrt 并在声明的开头只做了一个。它仍然毛茸茸的,但我想我现在可以使用它了。谢谢!
    【解决方案2】:

    除非我错过了它,否则您似乎不会跳过 j == k 的位置。所以你是对的,他们正在与自己发生冲突。

    【讨论】:

      猜你喜欢
      • 2014-05-20
      • 2023-03-20
      • 1970-01-01
      • 2022-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多