/// <summary> /// Models and animates the process of dots movement /// </summary> private void TickModeling(object source, EventArgs e) { if (dotsTime.Count > 0) { int index = dotsTime.IndexOf(dotsTime.Max()); time = (long)(dotsTime[index] - GetTime(involvedArcs[index].Length, speed) + stopwatches[index].ElapsedMilliseconds) + lastTime; } else { int index = verticesTime.IndexOf(verticesTime.Max()); time = (long)verticesTime[index] - digraph.RefractoryPeriods[index] + digraph.TimeTillTheEndOfRefractoryPeriod[index].ElapsedMilliseconds + lastTime; } Tick?.Invoke(this, new MovementTickEventArgs(time)); initialCount = involvedArcs.Count; ProcessDots(); ProcessVertices(); if (IsMovementEnded) { Stop(); lastTime += (long)(verticesTime.Max()); verticesTime = new List <double>(digraph.Vertices.Count); verticesTime.AddRange(digraph.Vertices.ConvertAll(vertex => 0d)); dotsTime = new List <double>(); oldMax = 0; AddNumberOfDotsChartPoint(lastTime, initialCount); AddNumberOfDotsChartPoint(lastTime, involvedArcs.Count); Tick?.Invoke(this, new MovementTickEventArgs(lastTime)); MovementEnded?.Invoke(this, null); } else if (involvedArcs.Count == 0 && initialCount != 0) { stopwatchTime.Restart(); } }
/// <summary> /// Checks current number of dots /// and aborts the process if it exceeds the limit /// </summary> private void CheckDotsNumber(int limit) { if (stopwatches.Count > limit) { Stop(); MessageBox.Show("Operation has been aborted prematurely." + Environment.NewLine + $"The number of dots exceeded the allowable mark of {limit}", "Operation Aborted", MessageBoxButton.OK, MessageBoxImage.Error); Stop(); lastTime += (long)(dotsTime.Max() - GetTime(involvedArcs[dotsTime.IndexOf(dotsTime.Max())].Length, speed)); verticesTime = new List <double>(digraph.Vertices.Count); verticesTime.AddRange(digraph.Vertices.ConvertAll(vertex => 0d)); dotsTime = new List <double>(); Tick?.Invoke(this, new MovementTickEventArgs(lastTime)); MovementEnded?.Invoke(limit, null); } }
/// <summary> /// Starts or restarts the movement /// </summary> public void Go() { if (IsMovementEnded) { MovementEnded?.Invoke(this, null); return; } mainTimer.Start(); if (lastTime > 0) { stopwatchTime.Start(); } for (int i = 0; i < digraph.TimeTillTheEndOfRefractoryPeriod.Count && time > 0; i++) { if (digraph.TimeTillTheEndOfRefractoryPeriod[i].ElapsedMilliseconds != 0) { digraph.TimeTillTheEndOfRefractoryPeriod[i].Start(); } } stopwatches.ForEach(timer => timer.Start()); IsActive = true; }
protected virtual void OnMovementEnded(EventArgs e) { MovementEnded?.Invoke(this, e); }