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); } }