Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
                    }
                }
            }
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
 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);
 }
Beispiel #6
0
        /**
         * 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);
        }
Beispiel #7
0
        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);
        }
Beispiel #8
0
        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;
        }
Beispiel #10
0
        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();
        }
Beispiel #11
0
        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);
        }
Beispiel #12
0
        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);
                        }
                    }
                }
            }
        }
Beispiel #13
0
 /**
  * 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();
 }