Beispiel #1
0
        /// <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];
        }
Beispiel #2
0
        /// <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);
        }