示例#1
0
 public CArco(CVertice destino, int peso)
 {
     this.nDestino = destino;
     this.peso = peso;
     this.grosor_flecha = 2;
     this.color = Color.Red;
 }
示例#2
0
 public CLista(CLista pLista)
 {
     if (pLista != null)
     {
         aElemento = pLista.aElemento;
         aSubLista = pLista.aSubLista;
         aPeso = pLista.aPeso;
     }
 }
示例#3
0
 // Crea la arista a partir de los nodos de origen y de destino
 public bool AgregarArco(CVertice origen, CVertice nDestino, int peso = 1)
 {
     if (origen.ListaAdyacencia.Find(v => v.nDestino == nDestino) == null)
     {
         origen.ListaAdyacencia.Add(new CArco(nDestino, peso));
         return true;
     }
     return false;
 }
示例#4
0
        private Vertice ventanaVertice; // ventana para agregar los vértices

        #endregion Fields

        #region Constructors

        public Simulador()
        {
            InitializeComponent();
            this.StyleManager = SimuladorStyleManager;
            grafo = new CGrafo();
            nuevoNodo = null;
            var_control = 0;
            ventanaVertice = new Vertice();
            ventanaArco = new Arco();
            ventanaBuscarNodo = new BuscarNodo();

            this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true);
        }
