示例#1
0
        private void Grafo_Clicked(object sender, ToolStripItemClickedEventArgs e)
        {
            IFormatter formater = new BinaryFormatter();
            Stream     stream;

            #region Grafo
            switch (e.ClickedItem.AccessibleName)
            {
            case "Abrir":
                #region Abrir Grafo
                openFileGrafo                  = new OpenFileDialog();
                openFileGrafo.Filter           = "(*.grafo) | *.grafo";
                openFileGrafo.FilterIndex      = 2;
                openFileGrafo.RestoreDirectory = true;
                openFileGrafo.InitialDirectory = directorio;
                if (openFileGrafo.ShowDialog() == DialogResult.OK)
                {
                    stream = new FileStream(openFileGrafo.FileName, FileMode.Open,
                                            FileAccess.Read, FileShare.None);
                    grafo = (Grafo)formater.Deserialize(stream);
                    if (grafo.Count > 0)
                    {
                        nodo   = grafo[0];
                        nombre = grafo[grafo.Count - 1].Nombre;
                        try
                        {
                            numNodos = Int32.Parse(nombre);
                        }
                        catch (FormatException)
                        {
                            char aux = nombre[0];
                            numNodos = aux - 64;
                        }
                        numNodos++;
                        nombre = ConvierteNombre(numNodos);

                        /*this.pref.Dispose();
                         * if (grafo.buscaArista(ref arista))
                         * {
                         *  this.pref = new Preferencias(nodo.AnchoContorno, nodo.TamNodo, nodo.TamLetra,
                         *                                  arista.AnchoLinea, arista.ColorLinea, nodo.ColorFuera,
                         *                                  nodo.BrushRelleno, nodo.Brushnombre);
                         * }
                         * else
                         * {
                         *  this.pref = new Preferencias(nodo.AnchoContorno, nodo.TamNodo, nodo.TamLetra,
                         *                                  1, Color.Black, nodo.ColorFuera,
                         *                                  nodo.BrushRelleno, nodo.Brushnombre);
                         * }*/
                    }

                    /*else
                     * {
                     *  this.pref = new Preferencias(anchoLineaN, tamNodo, altonombre,
                     *                               anchoLineaA, colorLinea, colorContorno,
                     *                               colorRelleno, colorLetra);
                     * }
                     * PreferenciasBack(pref);*/
                    stream.Close();
                    this.habilitaOpcionesGrafo();
                    if (typeof(GrafoDirigido).IsInstanceOfType(grafo))
                    {
                        this.habilitaOpcionesGrafoDirigido();
                    }
                    else
                    {
                        if (typeof(GrafoNoDirigido).IsInstanceOfType(grafo))
                        {
                            this.habilitaOpcionesGrafoNoDirigido();
                        }
                    }
                    this.GrafoSecundario_Paint(this, null);
                }
                #endregion
                break;

            case "Guardar":
                #region Gurdar Grafo
                saveFileGrafo.Filter           = "(*.grafo) | *.grafo";
                saveFileGrafo.InitialDirectory = directorio;
                if (saveFileGrafo.ShowDialog() == DialogResult.OK)
                {
                    stream = new FileStream(saveFileGrafo.FileName, FileMode.Create, FileAccess.Write, FileShare.None);
                    formater.Serialize(stream, grafo);
                    stream.Close();
                }
                #endregion
                break;

            case "CrearNodo":
                this.opcion = 1;
                break;

            case "MoverNodo":
                this.opcion = 4;
                break;

            case "EliminarNodo":
                this.opcion = 3;
                break;

            case "AristaDirigida":
                this.opcion = 7;
                break;

            case "AristaNoDirigida":
                this.opcion = 2;
                break;

            case "EliminarArista":
                this.opcion = 6;
                break;

            case "MoverGrafo":
                this.opcion = 5;
                break;

            case "EliminarGrafo":
                if (MessageBox.Show("¿Seguro quiere eliminar el grafo?", "No me quiero ir señor usuario :'(", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    grafo.borraGrafo();
                    grafo = new Grafo();

                    /*this.restauraConfiguracion();
                     * PreferenciasBack(pref);
                     * numNodos = 1;
                     * nombre = ConvierteNombre(numNodos);
                     * this.deshabititaOpciones();
                     * this.EditorDeGrafos_Paint(this, null);*/
                }
                break;
            }
            #endregion
        }
示例#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_MouseDown(object sender, MouseEventArgs e)
        {
            switch (opcion)
            {
            case 1:    //Insertar Nodo
                p1   = e.Location;
                pe.X = p1.X - (tamNodo / 2);
                pe.Y = p1.Y - (tamNodo / 2);
                nodo = new Nodo(nombre, pe, p1, penNodo.Color, brushRelleno.Color, brushName.Color, tamNodo, altoName, anchoLineaN, fuente);
                if (numNodos == 27)
                {
                    bandNombre = true;
                    grafo.Tipo = true;
                }
                grafo.Add(nodo);
                band      = false;
                bandFinal = true;
                if (grafo.Count == 1)
                {
                    if (typeof(GrafoDirigido).IsInstanceOfType(grafito))
                    {
                        this.deshabititaOpciones();
                        this.habilitaOpcionesGrafo();
                        this.habilitaOpcionesGrafoDirigido();
                    }
                    else if (typeof(GrafoNoDirigido).IsInstanceOfType(grafito))
                    {
                        this.deshabititaOpciones();
                        this.habilitaOpcionesGrafo();
                        this.habilitaOpcionesGrafoNoDirigido();
                    }
                }
                this.GrafoSecundario_Paint(this, null);
                break;

            case 2:    //AristaNoDirigida
                p1 = e.Location;
                if (grafo.BuscaNodo(ref p1))
                {
                    band       = true;
                    bandArista = true;
                }
                else
                {
                    band       = false;
                    bandArista = false;
                }
                break;

            case 3:
                p1 = e.Location;
                if (grafo.BuscaNodo(ref nodo, p1))
                {
                    grafo.borraNodo(nodo);
                    if (grafo.Count == 0)
                    {
                        this.grafo = new Grafo(this.grafo);
                        this.deshabititaOpciones();
                    }
                    this.GrafoSecundario_Paint(this, null);
                }
                break;

            case 4:    //Mover Nodo
                p1        = e.Location;
                bandFinal = grafo.BuscaNodo(ref nodo, p1);
                break;

            case 5:    //Mover Grafo
                p1        = e.Location;
                bandFinal = grafo.BuscaNodo(ref nodo, p1);
                break;

            case 6:    //EliminaArista
                grafo.BorraArista(e.Location);
                if (grafo.Aristas == 0)
                {
                    this.numAristas = 0;
                    if (typeof(GrafoDirigido).IsInstanceOfType(grafito))
                    {
                        this.deshabititaOpciones();
                        this.habilitaOpcionesGrafo();
                        this.habilitaOpcionesGrafoDirigido();
                    }
                    else if (typeof(GrafoNoDirigido).IsInstanceOfType(grafito))
                    {
                        this.deshabititaOpciones();
                        this.habilitaOpcionesGrafo();
                        this.habilitaOpcionesGrafoNoDirigido();
                    }
                }
                bandFinal = false;
                this.GrafoSecundario_Paint(this, null);
                break;

            case 7:    //AristaDirigida
                p1 = e.Location;
                if (grafo.BuscaNodo(ref p1))
                {
                    band       = true;
                    bandArista = true;
                }
                else
                {
                    band       = false;
                    bandArista = false;
                }
                break;
            }
        }
示例#4
0
        public override int BorraArista(Point p)
        {
            double m, b, y;
            double xp, yp, xn, yn, xarista, yarista;

            xp = p.X;
            yp = p.Y;
            int sensibilidad = 2;

            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))
                    {
                        Nodo nAux = BuscaNodo(p);
                        if (nAux != null && nAux.Equals(n))
                        {
                            n.Aristas.Remove(arista);
                            this.actualizaId();
                            return(1);
                        }
                    }

                    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))
                                    {
                                        arista.Arriba.Aristas.Remove(busca);
                                        break;
                                    }
                                }
                                n.Aristas.Remove(arista);
                                this.actualizaId();
                                return(1);
                            }
                        }
                    }

                    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))
                                {
                                    arista.Arriba.Aristas.Remove(busca);
                                    break;
                                }
                            }
                            n.Aristas.Remove(arista);
                            this.actualizaId();
                            return(1);
                        }
                    }
                }
            }
            return(0);
        }