Пример #1
0
        /// <summary>
        /// Csúcs törlése
        /// </summary>
        /// <param name="removeKey">Törlendő csúcs</param>
        public void RemoveNode(GraphNode removeKey)
        {
            // ha a kiválasztott csúcsot töröljük, akkor megszűntetjük a kiválasztást
            if (removeKey == _SelectedNode)
            {
                _SelectedNode = null;
            }

            // ha nem null értéket kaptunk törlésre
            if (removeKey != null)
            {
                _Adj.Remove(removeKey); // kitöröljük a csúcsot, és a belőle kiinduló éleket

                // utána még ki kell törölni azon éleket, amik bele vezetnek
                foreach (GraphNode key in _Adj.Keys)
                {
                    // végigmegyünk minden éllistán
                    for (Int32 j = 0; j < _Adj[key].Count; j++)
                    {
                        if (_Adj[key][j].Target == removeKey)
                        {
                            if (_Adj[key][j] == _SelectedArc)
                            {
                                _SelectedArc = null;
                            }
                            // ha az adott él van kiválasztva, akkor megszűntetjük a kiválasztást

                            _Adj[key].RemoveAt(j); // törlünk az adott pozíción
                            j--;                   // mivel ekkor visszalép a lista, ezért vissza kell vennünk az indexből
                        }
                    }
                }
            }
        }
Пример #2
0
 /// <summary>
 /// Gráf törlése
 /// </summary>
 public void Clear()
 {
     _Adj.Clear();
     _NextNumber   = 1;
     _SelectedNode = null;
     _SelectedArc  = null;
 }
Пример #3
0
 /// <summary>
 /// Új csúcs felvétele
 /// </summary>
 /// <param name="location">A csúcs pozíciója a képernyőn</param>
 public void AddNode(Point location)
 {
     _SelectedArc  = null;
     _SelectedNode = new GraphNode(_NextNumber, location); // rögtön az új csúcs lesz kiválasztva
     _Adj.Add(_SelectedNode, new List <GraphArc>());       // felvesszük az új csúcsot az éllistába
     _NextNumber++;
 }
Пример #4
0
 /// <summary>
 /// Új, üres gráf létrehozása
 /// </summary>
 public Graph()
 {
     // üres gráf esetén mindent kiürítünk
     _Adj          = new Dictionary <GraphNode, List <GraphArc> >();
     _NextNumber   = 1; // az első szám az 1-es lesz
     _SelectedNode = null;
     _SelectedArc  = null;
 }
Пример #5
0
 /// <summary>
 /// Kiválasztott él törlése
 /// </summary>
 public void RemoveArc()
 {
     if (_SelectedArc != null)
     {
         _Adj[_SelectedArc.Source].Remove(_SelectedArc);
         _SelectedArc = null;
     }
 }
Пример #6
0
 /// <summary>
 /// Él kiválasztása
 /// </summary>
 /// <param name="location">Az él pozíciója a képernyőn</param>
 public void SelectArc(Point location)
 {
     _SelectedNode = null;
     _SelectedArc  = null;
     foreach (GraphNode node in _Adj.Keys)
     {
         foreach (GraphArc arc in _Adj[node])
         {
             if (arc.Near(location))
             {
                 _SelectedArc  = arc; // ha van él az adott pozíció környékén, akkor felvesszük
                 _PreviousNode = null;
             }
         }
     }
 }
Пример #7
0
 /// <summary>
 /// Csúcs kiválasztása
 /// </summary>
 /// <param name="location">A csúcs pozíciója a képernyőn</param>
 public void SelectNode(Point location)
 {
     //letároljuk az előző Nodeot
     _PreviousNode = _SelectedNode;
     // minden új kiválasztásnál töröljük az eddigi kiválasztásokat
     _SelectedNode = null;
     _SelectedArc  = null;
     // megkeressük, hogy van-e csúcs a megadott pozíció környékén
     foreach (GraphNode node in _Adj.Keys)
     {
         if (node.Near(location))
         {
             _SelectedNode = node; // ha van, akkor megjelöljük
         }
     }
     if (_SelectedNode == null || _SelectedNode == _PreviousNode) //ha nem sikerült másik csúcsot találni, akkor az előző nodeot sincs értelme tárolni.
     {
         _PreviousNode = null;
     }
 }
Пример #8
0
        /// <summary>
        /// Új csúcs felvétele
        /// </summary>
        /// <param name="number">A csúcs sorszáma</param>
        /// <param name="location">A csúcs pozíciója a képernyőn</param>
        public void AddNode(Int32 number, Point location)
        {
            // előbb megkeressük, hogy olyan sorszámú csúcs létezik-e már
            Boolean contains = false;

            foreach (GraphNode node in _Adj.Keys)
            {
                if (node.Number == number)
                {
                    contains = true;
                }
            }
            // ha nem létezik, csak akkor vesszük fel
            if (!contains)
            {
                _SelectedArc  = null;
                _SelectedNode = new GraphNode(number, location);
                _Adj.Add(_SelectedNode, new List <GraphArc>());
                _NextNumber = number + 1;
            }
        }
Пример #9
0
 /// <summary>
 /// Él felvétele
 /// </summary>
 /// <param name="fromKey">Kiinduló csúcs</param>
 /// <param name="toKey">Cél csúcs</param>
 /// <param name="weight">Él súlya</param>
 public void AddArc(GraphNode fromKey, GraphNode toKey, Int32 weight)
 {
     if (fromKey != null && toKey != null)
     {
         Boolean containsArc = false;
         // előbb ellenőrizzük, hogy nincs-e már él a két csúcs között ezzel az irányítással
         for (Int32 i = 0; i < _Adj[fromKey].Count && !containsArc; i++)
         {
             if (_Adj[fromKey][i].Target == toKey)
             {
                 containsArc = true;
             }
         }
         // ha nincs, akkor felvesszük
         if (!containsArc)
         {
             _SelectedNode = null;
             _PreviousNode = null;
             _SelectedArc  = new GraphArc(fromKey, toKey, weight); // létrehozzuk az élet
             _Adj[fromKey].Add(_SelectedArc);                      // felvesszük a megfelelő listába
         }
     }
 }