示例#5
0
 private void Pizarra_MouseDown(object sender, MouseEventArgs e)
 {
     if (e.Button == System.Windows.Forms.MouseButtons.Left) // Si se ha presionado el botón
     // izquierdo del mouse
     {
         if ((NodoOrigen = grafo.DetectarPunto(e.Location)) != null)
         {
             var_control = 1; // recordemos que es usado para indicar el estado en la pizarra:
             // 0 -> sin accion, 1 -> Dibujando arco, 2 -> Nuevo vértice
         }
         if (nuevoNodo != null && NodoOrigen == null)
         {
             ventanaVertice.Visible = false;
             ventanaVertice.control = false;
             grafo.AgregarVertice(nuevoNodo);
             ventanaVertice.ShowDialog();
             if (ventanaVertice.control)
             {
                 if (grafo.BuscarVertice(ventanaVertice.txtVertice.Text) == null)
                 {
                     nuevoNodo.Valor = ventanaVertice.txtVertice.Text;
                 }
                 else
                 {
                     MetroMessageBox.Show(this, "El Nodo " + ventanaVertice.txtVertice.Text + " ya existe en el grafo ", "Error nuevo Nodo ", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                     grafo.EliminarVertice(nuevoNodo);
                 }
             }
             nuevoNodo = null;
             var_control = 0;
             Pizarra.Refresh();
         }
     }
     if (e.Button == System.Windows.Forms.MouseButtons.Right) // Si se ha presionado el botón
     // derecho del mouse
     {
         if (var_control == 0)
         {
             if ((NodoOrigen = grafo.DetectarPunto(e.Location)) != null)
             {
                 CMSCrearVertice.Text = "Nodo " + NodoOrigen.Valor;
             }
             else
                 Pizarra.ContextMenuStrip = this.CMSCrearVertice;
         }
     }
 }
示例#6
0
 public void Agregar(CVertice pElemento, int pPeso)
 {
     if (pElemento != null)
     {
         if (aElemento == null)
         {
             aElemento = new CVertice(pElemento.Valor);
             aPeso = pPeso;
             aSubLista = new CLista();
         }
         else
         {
             if (!ExisteElemento(pElemento))
                 aSubLista.Agregar(pElemento, pPeso);
         }
     }
 }
示例#7
0
 public CLista(CVertice pElemento, CLista pSubLista, int pPeso)
 {
     aElemento = pElemento;
     aSubLista = pSubLista;
     aPeso = pPeso;
 }
示例#8
0
        private void cargarNodosToolStripMenuItem_Click(object sender, EventArgs e)
        {
            VentanaCargar.InitialDirectory = "c:\\"; //Directorio inicial para el LoadDialog
            VentanaCargar.Filter = "txt Files (*.TXT)|*.TXT"; //Filtro de archivos
            VentanaCargar.FilterIndex = 2; //Indice del filtro
            VentanaCargar.RestoreDirectory = true; //Volver a abrir donde se cerro

            DialogResult result = VentanaCargar.ShowDialog(); //Mostrar la ventana para cargar
            if (result == DialogResult.OK) // Si fue satisfactorio
            {
                string file;
                file = VentanaCargar.FileName; //Guardamos la direccion del archivo
                StreamReader SR = new StreamReader(@file);
                string line;
                while ((line = SR.ReadLine()) != null)
                {
                    foreach (string nodos in line.Split(','))
                    {
                        if (var_control == 4)
                            break;
                        foreach (string puntos in nodos.Split('-'))
                        {
                            if (puntos.Contains(':'))
                            {
                                nuevoNodo = new CVertice(nodos.Split('-')[0]);
                                Point xy = new Point(int.Parse(puntos.Split(':')[0]), int.Parse(puntos.Split(':')[1]));
                                nuevoNodo.Posicion = xy;
                                if (grafo.BuscarVertice(nuevoNodo.Valor) == null)
                                    grafo.AgregarVertice(nuevoNodo);
                                else
                                {
                                    var_control = 4;
                                    break;
                                }
                                nuevoNodo = null;
                            }
                        }
                    }
                }
                if (var_control == 4)
                {
                    grafo.EliminarTodo();
                    MetroMessageBox.Show(this, "Error no se agrego ningun nodo por que se encontro repetido por lo menos 1", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                SR.Close();
                Pizarra.Refresh();
            }
        }
示例#9
0
 // Constructores
 public CLista()
 {
     aElemento = null;
     aSubLista = null;
     aPeso = 0;
 }
示例#10
0
 public int PosicionElemento(CVertice pElemento)
 {
     if ((aElemento != null) || (ExisteElemento(pElemento)))
         if (aElemento.Equals(pElemento))
             return 1;
         else
             return 1 + aSubLista.PosicionElemento(pElemento);
     else
         return 0;
 }
示例#11
0
 public bool ExisteElemento(CVertice pElemento)
 {
     if ((aElemento != null) && (pElemento != null))
     {
         return (aElemento.Equals(pElemento) ||
             (aSubLista.ExisteElemento(pElemento)));
     }
     else
         return false;
 }
示例#12
0
        private void RecorridoAnchura(CVertice nodo)
        {
            CVertice temp = new CVertice();
            nodo.Visitado = true;
            Queue<CVertice> cola = new Queue<CVertice>();
            cola.Enqueue(nodo);
            grafo.Colorear(nodo);
            Pizarra.Refresh();
            Thread.Sleep(tiempo);
            while (cola.Count != 0)
            {
                temp = cola.Dequeue();
                foreach (CArco arco in temp.ListaAdyacencia)
                {
                    if (arco.nDestino.Visitado == false)
                    {
                        cola.Enqueue(arco.nDestino);
                    }
                }
                foreach (CArco arco in temp.ListaAdyacencia)
                {
                    if (arco.nDestino.Visitado == false)
                    {
                        arco.nDestino.Visitado = true;
                        grafo.Colorear(arco.nDestino);
                        Pizarra.Refresh();
                        Thread.Sleep(tiempo);
                    }
                }

            }
        }
示例#13
0
 //Metodo para resaltar nodos del grafo
 public void Colorear(CVertice nodo)
 {
     nodo.Color = Color.AliceBlue;
     nodo.FontColor = Color.Black;
 }
示例#14
0
 private void nuevoVerticeToolStripMenuItem_Click(object sender, EventArgs e)
 {
     nuevoNodo = new CVertice();
     var_control = 2; // recordemos que es usado para indicar el estado en la pizarra: 0 ->
     // sin accion, 1 -> Dibujando arco, 2 -> Nuevo vértice
 }
示例#15
0
 //=====================Operaciones Básicas=================================
 //Construye un nodo a partir de su valor y lo agrega a la lista de nodos
 public CVertice AgregarVertice(string valor)
 {
     CVertice nodo = new CVertice(valor);
     nodos.Add(nodo);
     return nodo;
 }
示例#16
0
 //Elimina un nodo de la lista de nodos del grafo
 public void EliminarVertice(CVertice nodo)
 {
     nodos.Remove(nodo);
 }
示例#17
0
        private void cargarAristasToolStripMenuItem_Click(object sender, EventArgs e)
        {
            VentanaCargar.InitialDirectory = "c:\\"; //Directorio inicial para el LoadDialog
            VentanaCargar.Filter = "txt Files (*.TXT)|*.TXT"; //Filtro de archivos
            VentanaCargar.FilterIndex = 2; //Indice del filtro
            VentanaCargar.RestoreDirectory = true; //Volver a abrir donde se cerro

            DialogResult result = VentanaCargar.ShowDialog(); //Mostrar la ventana para cargar
            if (result == DialogResult.OK) // Si fue satisfactorio
            {
                string file;
                file = VentanaCargar.FileName; //Guardamos la direccion del archivo
                StreamReader SR = new StreamReader(@file);
                string line;
                while ((line = SR.ReadLine()) != null)
                {
                    foreach (string arcos in line.Split(','))
                    {
                        foreach (string nodos in arcos.Split(':'))
                        {
                            if (nodos.Contains('-'))
                            {
                                NodoOrigen = grafo.BuscarVertice(nodos.Split('-')[0]);
                                NodoDestino = grafo.BuscarVertice(nodos.Split('-')[1]);
                            }
                            else
                            {
                                int peso;
                                int.TryParse(nodos, out peso);
                                if (NodoOrigen != null && NodoDestino != null && peso > 0)
                                    grafo.AgregarArco(NodoOrigen, NodoDestino, peso);
                                NodoOrigen = null;
                                NodoDestino = null;
                            }
                        }
                    }
                }
                SR.Close();
                Pizarra.Refresh();
            }
        }
示例#18
0
 private void RecorridoProfundidad(CVertice nodo)
 {
     CVertice temp = new CVertice();
     Stack<CVertice> pila = new Stack<CVertice>();
     pila.Push(nodo);
     while (pila.Count != 0)
     {
         temp = pila.Pop();
         if (temp.Visitado == false)
         {
             temp.Visitado = true;
             grafo.Colorear(temp);
             Pizarra.Refresh();
             Thread.Sleep(tiempo);
             foreach (CArco arco in temp.ListaAdyacencia)
             {
                 pila.Push(arco.nDestino);
             }
         }
     }
 }
示例#19
0
 // Métodos
 public CArco(CVertice destino)
     : this(destino, 1)
 {
     this.nDestino = destino;
 }
示例#20
0
 public void Eliminar(CVertice pElemento)
 {
     if (aElemento != null)
     {
         if (aElemento.Equals(pElemento))
         {
             aElemento = aSubLista.aElemento;
             aSubLista = aSubLista.SubLista;
         }
         else
             aSubLista.Eliminar(pElemento);
     }
 }
示例#21
0
 //Agrega un nodo a la lista de nodos del grafo
 public void AgregarVertice(CVertice nuevonodo)
 {
     nodos.Add(nuevonodo);
 }
示例#22
0
 private void Pizarra_MouseUp(object sender, MouseEventArgs e)
 {
     switch (var_control)
     {
         case 1: // Dibujando arco
             ventanaArco.Visible = false;
             ventanaArco.control = false;
             if ((NodoDestino = grafo.DetectarPunto(e.Location)) != null && NodoOrigen != NodoDestino)
             {
                 ventanaArco.ShowDialog();
                 if (ventanaArco.control)
                 {
                     int distancia = int.Parse(ventanaArco.txtArco.Text);
                     grafo.AgregarArco(NodoOrigen, NodoDestino, distancia);
                 }
             }
             var_control = 0;
             NodoOrigen = null;
             NodoDestino = null;
             Pizarra.Refresh();
             break;
     }
 }