Пример #1
0
        private Arco BuscaRelacion(MouseEventArgs e)
        {
            Arco         auxAri = null;
            GraphicsPath path   = new GraphicsPath();

            foreach (Nodo n in grafo.Nodos)
            {
                foreach (Arco ari in n.Relaciones)
                {
                    path = new GraphicsPath();
                    if (ari.Origen != ari.Destino)
                    {
                        path.AddLine(BuscaNodoInt(ari.Origen).Centro, BuscaNodoInt(ari.Destino).Centro);
                    }
                    else
                    {
                        path.AddArc(BuscaNodoInt(ari.Origen).Coordenadas.X - 50 / 6, BuscaNodoInt(ari.Origen).Coordenadas.Y - 50 / 6,
                                    50 / 2, 50 / 2, 100, 250);
                    }
                    if (path.IsOutlineVisible(new Point(e.X, e.Y), LineaRelaciones))
                    {
                        auxAri = ari;
                        break;
                    }
                }
            }
            return(auxAri);
        }
Пример #2
0
        private void cargaGrafo()
        {
            string[]       CadenaInformacion;
            OpenFileDialog VentanaAbrir = new OpenFileDialog();

            VentanaAbrir.Filter = "Grafo (*.gfo)|*.gfo";
            if (VentanaAbrir.ShowDialog() == DialogResult.OK)
            {
                using (StreamReader Lector = new StreamReader(VentanaAbrir.FileName))
                {
                    while (!Lector.EndOfStream)
                    {
                        string Aux = Lector.ReadLine();
                        CadenaInformacion = Aux.Split('/');
                        if (Aux[0] == 'N')
                        {
                            Nodo NuevoNodo = new Nodo();
                            NuevoNodo.Identificador = Convert.ToInt32(CadenaInformacion[1]);
                            NuevoNodo.AsignarCoordenadas(Convert.ToInt32(CadenaInformacion[2]), Convert.ToInt32(CadenaInformacion[3]));
                            grafo.Nodos.Add(NuevoNodo);
                        }
                        else if (Aux[0] == 'R')
                        {
                            Nodo AuxNodo  = BuscaNodoInt(Convert.ToInt32(CadenaInformacion[1]));
                            Arco Relacion = new Arco();
                            AuxNodo.AñadirRelacion(Convert.ToInt32(CadenaInformacion[2]), Convert.ToInt32(CadenaInformacion[3]));
                        }
                    }
                    Form2_Paint(this, null);
                }
            }
        }
Пример #3
0
        public void KruskalMST(Grafo g)
        {
            Grafo       Aux   = new Grafo();
            List <Arco> Arcos = new List <Arco>();
            List <Arco> RelacionesArbolKruskal = new List <Arco>();

            foreach (Nodo n in g.Nodos)
            {
                foreach (Arco r in n.Relaciones)
                {
                    Arcos.Add(r);
                }
            }
            Arcos = Arcos.OrderBy(x => x.Peso).ToList();
            string CadAux = "Relaciones Ordenadas por el peso\n";

            for (int i = 0; i < g.Nodos.Count; i++)
            {
                bool Ciclo         = false;
                Arco RelacionMenor = BuscaRelacionMenorKruskal(Arcos);
                for (int j = 0; j < Aux.Nodos.Count; j++)
                {
                    if (GrafoContieneCiclo(j, j, Aux.GeneraMatrizAdyacencia(), Aux.Nodos.Count))
                    {
                        Ciclo = true;
                        break;
                    }
                }
                if (!Ciclo)
                {
                    if (!ConfirmaExistenciaNodosEnKruskal(Aux, RelacionMenor.Origen))
                    {
                        Nodo Nuevo = new Nodo();
                        Nuevo.Identificador = RelacionMenor.Origen;
                        Aux.AgregarNodo(Nuevo);
                    }
                    else if (!ConfirmaExistenciaNodosEnKruskal(Aux, RelacionMenor.Destino))
                    {
                        Nodo Nuevo = new Nodo();
                        Nuevo.Identificador = RelacionMenor.Destino;
                        Aux.AgregarNodo(Nuevo);
                    }
                    int IndiceNodoCrearRelacion   = ObtenIndiceNodo(Aux, RelacionMenor.Origen);
                    int IndiceNodoRelacionDestino = ObtenIndiceNodo(Aux, RelacionMenor.Destino);
                    if (IndiceNodoCrearRelacion != -1)
                    {
                        if (Aux.Nodos[IndiceNodoCrearRelacion].TieneRelacion(0))
                        {
                        }
                        Aux.Nodos[IndiceNodoCrearRelacion].AñadirRelacion(RelacionMenor.Destino, RelacionMenor.Peso);
                    }
                }
            }

            /*foreach(Arco a in Arcos)
             * {
             *  CadAux += "Origen: " + a.Origen + " , Destino: " + a.Destino + " , Peso: " + a.Peso + "\n";
             * }*/
            MessageBox.Show(CadAux);
        }
