//ahora para enlazar los de arriba y abajo que quedaron sueltos despues del inicial
        // y despues de los de abajo del inicial
        public void EnlazarLosDemas(NodoMatriz inicio)
        {
            NodoMatriz actual       = inicio;
            NodoMatriz filaAnterior = inicio;       //las filas que se crearon ya con enlazes
            NodoMatriz filaActual   = inicio.Abajo; //la fila de abajo que solo esta unida arriba y abajo con el inicio
            int        a            = 0;
            int        b            = 0;
            NodoMatriz anterior;  //

            while (a < filas - 1) //porque la fila de arriba ya esta hecha
            {
                anterior = filaAnterior;
                actual   = filaActual;

                while (b < columnas - 1) //hacer los enlaces antes que columnas -1 porque el ultimo ya no se enlaza
                {
                    anterior       = anterior.Derecha;
                    actual         = actual.Derecha; //estas dos son para menearse arriba y abajo la misma cantidad
                    anterior.Abajo = actual;         //hacer el enlace de abajo hacia arriba
                    actual.Arriba  = anterior;
                    b++;
                }
                b = 0;
                a++;
                filaAnterior = filaActual;       //al salir del ciclo necesito que se vaya hacia abajo
                filaActual   = filaActual.Abajo; //para que se desplace de donde estaba y siga hacienod los mismos enlaces
            }
            MessageBox.Show("");
        }
        public void GraficarMatriz(NodoMatriz inicio)
        {
            TextWriter archivo;

            archivo = new StreamWriter("C:\\Users\\Usuario\\Desktop\\Matriz.dot");
            archivo.WriteLine("digraph Matriz{\n");
            archivo.WriteLine("label= \"Matriz Ortogonal\"\n");
            archivo.WriteLine("\tnode [shape=box];\n");
            //archivo.WriteLine("\trankdir = UD;\n");
            archivo.WriteLine("\tnode [fontcolor=\"purple\", height=0.5, color=\"black\"]\n");
            archivo.WriteLine("\tedge [color=\"black\", dir=fordware]\n");
            RecorrerParaGraficar(archivo);
            archivo.WriteLine("\n}");
            archivo.Close();
            informacion = new System.Diagnostics.ProcessStartInfo("cmd", "/cdot C:\\Users\\Usuario\\Desktop\\Matriz.dot -Tpng -o C:\\Users\\Usuario\\Desktop\\Matriz.png");
            ///  informacion.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
            informacion.RedirectStandardOutput = true;
            informacion.UseShellExecute        = false;
            informacion.CreateNoWindow         = false;
            Proceso           = new System.Diagnostics.Process();
            Proceso.StartInfo = informacion;
            Proceso.Start();
            informacion = new System.Diagnostics.ProcessStartInfo("cmd", "/cC:\\Users\\Usuario\\Desktop\\Matriz.png");
            informacion.RedirectStandardOutput = true;
            informacion.UseShellExecute        = false;
            informacion.CreateNoWindow         = false;
            Proceso           = new System.Diagnostics.Process();
            Proceso.StartInfo = informacion;
            Proceso.Start();
        }
        public void setearValor(int dato, int fil, int col)
        {
            NodoMatriz obtener = ObtenerNodo(fil, col);

            if (obtener != null)
            {
                obtener.Dato = dato;
            }
        }
        public void RecorrerParaGraficar(TextWriter archivo) //nose si debe de llevar algo inicio
        {
            NodoMatriz nodo = new NodoMatriz();

            nodo = inicio;
            String texto = string.Empty;

            if (nodo != null)
            {
                NodoMatriz aux = nodo;
                for (int i = 0; i < filas; i++)
                {
                    //texto += "{rank = min ";
                    for (int j = 0; j < columnas; j++)
                    {
                        if (i == 0)
                        {
                            texto += "{rank =min;\nNodo" + nodo.y + nodo.x + " [label=\"" + nodo.Dato + "|" + nodo.y + "," + nodo.x + "\"];\n";
                        }
                        else if (i == filas - 1)
                        {
                            texto += "{rank =max;\nNodo" + nodo.y + nodo.x + " [label=\"" + nodo.Dato + "|" + nodo.y + "," + nodo.x + "\"];\n";
                        }
                        else
                        {
                            texto += "{rank =same;\nNodo" + nodo.y + nodo.x + " [label=\"" + nodo.Dato + "|" + nodo.y + "," + nodo.x + "\"];\n";
                        }

                        if (nodo.Izquierda != null)
                        {
                            texto += "Nodo" + nodo.y + nodo.x + " -> Nodo" + nodo.Izquierda.y + nodo.Izquierda.x + "[label = \"izq\"];\n ";
                        }
                        if (nodo.Derecha != null)
                        {
                            //texto += "}";
                            texto += "Nodo" + nodo.y + nodo.x + " -> Nodo" + nodo.Derecha.y + nodo.Derecha.x + "[label = \"der\"];\n";
                        }
                        texto += "}";
                        if (nodo.Arriba != null)
                        {
                            texto += "Nodo" + nodo.y + nodo.x + " -> Nodo" + nodo.Arriba.y + nodo.Arriba.x + "[label = \"arri\"];\n";
                        }
                        if (nodo.Abajo != null)
                        {
                            texto += "Nodo" + nodo.y + nodo.x + " -> Nodo" + nodo.Abajo.y + nodo.Abajo.x + "[label = \"aba\"];\n";
                        }
                        nodo = nodo.Derecha;
                        if (j == columnas - 1)
                        {
                            aux = aux.Abajo;
                        }
                    }
                    nodo = aux;
                }
                archivo.Write(texto);
            }
        }
        public void CrearFila(NodoMatriz inicio)
        {
            NodoMatriz actual = inicio; //tomar el actual para ir enlazando

            for (int i = 1; i < columnas; i++)
            {
                NodoMatriz nuevo;//
                nuevo           = new NodoMatriz();
                nuevo.x         = i;
                nuevo.y         = inicio.y;
                actual.Derecha  = nuevo;  //creo nuevo nodo para crear filas inicio -> nodo
                nuevo.Dato      = 0;      //como crea el nuevo nodo le seteo el dato 0 para que no quede nulo
                nuevo.Izquierda = actual; //para hacer el enlaze doble al anterio CREOOOOO
                actual          = nuevo;
            }
        }
        public void CrearColumna(NodoMatriz inicio)
        {
            NodoMatriz actual = inicio; //no se pierde el inicio y crea las filas hacia abajo
            int        ii     = 1;

            while (ii < filas)                       //debe crear las filas solamente enlazando el inicio y abajo
            {
                NodoMatriz nuevo = new NodoMatriz(); //inivio -> nuevo
                nuevo.x      = inicio.x;
                nuevo.y      = ii;
                actual.Abajo = nuevo; //ahora hace el nodo hacia abajo
                nuevo.Arriba = actual;
                nuevo.Dato   = 0;
                actual       = actual.Abajo; // el actual ahora sera el de abajo para ue haga la de abajo
                CrearFila(actual);           //llamo al metodo crear fila para que siga haciendo la siguiente
                ii++;
            }
        }