public Grafo grafoMatriz() { Grafo grafo = new Grafo(this, true); Arista arista; int id; id = 0; arista = this.buscaArista(); foreach (Nodo nodo in grafo) { foreach (Nodo nodo2 in grafo) { id++; arista = new Arista(0, MetodosAuxiliares.PuntoInterseccion(nodo.Pc, nodo2.Pc, nodo.TamNodo / 2), MetodosAuxiliares.PuntoInterseccion(nodo2.Pc, nodo.Pc, nodo.TamNodo / 2), arista.AnchoLinea, arista.ColorLinea, nodo2, id); nodo.Aristas.Add(arista); } } string origen, destino; foreach (Nodo nodo in grafo) { origen = nodo.Nombre; foreach (Arista arista2 in nodo.Aristas) { destino = arista2.Arriba.Nombre; arista2.Peso = relacion(origen, destino); } } return(grafo); }
public override void CreaWn(Size s, int n, ref int num, int tam, int tamL, SolidBrush brushRelleno, SolidBrush brushName, Pen penNodo, Pen penArista, string fuente) { Arista a; Nodo fin; Point pc; Point pe; pc = new Point(s.Width / 2, s.Height / 2 + 12); pe = new Point((pc.X - (tam / 2)), (pc.Y - (tam / 2))); this.CreaCn(s, n, ref num, tam, tamL, brushRelleno, brushName, penNodo, penArista, fuente); fin = new Nodo(num.ToString(), pe, pc, penNodo.Color, brushRelleno.Color, brushName.Color, tam, tamL, (int)penNodo.Width, fuente); foreach (Nodo busca in this) { a = new Arista(0, MetodosAuxiliares.PuntoInterseccion(busca.Pc, fin.Pc, tam / 2), MetodosAuxiliares.PuntoInterseccion(fin.Pc, busca.Pc, tam / 2), (int)penArista.Width, penArista.Color, fin, 0); busca.Aristas.Add(a); a = new Arista(0, MetodosAuxiliares.PuntoInterseccion(fin.Pc, busca.Pc, tam / 2), MetodosAuxiliares.PuntoInterseccion(busca.Pc, fin.Pc, tam / 2), (int)penArista.Width, penArista.Color, busca, 0); fin.Aristas.Add(a); } this.Add(fin); }
public override void borraNodoKuratowski(Nodo nodo) { Arista arista; List <Nodo> relaciones; relaciones = new List <Nodo>(); arista = base.buscaArista(); foreach (Arista aristaI in nodo.Aristas) { relaciones.Add(aristaI.Arriba); } this.Remove(nodo); foreach (Nodo nodo1 in relaciones) { foreach (Nodo nodo2 in relaciones) { if (!nodo1.Equals(nodo2)) { arista = new Arista(0, MetodosAuxiliares.PuntoInterseccion(nodo1.Pc, nodo2.Pc, nodo1.TamNodo / 2), MetodosAuxiliares.PuntoInterseccion(nodo2.Pc, nodo1.Pc, nodo1.TamNodo / 2), arista.AnchoLinea, arista.ColorLinea, nodo2, 0); nodo1.Aristas.Add(arista); arista = new Arista(0, MetodosAuxiliares.PuntoInterseccion(nodo2.Pc, nodo1.Pc, nodo1.TamNodo / 2), MetodosAuxiliares.PuntoInterseccion(nodo1.Pc, nodo2.Pc, nodo1.TamNodo / 2), arista.AnchoLinea, arista.ColorLinea, nodo1, 0); nodo2.Aristas.Add(arista); } } } }
public override void CreaCn(Size s, int n, ref int num, int tam, int tamL, SolidBrush brushRelleno, SolidBrush brushName, Pen penNodo, Pen penArista, string fuente) { int ancho; double grados, x, y, contG; Nodo nodo; Nodo anterior; Arista arista; Point p1, pc, pe; ancho = ((s.Height - 50) / 2) - 50; grados = ((360 / (double)n) * Math.PI) / 180; contG = 0; p1 = new Point(s.Width / 2, (s.Height / 2) + 12); pc = p1; pe = new Point(); anterior = null; for (int i = 0; i < n; i++) { x = Math.Round(ancho * Math.Sin(contG)); y = Math.Round(ancho * Math.Cos(contG)); pc.X += (int)x; pc.Y -= (int)y; contG += grados; pe.X = pc.X - (tam / 2); pe.Y = pc.Y - (tam / 2); nodo = new Nodo(num.ToString(), pe, pc, penNodo.Color, brushRelleno.Color, brushName.Color, tam, tamL, (int)penNodo.Width, fuente); if (i > 0) { arista = new Arista(0, MetodosAuxiliares.PuntoInterseccion(nodo.Pc, anterior.Pc, tam / 2), MetodosAuxiliares.PuntoInterseccion(anterior.Pc, nodo.Pc, tam / 2), (int)penArista.Width, penArista.Color, anterior, 0); nodo.Aristas.Add(arista); arista = new Arista(0, MetodosAuxiliares.PuntoInterseccion(anterior.Pc, nodo.Pc, tam / 2), MetodosAuxiliares.PuntoInterseccion(nodo.Pc, anterior.Pc, tam / 2), (int)penArista.Width, penArista.Color, nodo, 0); anterior.Aristas.Add(arista); } this.Add(nodo); anterior = nodo; pc = p1; num++; } arista = new Arista(0, MetodosAuxiliares.PuntoInterseccion(this[0].Pc, anterior.Pc, tam / 2), MetodosAuxiliares.PuntoInterseccion(anterior.Pc, this[0].Pc, tam / 2), (int)penArista.Width, penArista.Color, anterior, 0); this[0].Aristas.Add(arista); arista = new Arista(0, MetodosAuxiliares.PuntoInterseccion(anterior.Pc, this[0].Pc, tam / 2), MetodosAuxiliares.PuntoInterseccion(this[0].Pc, anterior.Pc, tam / 2), (int)penArista.Width, penArista.Color, this[0], 0); anterior.Aristas.Add(arista); }
public Arista buscaArista(string origen, string destino) { this.nodo = this.BuscaNodo(origen); foreach (Arista arista in nodo.Aristas) { if (arista.Arriba.Nombre.Equals(destino)) { this.arista = arista; break; } } return(this.arista); }
/** * Metodo que se realiza para buscar el un nodo que contenga almenos * una arista, mediante un ciclo for-each va recorriendo la * lista de nodos contenida en este grafo, al detectar que el * Count de la lista de nodosR sea mayor a 0 obtiene el primer * elemento de esa lista modifica la bandera en true * @param ref Arista Este nodo al encontrar que el count de la lista de * Arista se iguala al primer elemento de dicha lista para * poder ser referenciado y ser utilizado mas adelante * @return bool Bandera que indica si se encontro almenos una arista dentro * del grafo */ public bool buscaArista(ref Arista arista) { bool band = false; foreach (Nodo busca in this) { if (busca.Aristas.Count > 0) { arista = busca.Aristas[0]; band = true; } } return(band); }
private static bool aristaEnLista(Arista arista, List <Arista> aristas) { bool existe; existe = false; foreach (Arista busca in aristas) { if (busca.Equals(arista)) { existe = true; break; } } return(existe); }
public Arista buscaArista() { Arista arista; arista = null; foreach (Nodo busca in this) { if (busca.Aristas.Count > 0) { arista = busca.Aristas[0]; break; } } return(arista); }
public GrafoDirigido(Grafo g, bool p) { Nodo nodo; Arista arista; foreach (Nodo n in g) { nodo = new Nodo(n.Nombre, n.Pe, n.Pc, n.ColorFuera, n.BrushRelleno, n.BrushName, n.TamNodo, n.TamLetra, n.AnchoContorno, n.Fuente); foreach (Arista a in n.Aristas) { arista = new Arista(a.Peso, a.P1, a.P2, a.AnchoLinea, a.ColorLinea, a.Arriba, a.Id); nodo.Aristas.Add(arista); } this.Add(nodo); } this.Ponderado = g.Ponderado; this.tipo = g.Tipo; }
public void InsertaArista(Point p1, Point p2, int peso, int AnchoLinea, Color colorLinea, int id) { Nodo np1, np2; Point pi1, pi2; np1 = BuscaNodo(p1); if (np1 != null) { np2 = BuscaNodo(p2); if (np2 != null) { pi1 = MetodosAuxiliares.PuntoInterseccion(p1, p2, this[0].TamNodo / 2); pi2 = MetodosAuxiliares.PuntoInterseccion(p2, p1, this[0].TamNodo / 2); arista = new Arista(peso, pi1, pi2, AnchoLinea, colorLinea, np2, id); np1.Aristas.Add(arista); } } this.actualizaId(); }
public override bool AddKuratoswki(Nodo nodo, Point p) { double m, b, y; double xp, yp, xn, yn, xarista, yarista; xp = p.X; yp = p.Y; int sensibilidad = 3; Arista arista2; foreach (Nodo n in this) { foreach (Arista arista in n.Aristas) { xn = n.Pc.X; yn = n.Pc.Y; xarista = arista.Arriba.Pc.X; yarista = arista.Arriba.Pc.Y; if (n.Equals(arista.Arriba)) { return(false); } if ((xarista - xn) == 0) { if ((yp < yn && yp > yarista) || (yp > yn && yp < yarista)) { if ((xp < xarista + sensibilidad && xp > xn - sensibilidad) || (xp > xarista - sensibilidad && xp < xn + sensibilidad)) { foreach (Arista busca in arista.Arriba.Aristas) { if (busca.Arriba.Equals(n)) { arista2 = new Arista(0, MetodosAuxiliares.PuntoInterseccion(nodo.Pc, arista.Arriba.Pc, nodo.TamNodo / 2), MetodosAuxiliares.PuntoInterseccion(arista.Arriba.Pc, nodo.Pc, nodo.TamNodo / 2), arista.AnchoLinea, arista.ColorLinea, arista.Arriba, 0); nodo.Aristas.Add(arista2); arista2 = new Arista(0, MetodosAuxiliares.PuntoInterseccion(arista.Arriba.Pc, nodo.Pc, nodo.TamNodo / 2), MetodosAuxiliares.PuntoInterseccion(nodo.Pc, arista.Arriba.Pc, nodo.TamNodo / 2), arista.AnchoLinea, arista.ColorLinea, nodo, 0); arista.Arriba.Aristas.Add(arista2); arista.Arriba.Aristas.Remove(busca); break; } } arista2 = new Arista(0, MetodosAuxiliares.PuntoInterseccion(nodo.Pc, n.Pc, nodo.TamNodo / 2), MetodosAuxiliares.PuntoInterseccion(n.Pc, nodo.Pc, nodo.TamNodo / 2), arista.AnchoLinea, arista.ColorLinea, n, 0); nodo.Aristas.Add(arista2); arista2 = new Arista(0, MetodosAuxiliares.PuntoInterseccion(n.Pc, nodo.Pc, nodo.TamNodo / 2), MetodosAuxiliares.PuntoInterseccion(nodo.Pc, n.Pc, nodo.TamNodo / 2), arista.AnchoLinea, arista.ColorLinea, nodo, 0); arista.Arriba.Aristas.Add(arista2); n.Aristas.Remove(arista); this.Add(nodo); return(true); } } } m = (yarista - yn) / (xarista - xn); b = yn - (m * xn); y = m * xp + b; if (yp >= y - sensibilidad && yp <= y + sensibilidad) { if ((xp < xarista + sensibilidad && xp > xn - sensibilidad) || (xp > xarista - sensibilidad && xp < xn + sensibilidad)) { foreach (Arista busca in arista.Arriba.Aristas) { if (busca.Arriba.Equals(n)) { arista2 = new Arista(0, MetodosAuxiliares.PuntoInterseccion(nodo.Pc, arista.Arriba.Pc, nodo.TamNodo / 2), MetodosAuxiliares.PuntoInterseccion(arista.Arriba.Pc, nodo.Pc, nodo.TamNodo / 2), arista.AnchoLinea, arista.ColorLinea, arista.Arriba, 0); nodo.Aristas.Add(arista2); arista2 = new Arista(0, MetodosAuxiliares.PuntoInterseccion(arista.Arriba.Pc, nodo.Pc, nodo.TamNodo / 2), MetodosAuxiliares.PuntoInterseccion(nodo.Pc, arista.Arriba.Pc, nodo.TamNodo / 2), arista.AnchoLinea, arista.ColorLinea, nodo, 0); arista.Arriba.Aristas.Add(arista2); arista.Arriba.Aristas.Remove(busca); break; } } arista2 = new Arista(0, MetodosAuxiliares.PuntoInterseccion(nodo.Pc, n.Pc, nodo.TamNodo / 2), MetodosAuxiliares.PuntoInterseccion(n.Pc, nodo.Pc, nodo.TamNodo / 2), arista.AnchoLinea, arista.ColorLinea, n, 0); nodo.Aristas.Add(arista2); arista2 = new Arista(0, MetodosAuxiliares.PuntoInterseccion(n.Pc, nodo.Pc, nodo.TamNodo / 2), MetodosAuxiliares.PuntoInterseccion(nodo.Pc, n.Pc, nodo.TamNodo / 2), arista.AnchoLinea, arista.ColorLinea, nodo, 0); n.Aristas.Add(arista2); n.Aristas.Remove(arista); this.Add(nodo); return(true); } } } } return(false); }
public void complemento(Color color, int ancho) { Arista aux; List <Nodo> complementos = new List <Nodo>(); Point pi1, pi2; Nodo n; bool band = false; int id; id = 0; foreach (Nodo busca in this) { if (busca.Aristas.Count > 0) { foreach (Nodo buscando in this) { band = false; foreach (Arista encuentra in busca.Aristas) { if (buscando.Equals(encuentra.Arriba)) { band = true; break; } } if (!band) { n = buscando; complementos.Add(n); } } busca.Aristas.Clear(); foreach (Nodo buscando in complementos) { if (!busca.Equals(buscando)) { pi1 = MetodosAuxiliares.PuntoInterseccion(busca.Pc, buscando.Pc, this[0].TamNodo / 2); pi2 = MetodosAuxiliares.PuntoInterseccion(buscando.Pc, busca.Pc, this[0].TamNodo / 2); id++; aux = new Arista(0, pi1, pi2, ancho, color, buscando, id); busca.Aristas.Add(aux); } } complementos.Clear(); } else { foreach (Nodo buscando in this) { if (!busca.Equals(buscando)) { pi1 = MetodosAuxiliares.PuntoInterseccion(busca.Pc, buscando.Pc, this[0].TamNodo / 2); pi2 = MetodosAuxiliares.PuntoInterseccion(buscando.Pc, busca.Pc, this[0].TamNodo / 2); id++; aux = new Arista(0, pi1, pi2, ancho, color, buscando, id); busca.Aristas.Add(aux); } } } } }
/** * Este metodo borra todo el contenido de la lista del grafo dejandolo como nuevo. */ public void borraGrafo() { this.nodo = null; this.arista = null; this.Clear(); }