Пример #4
0
        public void AñadirRelacion(int NumeroNodo, int Peso)
        {
            Arco Aux = new Arco();

            Aux.Origen  = Identificador;
            Aux.Destino = NumeroNodo;
            Aux.Peso    = Peso;
            Relaciones.Add(Aux);
        }
Пример #5
0
        private Arco BuscaRelacionNodo(Nodo n, int Destino)
        {
            Arco RelacionAux = null;

            foreach (Arco a in n.Relaciones)
            {
                if (a.Destino == Destino)
                {
                    RelacionAux = a;
                }
            }
            return(RelacionAux);
        }
Пример #6
0
        public List <Arco> GeneraListaRelacionesPrim(List <List <int> > Caminos)
        {
            List <Arco> AuxPrim = new List <Arco>();

            for (int i = 0; i < Caminos[IdentificadorCamino].Count - 1; i += 2)
            {
                Arco Arc = new Arco();
                Arc.Origen  = Caminos[IdentificadorCamino][i];
                Arc.Destino = Caminos[IdentificadorCamino][i + 1];
                AuxPrim.Add(Arc);
            }
            return(AuxPrim);
        }
Пример #7
0
        public List <Arco> GeneraListaRelacionesCamino(List <List <int> > Caminos)
        {
            List <Arco> AuxCaminos = new List <Arco>();

            for (int j = 0; j < Caminos[IdentificadorCamino].Count - 1; j++)
            {
                Arco arc = new Arco();
                arc.Origen  = Caminos[IdentificadorCamino][j];
                arc.Destino = Caminos[IdentificadorCamino][j + 1];
                AuxCaminos.Add(arc);
            }
            return(AuxCaminos);
        }
Пример #8
0
        public List <Arco> GeneraRelacionesUnCamino(List <int> Camino, Grafo G)
        {
            List <Arco> AuxCaminos = new List <Arco>();

            for (int j = 0; j < Camino.Count - 1; j++)
            {
                /*Arco arc = new Arco();
                 * arc.Origen = Camino[j];
                 * arc.Destino = Camino[j + 1];*/
                Arco Relacion = G.BuscaRelacion(Camino[j], Camino[j + 1]);
                if (Relacion != null)
                {
                    AuxCaminos.Add(Relacion);
                }
            }
            return(AuxCaminos);
        }
Пример #9
0
        public Arco BuscaRelacion(int Origen, int Destino)
        {
            Arco Relacion = null;

            foreach (Nodo n in Nodos)
            {
                if (n.Identificador == Origen)
                {
                    foreach (Arco r in n.Relaciones)
                    {
                        if (r.Destino == Destino)
                        {
                            Relacion = r;
                            break;
                        }
                    }
                }
            }
            return(Relacion);
        }
