/// <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 } } } } }
/// <summary> /// Gráf törlése /// </summary> public void Clear() { _Adj.Clear(); _NextNumber = 1; _SelectedNode = null; _SelectedArc = null; }
/// <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++; }
/// <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; }
/// <summary> /// Kiválasztott él törlése /// </summary> public void RemoveArc() { if (_SelectedArc != null) { _Adj[_SelectedArc.Source].Remove(_SelectedArc); _SelectedArc = null; } }
/// <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; } } } }
/// <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; } }
/// <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; } }
/// <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 } } }