首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >球之间的碰撞

球之间的碰撞
EN

Stack Overflow用户
提问于 2012-05-11 15:13:35
回答 2查看 409关注 0票数 0

我有一个方法,可以把球反射到墙上,也可以互相反射。每个球的半径是50。

代码语言:javascript
复制
public void reflectBalls(){
    for(int j = 0; j < 2; j++){
        if(ball[j].getY() <= NWall) ball[j].flipVertical();
        else if(ball[j].getY() >= (SWall - 50)) ball[j].flipVertical();
        else if(ball[j].getX() <= WWall) ball[j].flipHorizontal();
        else if(ball[j].getX() >= (EWall - 50)) ball[j].flipHorizontal();
    }
    for(int i = 0; i < 2; i++){
        for(int j = 0; j < 2; j++){
            if(i == j){
                continue;
            }else{
                double ax = (double)ball[i].getX();
                double ay = (double)ball[i].getY();
                double bx = (double)ball[j].getX();
                double by = (double)ball[j].getY();
                double distx = (ax-bx)*(ax-bx);
                double disty = (ay-by)*(ay-by);
                double distance = Math.sqrt(distx + disty);
                if(Math.floor(distance) <= 100){
                    ball[i].flipHorizontal();
                    ball[j].flipVertical();
                    ball[i].flipVertical();
                    ball[j].flipHorizontal();
                }
            }
        }
    }
}

第一部分(对墙的反射)工作得很好。但是,球不会碰撞,它们只是相互穿透。我尝试了许多不同的方法,但也许我遗漏了一些数学知识。我的算法基于毕达哥拉斯定理,其中X坐标之间的差和Y坐标之间的差都是平方,它们的和是中心之间的距离。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-11 15:18:58

这就是你的问题-你发现球i和球j相撞,然后你翻转它。然后你发现球j和球i相撞,并再次翻转它们。因此,不会发生冲突。仅当j>i且一切正常时才执行碰撞检查。

票数 1
EN

Stack Overflow用户

发布于 2012-05-11 15:19:40

您可能只需要翻转两次,因为您的循环将发现每个collission两次。

最好确保让对象彼此远离,而不是翻转。然后在最后,让他们离开墙。否则,在拼贴直接在墙上,你可能会结束一个球实际上移动到外面!

作为一种快速修复方法,您可以更改

代码语言:javascript
复制
for(int j = i+1; j < 2; j++){

请注意i+1。这就是“每次晚些时候的球”。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10547053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档