コード例 #1
0
        public Vertex AddVertex(int x, int y)
        {
            var vertex = new Vertex(x, y);

            vertexes.Add(vertex);

            if (AutoConstraints)
            {
                for (int i = 0; i < vertexes.Count; i++)
                {
                    if (vertexes[i] == vertex)
                    {
                        if (i - 1 >= 0)
                        {
                            var v1 = vertexes[i - 1];
                            AddAutoConstraints(v1, vertex);
                        }

                        if (i + 1 < vertexes.Count)
                        {
                            var v1 = vertexes[i + 1];
                            AddAutoConstraints(v1, vertex);
                        }
                    }
                }
            }

            VertexAdded?.Invoke(vertex);
            return(vertex);
        }
コード例 #2
0
        /// <summary>
        /// Called on each added vertex.
        /// </summary>
        /// <param name="vertex">Added vertex.</param>
        protected virtual void OnVertexAdded([NotNull] TVertex vertex)
        {
            if (vertex == null)
            {
                throw new ArgumentNullException(nameof(vertex));
            }

            VertexAdded?.Invoke(vertex);
        }
コード例 #3
0
        public bool AddVertex(TVertex vertex)
        {
            bool vertexWasAdded;

            lock (SyncRoot)
                vertexWasAdded = Graph.AddVertex(vertex);

            if (vertexWasAdded)
            {
                VertexAdded?.Invoke(vertex);
            }

            return(vertexWasAdded);
        }
コード例 #4
0
        public Vertex AddVertex(int x, int y, Vertex v1, Vertex v2)
        {
            constraints.RemoveAll(c => c.IsVertexInvolved(v1) && c.IsVertexInvolved(v2));

            for (int i = 0; i < vertexes.Count; i++)
            {
                if (vertexes[i] == v1 && vertexes[(i + 1) % vertexes.Count] == v2)
                {
                    var vertex = new Vertex(x, y);
                    vertexes.Insert(i + 1, vertex);
                    VertexAdded?.Invoke(vertex);
                    return(vertex);
                }
            }

            return(null);
        }
コード例 #5
0
        public GetOrAddResult <TVertex> GetOrAddVertex(VertexPredicate <TVertex> vertexPredicate, Func <TVertex> createVertexFunc)
        {
            TVertex vertex;

            lock (SyncRoot)
            {
                vertex = Graph.Vertices.FirstOrDefault(i => vertexPredicate(i));
                if (vertex != null)
                {
                    return(new GetOrAddResult <TVertex>(vertex, GetOrAddAction.Get));
                }

                vertex = createVertexFunc();
                Graph.AddVertex(vertex);
            }

            VertexAdded?.Invoke(vertex);

            return(new GetOrAddResult <TVertex>(vertex, GetOrAddAction.Add));
        }
コード例 #6
0
        /// <summary>
        /// Adds vertex to the list of digraph vertices
        /// </summary>
        /// <param name="vertex">Vertex to add</param>
        /// <param name="threshold">Vertex threshold</param>
        /// <param name="refractoryPeriod">Vertex refractory period</param>
        /// <param name="initialState">Vertex initial state</param>
        /// <param name="index">Vertex index</param>
        /// <exception cref="ArgumentOutOfRangeException"/>
        public void AddVertex(Vertex vertex, int threshold = 1, int refractoryPeriod = 0, int initialState = 0, int index = -1)
        {
            if (Vertices.Count >= 200)
            {
                throw new InvalidOperationException(@"Too many vertices. Unable to add a new one.");
            }
            if (threshold <= 0)
            {
                throw new ArgumentOutOfRangeException(nameof(threshold), @"The value of the vertex threshold must be a positive number");
            }
            if (refractoryPeriod < 0)
            {
                throw new ArgumentOutOfRangeException(nameof(refractoryPeriod),
                                                      @"The value of the vertex refractory period must be a non-negative number");
            }
            if (initialState < 0)
            {
                throw new ArgumentOutOfRangeException(nameof(initialState),
                                                      @"The value of the vertex initial state must be a non-negative number");
            }

            if (index == -1)
            {
                index = Vertices.Count;
            }
            Vertices.Insert(index, vertex);
            Thresholds.Insert(index, threshold);
            RefractoryPeriods.Insert(index, refractoryPeriod);
            State.Insert(index, initialState);

            Arcs = Arcs.ConvertAll(arc =>
                                   new Arc(arc.StartVertex >= index ? arc.StartVertex + 1 : arc.StartVertex,
                                           arc.EndVertex >= index ? arc.EndVertex + 1 : arc.EndVertex, arc.Length));

            VertexAdded?.Invoke(vertex, new DigraphChangedEventArgs(index));
        }
コード例 #7
0
        private void OnVertexAdded([NotNull] TVertex vertex)
        {
            Debug.Assert(vertex != null);

            VertexAdded?.Invoke(vertex);
        }
コード例 #8
0
        /// <summary>
        /// Called on each added vertex.
        /// </summary>
        /// <param name="vertex">Added vertex.</param>
        protected virtual void OnVertexAdded(TVertex vertex)
        {
            Debug.Assert(vertex != null);

            VertexAdded?.Invoke(vertex);
        }