在d3

时间:2016-09-08 07:57:30

标签: javascript math d3.js game-physics

您好我正在使用this example,以便在框架内弹出多个球(大小相同)。

问题是我需要改变它,以便在2个球碰撞后它们会反弹回随机方向而不一定是物理学"办法。在任何时候,球都不能相互重叠。

很想听听有关如何在碰撞后创建随机动作的一些建议。

修改

忘记提及,球应始终保持相同的速度,因为在我的情况下所有的球具有相同的半径,它们也在相同的速度。因此,简单地增加或减少vx和vy就不会这样做。

编辑2

在我看来,根据我制作的一些逻辑,球场应该是一个与球接触点成180度范围内的随机角度。 问题是我不知道如何进行这些计算,得到每个球接触点并从那里取出范围

2 个答案:

答案 0 :(得分:2)

一种解决方案,就是改变碰撞后的动作角度

    if ( CheckCollision(ball1, ball2) ) {
        //change the angle of both the balls
        console.log(ball1.aoa, ball2.aoa, "old");
        var a1 = Math.floor((Math.random() * 10) + 1);//change the angle using random
        ball1.aoa = Math.PI / a1;

        var a2 = Math.floor((Math.random() * 10) + 1);//change the angle using random
        ball2.aoa = Math.PI / a2;
        console.log(ball1.aoa, ball2.aoa, "new");

工作代码here

答案 1 :(得分:2)

行后

        if ( CheckCollision(ball1, ball2) ) {

在设置之前,代码执行计算以确定ball1和ball2的新速度:

//set velocities for both balls
            ball1.vx = vx1;
            ball1.vy = vy1;
            ball2.vx = vx2;
            ball2.vy = vy2;

如果您不希望它们变得真实,那么您只需将vx1,vy1和vx2以及vy2更改为随机值即可。您可能必须保留此代码

//ensure one ball is not inside others. distant apart till not colliding
            while (CheckCollision(ball1, ball2)) {
                ball1.posX += ball1.vx;
                ball1.posY += ball1.vy;

                ball2.posX += ball2.vx;
                ball2.posY += ball2.vy;
            }

确保您不会将球拉到彼此内部。然而,这可能意味着球将会#"相"通过一个随机方式