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 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 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); }
/** * Este metodo se encarga de mover un nodo mediante ciclos anidados * para poder corregir el punto central y la direccion de las * aristas para que estas le sigan. * @param Nodo p Nodo que se desea mover */ public void MueveNodo(Nodo p) { Point pc; pc = new Point(0, 0); pc.X = p.Pc.X - (this[0].TamNodo / 2); pc.Y = p.Pc.Y - (this[0].TamNodo / 2); p.Pe = pc; List <Arista> l = new List <Arista>(); foreach (Nodo busca in this) { if (!p.Equals(busca)) { foreach (Arista buscando in busca.Aristas) { buscando.P1 = MetodosAuxiliares.PuntoInterseccion(busca.Pc, buscando.Arriba.Pc, this[0].TamNodo / 2); buscando.P2 = MetodosAuxiliares.PuntoInterseccion(buscando.Arriba.Pc, busca.Pc, this[0].TamNodo / 2); } } } foreach (Arista buscando in p.Aristas) { buscando.P1 = MetodosAuxiliares.PuntoInterseccion(p.Pc, buscando.Arriba.Pc, this[0].TamNodo / 2); buscando.P2 = MetodosAuxiliares.PuntoInterseccion(buscando.Arriba.Pc, p.Pc, this[0].TamNodo / 2); } }
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 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(); }
private void GrafoSecundario_Paint(object sender, PaintEventArgs e) { Graphics gAux = CreateGraphics(); gAux = Graphics.FromImage(bmp); gAux.Clear(this.BackColor); if (band) { Pen p = new Pen(Color.GreenYellow, penArista.Width + 1); switch (opcion) { case 2: //AristaNoDirigida pI1 = MetodosAuxiliares.PuntoInterseccion(p1, p2, tamNodo / 2); gAux.DrawLine(p, pI1, p2); break; case 7: //AristaDirigida p.CustomEndCap = new AdjustableArrowCap(5, 5); pI1 = MetodosAuxiliares.PuntoInterseccion(p1, p2, tamNodo / 2); gAux.DrawLine(p, pI1, p2); break; } } else { //BanderaFinal if (bandFinal) { switch (opcion) { case 1: // Nodo gAux.FillEllipse(this.brushRelleno, pe.X, pe.Y, tamNodo, tamNodo); gAux.DrawEllipse(this.penNodo, pe.X + (anchoLineaN / 2), pe.Y + (anchoLineaN / 2), tamNodo - (anchoLineaN / 2), tamNodo - (anchoLineaN / 2)); gAux.DrawString(this.nombre.ToString(), font, brushName, pe.X + (tamNodo / 2) - tamName, pe.Y + (tamNodo / 2) - tamName); numNodos++; this.nombre = ConvierteNombre(numNodos); if (bandNombre) { grafo.CambiaNombre(); gAux.Clear(BackColor); grafo.DibujaGrafo(gAux); bandNombre = false; } bandFinal = false; break; case 2: //AristaNoDirigida gAux.DrawLine(penArista, pI1, pI2); bandFinal = false; break; case 7: //AristaDirigida gAux.DrawLine(penArista, pI1, pI2); bandFinal = false; break; } } } grafo.DibujaGrafo(gAux); g.DrawImage(bmp, 0, 0); }
private void GrafoSecundario_MouseUp(object sender, MouseEventArgs e) { switch (opcion) { case 2: //AristaNoDirigida #region Arista no Dirigida if (grafo.BuscaNodo(ref p2) && bandArista && band) { if (!typeof(GrafoNoDirigido).IsInstanceOfType(grafo)) { grafo = new GrafoNoDirigido(grafo); this.habilitaOpcionesGrafoNoDirigido(); } if (!p1.Equals(p2)) { numAristas++; this.pI2 = MetodosAuxiliares.PuntoInterseccion(this.p2, this.p1, tamNodo / 2); this.grafo.InsertaArista(this.p1, this.p2, 0, this.anchoLineaA, this.penArista.Color, numAristas); this.grafo.InsertaArista(this.p2, this.p1, 0, this.anchoLineaA, this.penArista.Color, numAristas); band = false; bandFinal = true; bandArista = false; } else { numAristas++; this.pI2 = MetodosAuxiliares.PuntoInterseccion(this.p2, this.p1, tamNodo / 2); this.grafo.InsertaArista(this.p1, this.p2, 0, this.anchoLineaA, this.penArista.Color, numAristas); band = false; bandFinal = true; bandArista = false; } } else { bandFinal = false; band = false; } this.GrafoSecundario_Paint(this, null); #endregion break; case 4: //MueveNodo #region Mueve Nodo bandFinal = false; #endregion break; case 7: //AristaDirigida #region AristaDirigida if (grafo.BuscaNodo(ref p2) && bandArista && band) { if (!typeof(GrafoDirigido).IsInstanceOfType(grafo)) { grafo = new GrafoDirigido(grafo); this.habilitaOpcionesGrafoDirigido(); } if (!p1.Equals(p2)) { numAristas++; this.pI2 = MetodosAuxiliares.PuntoInterseccion(this.p2, this.p1, tamNodo / 2); this.grafo.InsertaArista(this.p1, this.p2, 0, this.anchoLineaA, this.penArista.Color, numAristas); band = false; bandFinal = true; bandArista = false; } else { numAristas++; this.pI2 = MetodosAuxiliares.PuntoInterseccion(this.p2, this.p1, tamNodo / 2); this.grafo.InsertaArista(this.p1, this.p2, 0, this.anchoLineaA, this.penArista.Color, numAristas); band = false; bandFinal = true; bandArista = false; bandFinal = false; band = false; } } else { bandFinal = false; band = false; } this.GrafoSecundario_Paint(this, null); #endregion break; } this.GrafoSecundario_Paint(this, null); }
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); } } } } }