类功能问题。 C ++

时间:2016-04-02 14:21:25

标签: c++

我正在编写代码来模拟理想气体的碰撞。在这种情况下,碰撞是弹性的(没有能量损失)。 我已经编写了代码来计算我需要的所有内容,包括他们遇到的时间和位置。在我的类函数中,我定义:

Particle.cpp

    void Particle::collideParticles(Particle particle){

    double tCollision;

    tCollision=timeToCollision(particle);


    if(tCollision >= 0 && (!testFloat(tCollision,FLT_MAX, 0.1))){

        move(tCollision);
        particle.move(tCollision);

        Vector r2=particle.getPosition();
        Vector r1=p;
        Vector r0=r2-r1;
        Vector n=r0.unit();
        Vector v1=n;
        Vector v2=n;

        v1.Scale(v.dot(n));
        v2.Scale(particle.getVelocity().dot(n));

        Vector deltaV=v2-v1;

        setVelocity(v+deltaV);
        particle.setVelocity(particle.getVelocity()-deltaV);

    }

}

我对混淆术语表示歉意。

  • Vector指的是包含x,y,z组件的类。

  • Scale,缩放向量(x,y,z)

  • Unit采用单位向量。

  • timeToCollision是一个早期的类函数,它计算并返回两个粒子碰撞的时间。

  • FLT_MAX是来自<cfloat>的值在我的问题中不起作用,因为示例在0和FLT_MAX范围内。列表项

通过使用couting值我已经建立了这个代码的工作原理;但是,当我在

中调用此函数时

Main.cpp

    Vector p1p(0,0,0);
    Vector p1v(1,0,0);
    Vector p2p(5,0,0);
    Vector p2v(0,0,0);
    Particle p1(1, p1p, p1v);
    Particle p2(1, p2p, p2v);

    cout << "Velocity of p1 before collide should be 1 on X, value is: " << p11.getVelocity().GetX() << endl;
    cout << "Velocity of p2 before collide should be 0 on X, value is: " << p2.getVelocity().GetX() << endl;

    p1.collideParticles(p2);

    cout << "Velocity of p1 should be 0 on X, value is: " << p11.getVelocity().GetX() << endl;
    cout << "Velocity of p2 should be 1 on X, value is: " << p2.getVelocity().GetX() << endl;

我得到粒子1的x的速度开始为1,结束为0,这是正确的。虽然它给我的粒子2的x的速度在开始时为0,在碰撞后再次为0。

我觉得这可能是我犯过的一个简单的错误或者我已经忘记的事情,我只是强调自己到了我无法发现的地步。任何帮助非常感谢。请务必要求澄清或进一步解释。

丹。

2 个答案:

答案 0 :(得分:2)

你需要传递粒子作为参考,现在你只是传递一个粒子对象的副本,当函数结束时它被销毁。更改函数定义:

void Particle::collideParticles(Particle particle){

}

void Particle::collideParticles(Particle &particle){
}

答案 1 :(得分:1)

我不确定这是否能解决您的问题,但您设计方法collideParticles(Particle particle)的方式并非您操纵Particle p2的速度,而是操纵该对象副本的速度。您可以尝试将方法更改为collideParticles(Particle& particle)。通过使用引用Particle&,您实际上可以更改对象p2