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