/// <summary> /// Initializes new instance of MovementModeling class /// </summary> /// <param name="digraph">Digraph</param> /// <param name="speed">Speed in unit per millisecond</param> /// <param name="type">Modeling type</param> /// <param name="actions">Array of additional actions</param> /// <exception cref="ArgumentNullException"/> /// <exception cref="ArgumentOutOfRangeException"/> public MovementModeling(Digraph digraph, double speed, MovementModelingType type, MovementModelingActions[] actions) { if (speed <= 0) { throw new ArgumentOutOfRangeException(nameof(speed), @"Speed of movement should be positive"); } this.digraph = digraph ?? throw new ArgumentNullException(nameof(digraph)); this.speed = speed; this.type = type; this.actions = actions; IsActive = false; MovementEnded += (sender, e) => { if (type == MovementModelingType.Sandpile) { GraphDrawing.DrawTheWholeGraphSandpile(digraph, false); } if (type == MovementModelingType.Basic) { GraphDrawing.DrawTheWholeGraph(digraph); } DrawingSurface.Image = GraphDrawing.Image; }; verticesTime = new List <double>(digraph.Vertices.Count); verticesTime.AddRange(digraph.Vertices.ConvertAll(vertex => 0d)); stateReleaseCondition = i => type == MovementModelingType.Sandpile && digraph.State[i] >= incidenceList[i].Count || type == MovementModelingType.Basic && digraph.State[i] >= digraph.Thresholds[i]; refractoryPeriodAdded = new bool[digraph.Vertices.Count]; hasFired = new bool[digraph.Vertices.Count]; lastFires = new Double[digraph.Vertices.Count]; }
/// <summary> /// Prepares MovementModeling instance for modeling the movement /// </summary> /// <param name="type">Modeling type</param> /// <param name="actions">Additional actions</param> /// <param name="sandpileChartTypes">Sandpile chart types</param> private bool PrepareMovementModeling(MovementModelingType type, MovementModelingActions[] actions, SandpileChartType[] sandpileChartTypes) { movement = new MovementModeling(digraph, (double)SpeedNumeric.Value / 1000, type, actions) { GraphDrawing = graphDrawing, DrawingSurface = DrawingSurface, SandpileChartTypes = sandpileChartTypes }; isOnMovement = true; movement.Tick += UpdateElapsedTime; movement.MovementEnded += StopToolStripMenuItem_Click; MovementToolStripMenuItem.Text = @"Continue"; MovementToolStripMenuItem.Enabled = false; StopToolStripMenuItem.Enabled = true; if (type == MovementModelingType.Sandpile) { graphDrawing.DrawTheWholeGraphSandpile(digraph, true); DrawingSurface.Image = graphDrawing.Image; SandpilePanel.Visible = true; SandpilePanel.BringToFront(); return(true); } if (SaveGifCheckBox.Checked) { movement.MovementEnded += SaveGif; } movement.MovementEnded += (s, ea) => { movement.Tick -= UpdateElapsedTime; movement = null; }; TimeTextBox.Visible = true; TimeTextBox.BringToFront(); return(false); }