Пример #10
0
        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            switch (TipoOperacion)
            {
            case -1:

                NodoMovimiento = BuscaNodo(e);
                if (NodoMovimiento != null)
                {
                    M = true;
                }
                break;

            case 0:
                Identificador++;
                Nodo Aux = new Nodo();
                Aux.AsignarCoordenadas(e.X, e.Y);
                Aux.Identificador = Identificador;
                grafo.AgregarNodo(Aux);
                Form1_Paint(this, null);
                break;

            case 1:
                Nodo aux = BuscaNodo(e);
                if (aux != null)
                {
                    if (MessageBox.Show("Estas seguro de eliminar el nodo : " + aux.Identificador + " ?", "Eliminar nodo", MessageBoxButtons.YesNo) == DialogResult.Yes)
                    {
                        grafo.EliminarNodo(aux);
                        Form1_Paint(this, null);
                        Identificador--;
                    }
                }
                break;

            case 2:     // Agregar Relación
                NodoInicio = BuscaNodo(e);
                if (NodoInicio != null)
                {
                    R = true;
                }
                break;

            case 3:     // Mover Nodo
                NodoMovimiento = BuscaNodo(e);
                M = true;
                break;

            case 4:
                Arco Relacion = BuscaRelacion(e);
                if (Relacion != null)
                {
                    if (grafo.Dirigido == true)
                    {
                        grafo.EliminaRelacion(BuscaNodoInt(Relacion.Origen), BuscaNodoInt(Relacion.Destino));
                    }
                    else
                    {
                        if (Relacion.Origen != Relacion.Destino)
                        {
                            grafo.EliminaRelacion(BuscaNodoInt(Relacion.Origen), BuscaNodoInt(Relacion.Destino));
                            Arco RelAux = BuscaRelacionNodo(BuscaNodoInt(Relacion.Destino), Relacion.Origen);
                            grafo.EliminaRelacion(BuscaNodoInt(RelAux.Origen), BuscaNodoInt(RelAux.Destino));
                        }
                        else
                        {
                            grafo.EliminaRelacion(BuscaNodoInt(Relacion.Origen), BuscaNodoInt(Relacion.Destino));
                        }
                    }
                    Form1_Paint(this, null);
                }
                break;

            case 5:
                Arco RelacionPeso = BuscaRelacion(e);
                if (RelacionPeso != null)
                {
                    int Peso = Convert.ToInt32(Interaction.InputBox("Ingresa el nuevo peso de la relación: " + RelacionPeso.Origen + " - " + RelacionPeso.Destino));
                    if (grafo.Dirigido == true)
                    {
                        RelacionPeso.Peso = Peso;
                    }
                    else
                    {
                        Arco RelacionAuxiliarPeso = BuscaRelacionNodo(BuscaNodoInt(RelacionPeso.Destino), RelacionPeso.Origen);
                        RelacionPeso.Peso         = Peso;
                        RelacionAuxiliarPeso.Peso = Peso;
                    }
                }
                break;

            case 6:
                Nodo NodoAux = BuscaNodo(e);
                if (NodoAux != null)
                {
                    MessageBox.Show("El grado de salida del nodo es: " + NodoAux.ObtenGradoNodo().ToString() + "\n" + "El grado de entrada del nodo es: " + grafo.ObtenGradoEntradaNodo(NodoAux));
                }
                break;

            case 7:
                if (!banderaCamino)
                {
                    if (BuscaNodo(e) != null)
                    {
                        NodoCamino1 = BuscaNodo(e).Identificador;
                        LB_NodosSeleccionados.Text = "Nodo Seleccionado:\n" + NodoCamino1;
                        banderaCamino = true;
                        break;
                    }
                }
                if (banderaCamino)
                {
                    if (BuscaNodo(e) != null)
                    {
                        NodoCamino2   = BuscaNodo(e).Identificador;
                        banderaCamino = false;
                        LB_NodosSeleccionados.Text = "Nodos Seleccionados:\n\t\t" + "{" + NodoCamino1 + " , " + NodoCamino2 + "}";
                        TipoOperacion = -1;
                        break;
                    }
                }
                break;
            }
        }
