예제 #1
0
 public void Simulate(double limit, double Hz)
 {
     _pq = new MinPQ <CollisionEvent>(1000);
     for (int i = 0; i < _particles.Length; i++)
     {
         PredictCollisions(_particles[i], limit);
     }
     _pq.Insert(new CollisionEvent(0, null, null));
     while (_pq.Count > 0)
     {
         CollisionEvent collisionEvent = _pq.DelMin();
         if (!collisionEvent.IsValid())
         {
             continue;
         }
         for (int i = 0; i < _particles.Length; i++)
         {
             _particles[i].Move(collisionEvent.Time - t);
         }
         t = collisionEvent.Time;
         Particle a = collisionEvent.A, b = collisionEvent.B;
         if (a != null && b != null)
         {
             a.BounceOff(b);
         }
         else if (a != null && b == null)
         {
             a.BounceOffVerticalWall();
         }
         else if (a == null && b != null)
         {
             b.BounceOffHorizontalWall();
         }
         else if (a == null && b == null)
         {
             ReDraw(limit, Hz);
         }
         PredictCollisions(a, limit);
         PredictCollisions(b, limit);
     }
 }