示例#1
0
        public void SimulationStep(IBackBox bb, List <Particle> particles, float dt)
        {
            List <Particle> particlesCopy = particles.ConvertAll(x => x.Clone());

            //first calculate midpoint
            bb.Execute(particlesCopy, dt);
            particlesCopy.ForEach(x => x.Position += x.Velocity * (dt / 2));

            //calculate forces on midpoint
            bb.Execute(particlesCopy, dt);

            for (int i = 0; i < particles.Count; i++)
            {
                particles[i].Velocity  = particlesCopy[i].Velocity;
                particles[i].Position += particlesCopy[i].Velocity * dt;
            }
        }
示例#2
0
        public void SimulationStep(IBackBox bb, List <Particle> particles, float dt)
        {
            List <Particle> tmp = particles.ConvertAll(x => x.Clone());

            if (_previousState == null)
            {
                bb.Execute(particles, dt);
                particles.ForEach(x => x.Position = x.Position + x.Velocity * dt + 0.5f * x.ForceComplete * dt * dt);
            }
            else
            {
                bb.Execute(particles, dt);
                for (int i = 0; i < particles.Count; i++)
                {
                    particles[i].Position = 2 * particles[i].Position - _previousState[i].Position +
                                            particles[i].ForceComplete * dt * dt;
                }
            }
            _previousState = tmp;
        }
示例#3
0
        public void SimulationStep(IBackBox bb, List <Particle> particles, float dt)
        {
            List <Particle> k1 = particles.ConvertAll(x => x.Clone());
            List <Particle> k2 = particles.ConvertAll(x => x.Clone());
            List <Particle> k3 = particles.ConvertAll(x => x.Clone());
            List <Particle> k4 = particles.ConvertAll(x => x.Clone());

            bb.Execute(k1, dt);

            for (int i = 0; i < particles.Count; i++)
            {
                k2[i].Velocity  = k1[i].Velocity;
                k2[i].Position += k1[i].Velocity * dt / 2;
            }

            bb.Execute(k2, dt);

            for (int i = 0; i < particles.Count; i++)
            {
                k3[i].Velocity  = k2[i].Velocity;
                k3[i].Position += k2[i].Velocity * dt / 2;
            }

            bb.Execute(k3, dt);

            for (int i = 0; i < particles.Count; i++)
            {
                k4[i].Velocity  = k3[i].Velocity;
                k4[i].Position += k3[i].Velocity * dt;
            }

            bb.Execute(k4, dt);

            for (int i = 0; i < particles.Count; i++)
            {
                particles[i].Velocity  = k1[i].Velocity / 6 + k2[i].Velocity / 3 + k3[i].Velocity / 3 + k4[i].Velocity / 6;
                particles[i].Position += particles[i].Velocity * dt;
            }
        }
示例#4
0
 public void SimulationStep(IBackBox bb, List <Particle> particles, float dt)
 {
     bb.Execute(particles, dt);
     particles.ForEach(x => x.Position += x.Velocity * dt);
     particles.ForEach(x => x.Rotation += x.AngularVelocity * dt);
 }