我正在编写代码来模拟理想气体的碰撞。在这种情况下,碰撞是弹性的(没有能量损失)。 我已经编写了代码来计算我需要的所有内容,包括他们遇到的时间和位置。在我的类函数中,我定义:
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。
我觉得这可能是我犯过的一个简单的错误或者我已经忘记的事情,我只是强调自己到了我无法发现的地步。任何帮助非常感谢。请务必要求澄清或进一步解释。
丹。
答案 0 :(得分:2)
你需要传递粒子作为参考,现在你只是传递一个粒子对象的副本,当函数结束时它被销毁。更改函数定义:
void Particle::collideParticles(Particle particle){
}
要
void Particle::collideParticles(Particle &particle){
}
答案 1 :(得分:1)
我不确定这是否能解决您的问题,但您设计方法collideParticles(Particle particle)
的方式并非您操纵Particle p2
的速度,而是操纵该对象副本的速度。您可以尝试将方法更改为collideParticles(Particle& particle)
。通过使用引用Particle&
,您实际上可以更改对象p2
。