Пример #11
0
        public void DibujaNodos()
        {
            double tg, atg;
            int    a, b, x, y;
            Point  p, p2;
            Pen    PlumaFlecha = new Pen(Color.Black, 4);

            PlumaFlecha.StartCap = LineCap.RoundAnchor;
            PlumaFlecha.EndCap   = LineCap.ArrowAnchor;
            List <Arco> AuxCaminos = new List <Arco>();

            if (banderaCamino && Caminos.Count != 0 && IdentificadorCamino != -1)
            {
                for (int j = 0; j < Caminos[IdentificadorCamino].Count - 1; j++)
                {
                    Arco arc = new Arco();
                    arc.Origen  = Caminos[IdentificadorCamino][j];
                    arc.Destino = Caminos[IdentificadorCamino][j + 1];
                    AuxCaminos.Add(arc);
                }
            }
            foreach (Nodo nodo in grafo.Nodos)
            {
                Point      PuntoMedioRecta    = new Point();
                String     numero             = Convert.ToString(nodo.Identificador);
                Font       Fuente             = new Font("Comic Sans", 16);
                Font       FuentePesos        = new Font("Arial", 12);
                SolidBrush ColorNumero        = new SolidBrush(Color.Red);
                SolidBrush ColorPeso          = new SolidBrush(Color.Blue);
                SolidBrush ColorNodo          = new SolidBrush(Color.DarkGray);
                Rectangle  RectanguloAuxiliar = new Rectangle(nodo.Coordenadas.X, nodo.Coordenadas.Y, 50, 50);
                Graficos.DrawEllipse(LineaNodo, RectanguloAuxiliar);
                Graficos.FillEllipse(ColorNodo, RectanguloAuxiliar);
                if (nodo.Identificador < 10)
                {
                    Graficos.DrawString(numero, Fuente, ColorNumero, nodo.Coordenadas.X + 14, nodo.Coordenadas.Y + 14);
                }
                else
                {
                    Graficos.DrawString(numero, Fuente, ColorNumero, nodo.Coordenadas.X + 9, nodo.Coordenadas.Y + 14);
                }

                foreach (Arco r in nodo.Relaciones)
                {
                    Nodo aux = BuscaNodoInt(r.Destino);
                    if (aux != null)
                    {
                        tg  = (double)(BuscaNodoInt(r.Origen).Centro.Y - BuscaNodoInt(r.Destino).Centro.Y) / (BuscaNodoInt(r.Destino).Centro.X - BuscaNodoInt(r.Origen).Centro.X);
                        atg = Math.Atan(tg);
                        a   = (int)((50 * .53) * Math.Cos(atg));
                        b   = (int)((50 * .53) * Math.Sin(atg));
                        if (BuscaNodoInt(r.Origen).Centro.X < BuscaNodoInt(r.Destino).Centro.X)
                        {
                            a *= -1;
                            b *= -1;
                        }
                        p  = new Point(BuscaNodoInt(r.Destino).Centro.X + a, BuscaNodoInt(r.Destino).Centro.Y - b);
                        p2 = new Point(BuscaNodoInt(r.Origen).Centro.X - a, BuscaNodoInt(r.Origen).Centro.Y + b);

                        if (grafo.Dirigido == false)
                        {
                            if (aux.Identificador != r.Origen)
                            {
                                Graficos.DrawLine(LineaRelaciones, p2, p);
                                PuntoMedioRecta.X = (nodo.Centro.X + aux.Centro.X) / 2;
                                PuntoMedioRecta.Y = (nodo.Centro.Y + aux.Centro.Y) / 2;
                                Graficos.DrawString(r.Peso.ToString(), FuentePesos, ColorPeso, PuntoMedioRecta);
                            }
                            else
                            {
                                Graficos.DrawArc(LineaRelaciones, aux.Coordenadas.X - 50 / 6, aux.Coordenadas.Y - 50 / 6,
                                                 50 / 2, 50 / 2, 100, 250);
                                Graficos.DrawString(r.Peso.ToString(), FuentePesos, ColorPeso, aux.Centro.X - 30, aux.Centro.Y - 32);
                            }
                        }
                        else
                        {
                            if (aux.Identificador != r.Origen)
                            {
                                Graficos.DrawLine(PlumaFlecha, p2, p);
                                PuntoMedioRecta.X = (nodo.Centro.X + aux.Centro.X) / 2;
                                PuntoMedioRecta.Y = (nodo.Centro.Y + aux.Centro.Y) / 2;
                                Graficos.DrawString(r.Peso.ToString(), FuentePesos, ColorPeso, PuntoMedioRecta);
                            }
                            else
                            {
                                Graficos.DrawArc(PlumaFlecha, aux.Coordenadas.X - 50 / 6, aux.Coordenadas.Y - 50 / 6,
                                                 65 / 2, 65 / 2, 100, 250);
                                Graficos.DrawString(r.Peso.ToString(), FuentePesos, ColorPeso, aux.Centro.X - 30, aux.Centro.Y - 32);
                            }
                        }
                    }
                }
            }
            if (banderaCamino)
            {
                //MessageBox.Show("DIBUJANDO ARCO");
                DibujaArco(ArcoADibujar);
                //DibujaCamino(GeneraListaRelacionesCamino(Caminos));
            }

            /*if (CaminoCompleto)
             * {
             *  DibujaCamino(GeneraListaRelacionesCamino(Caminos));
             * }*/
        }