/// <summary> /// Draws all the moving dots, removes all the dots got to their destination /// and releases new dots if destination vertices are ready /// </summary> private void ProcessDots() { if (type == MovementModelingType.Basic) { GraphDrawing.DrawTheWholeGraph(digraph); } else { GraphDrawing.DrawTheWholeGraphSandpile(digraph, false); } int newOldMax = -1; for (var i = 0; i < involvedArcs.Count; i++) { if (stopwatches[i].ElapsedMilliseconds >= GetTime(involvedArcs[i].Length, speed)) { if (Math.Max(dotsTime[i], verticesTime[involvedArcs[i].EndVertex]) > oldMax) { oldMax = Math.Max(dotsTime[i], verticesTime[involvedArcs[i].EndVertex]); } bool addTime = !stateReleaseCondition(involvedArcs[i].EndVertex); digraph.State[involvedArcs[i].EndVertex]++; if (verticesTime[involvedArcs[i].EndVertex] < dotsTime[i]) { verticesTime[involvedArcs[i].EndVertex] = dotsTime[i]; } if (!releaseCondition(involvedArcs[i].EndVertex) && stateReleaseCondition(involvedArcs[i].EndVertex) && addTime) { verticesTime[involvedArcs[i].EndVertex] += digraph.RefractoryPeriods[involvedArcs[i].EndVertex] - dotsTime[i] + lastFires[involvedArcs[i].EndVertex]; refractoryPeriodAdded[involvedArcs[i].EndVertex] = true; } stopwatches.RemoveAt(i); involvedArcs.RemoveAt(i); dotsTime.RemoveAt(i); i--; continue; } PointF point = GetPoint(digraph.Vertices[involvedArcs[i].StartVertex], digraph.Vertices[involvedArcs[i].EndVertex], involvedArcs[i].Length, stopwatches[i]); GraphDrawing.DrawDot(point); } if (newOldMax > 0) { oldMax = newOldMax; } CheckDotsNumber(20000); if (type == MovementModelingType.Basic) { GraphDrawing.DrawVertices(digraph); } else { GraphDrawing.DrawVerticesSandpile(digraph); } DrawingSurface.Image = GraphDrawing.Image; }