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); }
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); } } }
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); }
public void AñadirRelacion(int NumeroNodo, int Peso) { Arco Aux = new Arco(); Aux.Origen = Identificador; Aux.Destino = NumeroNodo; Aux.Peso = Peso; Relaciones.Add(Aux); }
private Arco BuscaRelacionNodo(Nodo n, int Destino) { Arco RelacionAux = null; foreach (Arco a in n.Relaciones) { if (a.Destino == Destino) { RelacionAux = a; } } return(RelacionAux); }
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); }
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); }
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); }
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); }
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; } }
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)); * }*/ }