Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.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
Visual c++ 二维球碰撞_Visual C++ - Fatal编程技术网

Visual c++ 二维球碰撞

Visual c++ 二维球碰撞,visual-c++,Visual C++,我的弹跳球程序中每个球的碰撞检测都完成了, 现在知道碰撞后的下一个事件有了新的问题。 我因为在打了另一个球后知道球的新速度而被卡住了。 我尝试了讨论过的方法 我实现了这个算法,但它根本不起作用。 碰撞后,球的速度为零。 我发现生成的新值小于1.0e-13,它被浮点类型降级为零,我用于处理速度和坐标值 我不知道我使用的方法是否不适合浮点运算,或者我只是在参考资料中错误地遵循了这些步骤。 我的物理一点也不好 代码如下: void Physics::Add(Ball object[]) { f

我的弹跳球程序中每个球的碰撞检测都完成了, 现在知道碰撞后的下一个事件有了新的问题。 我因为在打了另一个球后知道球的新速度而被卡住了。 我尝试了讨论过的方法

我实现了这个算法,但它根本不起作用。 碰撞后,球的速度为零。 我发现生成的新值小于1.0e-13,它被浮点类型降级为零,我用于处理速度和坐标值

我不知道我使用的方法是否不适合浮点运算,或者我只是在参考资料中错误地遵循了这些步骤。 我的物理一点也不好

代码如下:

void Physics::Add(Ball object[]) {
    for (int i = 0;i < Ball::numOfObj; ++i){

        for(int j = 0;j < Ball::numOfObj; ++j){
            if(i == j) break;

            if(PotentialBallCollision(object[i], object[j])){
                Vector2f normalVector ( object[i].pos.X - object[j].pos.X,
                                    object[i].pos.Y - object[j].pos.Y);

                float resultant = _sqrt((normalVector.X * normalVector.X) +
                                    (normalVector.Y * normalVector.Y));

                Vector2f resultantVector (resultant, resultant);

                Vector2f unitNormal =   (normalVector / resultantVector);

                Vector2f unitTangent (-unitNormal.Y, unitNormal.X);

                float velN1 = (unitNormal.X * object[i].vel.X) * (unitNormal.Y * object[i].vel.Y);
                float velT1 = (unitTangent.X * object[i].vel.X) * (unitTangent.Y * object[i].vel.Y);
                float velN2 = (unitNormal.X * object[j].vel.X) * (unitNormal.Y * object[j].vel.Y);
                float velT2 = (unitTangent.X * object[j].vel.X) * (unitTangent.Y * object[j].vel.Y);
                velN1 = (velN1 * (object[i].mass - object[j].mass) + 2 * (object[j].mass * velN2)) /
                    (object[i].mass + object[j].mass);
                velN2 = (velN2 * (object[j].mass - object[i].mass) + 2 * (object[i].mass * velN1)) /
                    (object[i].mass + object[j].mass);

                velN1 *= unitNormal.X * unitNormal.Y;
                velT1 *= unitTangent.X * unitTangent.Y;
                velN2 *= unitNormal.X * unitNormal.Y;
                velT2 *= unitTangent.X * unitTangent.Y;

                float newVel1 = velN1 + velT1;
                float newVel2 = velN2 + velT2;

            /*object[i].vel = Vector2f(newVel1 , newVel1); //<-- this is the generated velocities
                object[j].vel = Vector2f(newVel2, newVel2);*/

                object[i].vel.X *= -1; //fake physics
                object[i].vel.Y *= -1; //
                object[j].vel.X *= -1; //
                object[j].vel.Y *= -1; //
            }

                if(PotentialWallCollision(object[j])){
                    switch(object[j].dir)
                    {
                    case Vector2f::UP:
                    case Vector2f::DOWN:
                        object[j].vel.Y *= -1;
                        break;
                    case Vector2f::LEFT:
                    case Vector2f::RIGHT:
                        object[j].vel.X *= -1;
                        break;
                     }
                }
                if(PotentialWallCollision(object[i])){
                    switch(object[i].dir)
                    {
                    case Vector2f::UP:
                    case Vector2f::DOWN:
                        object[i].vel.Y *= -1;
                        break;
                    case Vector2f::LEFT:
                    case Vector2f::RIGHT:
                        object[i].vel.X *= -1;
                        break;
                    }
                }
                    object[i].pos += object[i].vel;
                    object[j].pos += object[j].vel;
            }
    }
}
我怀疑问题出在我自己制作的结果向量中,因为我不理解这个公式->向量:unitNormal=normalVector/sqrtnormalVector.X^2+normalVector.Y^2
所以我做了一个新的变量,叫做结式,把这个值设为结式向量的x和y,把它除以另一个向量。

这是一个问题,还是一个答案?这是一个问题。不管怎么说,我已经解决了这个问题,当得到震级时,我忘了分开X和Y。现在还有另一个问题,能量守恒失去了,球彼此随机地粘在一起,但其他球没有,这可能就是能量丢失的原因。我想在改变速度之前,我应该把它们分开一点以避免粘在一起,但我不知道怎么做。