예제 #1
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.Black, 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);
        }
예제 #2
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);
        }
예제 #3
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);
        }
예제 #4
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);
                        }
                    }
                }
            }
        }