Esempio n. 1
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);
                    }
                }
            }
        }
Esempio n. 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);
        }
Esempio n. 3
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);
        }
Esempio n. 4
0
        /**
         * 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);
            }
        }
Esempio n. 5
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);
        }
Esempio n. 6
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();
        }
Esempio n. 7
0
        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);
        }
Esempio n. 8
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);
        }
Esempio n. 9
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);
        }
Esempio n. 10
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);
                        }
                    }
                }
            }
        }