예제 #1
0
        /// <summary>
        ///
        /// REALIZA LAS OPERACIONES PARA LLEGAR A LA ECUACION DEL PLANO SIMPLIFICADA Y FINALIZA LA
        /// EXPLICACION
        ///
        ///
        /// </summary>
        ///
        private void FinalizarResolucion()
        {
            lbExplicacion.Text = " Una vez planteada la ecuación, podemos continuar realizando los productos y sumas y despejar el termino independiente. \n Con esto obtenemos la ecuación simplificada de este plano.";
            if (!directa)
            {
                label1.Text += "\n" + Racional.AString(vector.Componentes[0] * punto1.Coordenadas[0]) + " - " + Racional.AString(vector.Componentes[0]) + "X +" + Racional.AString(vector.Componentes[1] * punto1.Coordenadas[1]) + " - " + Racional.AString(vector.Componentes[1]) + "Y +" + Racional.AString(vector.Componentes[2] * punto1.Coordenadas[2]) + " - " + Racional.AString(vector.Componentes[2]) + "Z = 0";
            }
            label2.Show();
            label2.Location  = new Point(label1.Location.X, label1.Location.Y + label1.Height + 10);
            label2.BackColor = Color.Chartreuse;
            Plano plano = new Plano(vector, punto1);

            ecuacion    = plano.EcuacionDelPlano();
            label2.Text = ecuacion.ToString();
            int altoletra = 400 / label2.Text.Length;

            label2.Font = new Font("Dejavu Sans", altoletra);
            btContinuar.Hide();
            btCentrar.PerformClick();
            if (defecto)
            {
                btArriba.PerformClick();
                btArriba.PerformClick();
            }
        }
예제 #2
0
        /// <summary>
        ///
        /// PINTA EL FONDO DE LAS CAJAS EN LA FILA POR DEBAJO DE LA FILA ACUAL DE COLOR ROJO, UNA CADA VEZ
        /// QUE SE CUMPLE EL TIEMPO ESTABLECIDO EN EL TEMPORIZADOR
        ///
        /// </summary>

        private void Temporizador1_Tick(object sender, EventArgs e)
        {
            btNuevo.Hide();
            btContinuar.Hide();
            // label7.Location = new Point(matriz[0, 0].Location.X - 300, label2.Location.Y + label2.Height + 10);
            label7.Location    = new Point(50, label2.Location.Y + label2.Height + 10);
            label7.MaximumSize = new Size(1100, 200);
            label7.TextAlign   = ContentAlignment.MiddleLeft;

            if (filaarestar > matriz.GetLength(0))
            {
                filaarestar = columnaaconvertir;
            }

            if (filaactual < matriz.GetLength(0) && columnaactual < matriz.GetLength(0))
            {
                label7.Show();
                matriz[filaarestar, columnaactual].BackColor = Color.Coral;
                label7.Font  = new Font(label7.Font.FontFamily, (int)(15 * Math.Ceiling((double)(1 / (double)label7.Text.Length))));
                label7.Text += matriz[filaarestar, columnaactual].Text + " - " + " ( " + matriz[filaactual, columnaactual].Text + " * " + Racional.AString(producto) + " ) " + " = " + (Racional.AString((Racional.StringToRacional(matriz[filaarestar, columnaactual].Text) - Racional.StringToRacional(matriz[filaactual, columnaactual].Text) * producto)) + "         ");
                matriz[filaarestar, columnaactual].Text = Racional.AString((Racional.StringToRacional(matriz[filaarestar, columnaactual].Text) - Racional.StringToRacional(matriz[filaactual, columnaactual].Text) * producto));
                columnaactual++;
            }
            else if (columnaactual >= matriz.GetLength(0) - 1)
            {
                columnaactual = columnaaconvertir;
                filaarestar++;
                Temporizador1.Stop();
                btContinuar.Show();
                btNuevo.Show();
            }
        }
예제 #3
0
        /// <summary>
        ///
        ///  CAMBIA EL CONTENIDO Y EL NOMBRE DE LA ETIQUETA PARA EL ORDEN DE LA MATRIZ, Y MUESTRA EL
        ///  VALOR DEL DETERMINANTE, EN LA CAJA DE TEXTO DONDE SE INTRODUJO EL ORDEN EL DE LA MISMA.
        ///
        /// </summary>

        internal void MostrarResultado()
        {
            EtiquetaFilas.Text = " El determinante de la matriz introducida es: ";
            Racional resultado = Matematicas.AlgebraLineal.Determinante(matrizracional);

            tbFilas.Size       = new Size(Racional.AString(resultado).Length * 15, tbFilas.Size.Height);
            tbFilas.Text       = Racional.AString(resultado);
            tbFilas.BackColor  = Color.GreenYellow;
            lbExplicacion.Text = "";
            EtiquetaFilas.Focus();
        }
예제 #4
0
        /// <summary>
        ///
        ///  AVANZA EN LA RESOLUCION DE LA MATRIZ ADJUNTA UN PASO CADA VEZ QUE SE CLICA SOBRE EL
        ///  BOTON CONTINUAR
        ///
        /// </summary>

        internal void ResolucionPasoAPaso(object sender, EventArgs e)
        {
            if (columnaactual > orden - 1)
            {
                columnaactual = 0;
                filaactual++;
                if (filaactual > orden - 1)
                {
                    lbExplicacion.Text = " Hemos calculado la matriz adjunta.";
                    foreach (Label l in adjunta)
                    {
                        l.BackColor = Color.YellowGreen;
                    }
                    btContinuar.Hide();
                    foreach (TextBox t in matriz)
                    {
                        t.BackColor = Color.White;
                    }
                    lbExplicacion.Focus();
                    return;
                }
            }
            PintarFilaColumna(matriz, filaactual, columnaactual, Color.Black);
            string parimpar = " ";

            if ((filaactual + columnaactual) % 2 == 0)
            {
                parimpar += "Como la suma de los indices del elemento [" + filaactual + "," + columnaactual + " ], es par, ponemos el determinante calculado en la posicion  [" + columnaactual + "," + filaactual + " ] de la matriz adjunta sin mas";
            }
            else
            {
                parimpar += "Como la suma de los indices del elemento [" + filaactual + "," + columnaactual + " ], es impar, cambiamos el signo del determinante calculado y lo ponemos en la posicion  [" + columnaactual + "," + filaactual + " ] de la matriz adjunta";
            }

            if (filaactual == 0 && columnaactual == 0)
            {
                lbExplicacion.Text = "Para comenzar, eliminamos todos los elementos que estan en la misma fila y columna que el elemento [" + filaactual + "," + columnaactual + " ] , y calculamos el determinante de la matriz compuesta por los elementos que quedan.";
            }
            else
            {
                lbExplicacion.Text = "Eliminamos todos los elementos que estan en la misma fila y columna que el elemento [" + filaactual + "," + columnaactual + " ] , y calculamos el determinante de la matriz compuesta por los elementos que quedan.";
            }

            lbExplicacion.Text += "\r\n " + parimpar;

            adjunta[columnaactual, filaactual].BackColor = Color.Coral;
            adjunta[columnaactual, filaactual].Text      = Racional.AString(resultado[columnaactual, filaactual]);


            columnaactual++;
            paso++;
        }
예제 #5
0
        /// <summary>
        ///
        ///  INICIA EL METODO DE RESOLUCION PASO A PASO POR EL METODO DE LAS DIAGONALES
        ///
        /// </summary>

        private void rbSeleccion_Click(object sender, EventArgs e)
        {
            if (sender == radioButton1)
            {
                this.Text += "  ( Método de las diagonales )";
                diagonales = true;
                btContinuar.Show();
                paso = 0;
                btContinuar.Location = new Point(900, 200);
                radioButton1.Hide();
                radioButton2.Hide();
                radioButton3.Hide();
                EtiquetaFilas.Hide();
                tbFilas.Hide();
                lbExplicacion.Focus();

                lbExplicacion.Text = " Primero hacemos el producto de los elementos de la diagonal principal y guardamos el resultado.";

                label1.Text = "";
                label1.Show(); // Etiqueta con el planteamiento
                label1.Location  = new Point(matriz[matriz.GetLength(0) - 1, 0].Location.X, (matriz[matriz.GetLength(1) - 1, 0].Location.Y + matriz[0, 0].Height + 10));
                label1.BackColor = Color.SeaGreen;
                label1.ForeColor = Color.Silver;
                label1.TextAlign = ContentAlignment.MiddleLeft;

                string planteamiento = PintarDiagonal(matriz, 0, Color.GreenYellow, ref producto);
                label1.Text = planteamiento + " " + Racional.AString(producto);

                label2.Show(); // Etiqueta para Memo
                label2.Text      = "Memo: ";
                label2.Location  = new Point(label1.Location.X, label1.Location.Y + label1.Height + 10);
                label2.Text     += ":   " + Racional.AString(producto);
                label2.ForeColor = label1.ForeColor;
                label2.TextAlign = ContentAlignment.MiddleLeft;
                label2.BackColor = label1.BackColor;

                productos.Add(producto);
                paso++;
            }
            else if (sender == radioButton2)
            {
                this.Text += "  ( Método de las menores principales. )";
                menores    = true;
                Resolucion();
            }
            else if (sender == radioButton3)
            {
                this.Text += "  ( Método de Gauss. )";
                gauss      = true;
                Resolucion();
            }
        }
예제 #6
0
        /// <summary>
        ///
        /// REALIZA EL ULTIMO PASO EN LA RESOLUCION PASO A PASO
        ///
        /// </summary>
        ///
        private void btContinuar2_Click(object sender, EventArgs e)
        {
            lbResultado.Location = new Point(sbAnguloZ.Location.X, pnZoom.Location.Y + pnZoom.Height + 5);
            lbResultado.Visible  = true;
            lbResultado.Font     = new Font(lbResultado.Font.FontFamily, 12);
            lbResultado.Text     = " Por lo tanto en este caso: ";
            lbResultado.Text    += "\n √ [  ( √ ( (" + Racional.AString(punto1.X) + " - " + Racional.AString(punto2.X) + " )^2 + ( " + Racional.AString(punto1.Y) + " - " + Racional.AString(punto2.Y) + " )^2 )^2 + (" + Racional.AString(punto1.Z) + " - " + Racional.AString(punto2.Z) + " )^2  ]";
            lbResultado.Text    += "\n Lo que es igual a: ";
            lbResultado.Text    += "\n √ ( (" + Racional.AString(punto1.X) + " - " + Racional.AString(punto2.X) + " )^2 + ( " + Racional.AString(punto1.Y) + " - " + Racional.AString(punto2.Y) + " )^2 )  + ( " + Racional.AString(punto1.Z) + " - " + Racional.AString(punto2.Z) + " )^2 )";
            Vector resul = new Vector(punto1, punto2);

            lbResultado.Text += "\n La distancia es: " + resul.ModuloDecimal().ToString();
            btContinuar.Hide();
        }
예제 #7
0
 /// <summary>
 ///
 /// CONTINUA LA EXPLICACION Y PLANTEA LA ECUACION DEL PLANO
 ///
 /// </summary>
 ///
 private void ContinuarResolucion()
 {
     lbExplicacion.Text = " El vector entre el punto de paso del plano, y cualquier punto contenido en el mismo, será perpendicular al vector perpendicular del plano.\n Por lo tanto el producto punto entre el vector perpendicular al plano y el vector entre el punto de paso del plano y cualquier punto contenido en el mimo, será igual a cero.\n Con esto, podemos plantear la ecuación del plano: ";
     label1.Show();
     label1.Location  = new Point(btContinuar.Location.X, btContinuar.Location.Y + btContinuar.Height + 10);
     label1.Text      = "ECUACIÓN DE ESTE PLANO";
     label1.BackColor = Color.SeaGreen;
     label1.Font      = new Font(label1.Font.FontFamily, 10);
     if (!directa)
     {
         label1.Text += "\n\n" + Racional.AString(vector.Componentes[0]) + " * (" + Racional.AString(punto1.Coordenadas[0]) + " - X ) + " + Racional.AString(vector.Componentes[1]) + " * ( " + Racional.AString(punto1.Coordenadas[1]) + " - Y ) + " + Racional.AString(vector.Componentes[2]) + " * ( " + Racional.AString(punto1.Coordenadas[2]) + " - Z ) = 0";
     }
     if (directa)
     {
         FinalizarResolucion();
     }
 }
예제 #8
0
        /// <summary>
        ///
        /// CONTINUA CON EL SEGUNDO PASO DE LA EXPLICACION EN EL METODO PASO A PASO
        ///
        /// </summary>
        ///
        private void btContinuar_Click(object sender, EventArgs e)
        {
            lbExplicacion.Text += " \n Esto es así, porque la distancia entre los dos puntos es la hipotenusa del triangulo rectangulo formado por el vector entre los puntos y sus proyecciones sobre los planos ortogonales.";
            // Pintar el vector
            ventanagrafica.PintarVector(punto1, punto2, Color.Chartreuse, 6, true);
            string pto1X;

            if (punto1.X.ToString() != "")
            {
                pto1X = punto1.X.ToString();
            }
            else
            {
                pto1X = "0";
            }

            string pto1Y;

            if (punto1.Y.ToString() != "")
            {
                pto1Y = punto1.Y.ToString();
            }
            else
            {
                pto1Y = "0";
            }

            string pto1Z;

            if (punto1.Z.ToString() != "")
            {
                pto1Z = punto1.Z.ToString();
            }
            else
            {
                pto1Z = "0";
            }

            string pto2X;

            if (punto2.X.ToString() != "")
            {
                pto2X = punto2.X.ToString();
            }
            else
            {
                pto2X = "0";
            }

            string pto2Y;

            if (punto2.Y.ToString() != "")
            {
                pto2Y = punto2.Y.ToString();
            }
            else
            {
                pto2Y = "0";
            }

            string pto2Z;

            if (punto2.Z.ToString() != "")
            {
                pto2Z = punto2.Z.ToString();
            }
            else
            {
                pto2Z = "0";
            }

            // Pintar las lineas que forman los catetos del triangulo rectangulo
            if (punto2.Z > punto1.Z)
            {
                ventanagrafica.PintarLinea(punto1, new Punto(pto2X + " " + pto2Y + " " + pto1Z), Color.Coral, 0.5F);
                ventanagrafica.PintarLinea(new Punto(pto2X + " " + pto2Y + " " + (pto1Z)), punto2, Color.Aquamarine, 0.5f);
                ventanagrafica.PintarString(new Punto(new Racional[] { (punto1.X + punto2.X) / 2, (punto1.Y + punto2.Y) / 2, punto1.Z }), Color.Coral, 13, "√ ( (" + Racional.AString(punto1.X) + " - " + Racional.AString(punto2.X) + " )^2 + ( " + Racional.AString(punto1.Y) + " - " + Racional.AString(punto2.Y) + " )^2 )");
                ventanagrafica.PintarString(new Punto(new Racional[] { punto2.X, punto2.Y, (punto1.Z + punto2.Z) / 2 }), Color.Aquamarine, 13, Racional.AString(punto1.Z) + " - " + Racional.AString(punto2.Z));
            }
            else
            {
                ventanagrafica.PintarLinea(punto2, new Punto(pto1X + " " + pto1Y + " " + pto2Z), Color.Coral, 0.5f);
                ventanagrafica.PintarLinea(new Punto(pto1X + " " + pto1Y + " " + pto2Z), punto1, Color.Aquamarine, 0.5f);
                ventanagrafica.PintarString(new Punto(new Racional[] { (punto1.X + punto2.X) / 2, (punto1.Y + punto2.Y) / 2, punto2.Z }), Color.Coral, 13, "√ ( (" + Racional.AString(punto1.X) + " - " + Racional.AString(punto2.X) + " )^2 + ( " + Racional.AString(punto1.Y) + " - " + Racional.AString(punto2.Y) + " )^2 )");
                ventanagrafica.PintarString(new Punto(new Racional[] { punto1.X, punto1.Y, (punto1.Z + punto2.Z) / 2 }), Color.Aquamarine, 13, Racional.AString(punto1.Z) + " - " + Racional.AString(punto2.Z));
            }

            btContinuar.Click -= btContinuar_Click;
            btContinuar.Click += btContinuar2_Click;
            for (int i = 0; i < 3; i++)
            {
                btArriba.PerformClick();
            }
            ventanagrafica.Ventana.Invalidate();
        }
예제 #9
0
        /// <summary>
        ///
        /// CONTRUYE LOS PUNTOS CON LOS VALORES INTRODUCIDOS EN LAS CAJAS DE TEXTO, CAMBIA EL TEXTO
        /// DEL BOTON ACEPTAR POR CONTINUAR , LO CAMBIA A COLOR VERDE OSCURO Y DIBUJA LOS PUNTOS EN
        /// EL AREA GRAFICA
        ///
        /// </summary>
        ///

        private void IniciarResolucion()
        {
            // Mostrar los controles
            lbTituloAnguloX.Visible = true; btIsometrica.Visible = true;
            lbAnguloX.Visible       = true; btAlzado.Visible = true;
            sbAngulox.Visible       = true; btPerfil.Visible = true;
            lbTituloAnguloY.Visible = true; btPlanta.Visible = true;
            lbAnguloY.Visible       = true;
            sbAnguloY.Visible       = true;
            lbTituloAnguloZ.Visible = true;
            lbAnguloZ.Visible       = true;
            sbAnguloZ.Visible       = true;
            btZoomMas.Visible       = true;
            btZoomMenos.Visible     = true;
            lbZoomtitulo.Visible    = true;
            lbAjustar.Visible       = true;
            btAjustar.Visible       = true;
            pnZoom.Visible          = true;
            btAbajo.Visible         = true;
            btArriba.Visible        = true;
            btDerecha.Visible       = true;
            btIzquierda.Visible     = true;
            btCentrar.Visible       = true;
            btContinuar.Visible     = true;

            if (!defecto) // Si no se ha pulsado el boton de resolucion con valores por defecto
            {
                punto1 = new Punto(tbPunto1X.Text + " " + tbPunto1Y.Text + " " + tbPunto1Z.Text);
                punto2 = new Punto(tbPunto2X.Text + " " + tbPunto2Y.Text + " " + tbPunto2Z.Text);
                btDefecto.Hide();
            }
            else
            {
                punto1                = new Punto("10 26 25");
                tbPunto1X.Text        = Racional.AString(punto1.X);
                tbPunto1Y.Text        = Racional.AString(punto1.Y);
                tbPunto1Z.Text        = Racional.AString(punto1.Z);
                punto2                = new Punto("25 -30 -40");
                tbPunto2X.Text        = Racional.AString(punto2.X);
                tbPunto2Y.Text        = Racional.AString(punto2.Y);
                tbPunto2Z.Text        = Racional.AString(punto2.Z);
                ventanagrafica.Escala = 0.85F;
                btIsometrica.PerformClick();
                // sbAngulox.Value = 30;
                //  sbAnguloY.Value = -25;
                //  sbAnguloZ.Value = 65;
            }


            if (!directa)
            {
                ventanagrafica.PintarPunto(punto1, 10, true, Color.Red);
                ventanagrafica.PintarPunto(punto2, 10, true, Color.GreenYellow);
                lbExplicacion.Text = " La distancia entre los dos puntos, es igual a la raiz cuadrada de la suma de los cuadrados de las diferencias de sus coordenadas respectivas. \nEs decir: Distancia = √ ( " + tbPunto1X.Text + " - " + tbPunto2X.Text + ")^2 + ( " + tbPunto1Y.Text + " - " + tbPunto2Y.Text + " )^2 + ( " + tbPunto1Z.Text + " - " + tbPunto2Z.Text + " )^2";
            }
            if (directa)
            {
                lbExplicacion.Text = " La distancia entre los puntos es: " + new Vector(punto1, punto2).ModuloDecimal().ToString();
                ventanagrafica.PintarVector(punto1, punto2, Color.CadetBlue, 5, true);
                btContinuar.Hide();
            }

            if (!defecto)
            {
                btAjustar.PerformClick();
                btIsometrica.PerformClick();
            }
        }
예제 #10
0
        /// <summary>
        ///
        ///  CONSTRUYE UNA MATRIZ DE LA MISMA DIMENSION QUE LA MATRIZ DE LA QUE SE QUIERE OBTENER
        ///  LA ADJUNTA PARA DAR EL RESULTADO
        ///  ,
        /// </summary>

        private void ConstruirAdjunta()
        {
            if (defecto)
            {
                matrizracional = new Racional[orden, orden];
                for (int i = 0; i < matriz.GetLength(0); i++)
                {
                    for (int j = 0; j < matriz.GetLength(0); j++)
                    {
                        matrizracional[i, j] = Racional.StringToRacional(matriz[i, j].Text);
                    }
                }
            }
            if (!directa)
            {
                lbExplicacion.Text = "La matriz adjunta es del mismo tamaño que la matriz inicial.";
            }
            else
            {
                lbExplicacion.Text = "";
            }
            int indicetabulador = 0;

            adjunta = new Label[orden, orden];
            Point origen = new Point(70 + (matriz.GetLength(0) * 100), 200);

            label2.Location  = new Point(90 + (matriz.GetLength(0) * 100), label1.Location.Y);
            label2.Font      = label1.Font;
            label2.Text      = "Matriz adjunta";
            label2.BackColor = Color.SeaGreen;
            label2.Show();
            for (int i = 0; i < orden; i++)
            {
                for (int j = 0; j < orden; j++)
                {
                    adjunta[i, j]           = new Label();
                    adjunta[i, j].BackColor = Color.White;
                    adjunta[i, j].Size      = new Size(50, 20);
                    adjunta[i, j].Location  = origen;
                    adjunta[i, j].TabIndex  = indicetabulador;
                    adjunta[i, j].TextAlign = ContentAlignment.MiddleCenter;
                    Controls.Add(adjunta[i, j]);
                    adjunta[i, j].Show();
                    origen.X += 60;
                    indicetabulador++;
                }
                origen.X  = 70 + (matriz.GetLength(0) * 100);
                origen.Y += 30;
            }
            if (directa)
            {
                Racional[,] resultado = Matematicas.AlgebraLineal.Adjunta(matrizracional);
                for (int i = 0; i < orden; i++)
                {
                    for (int j = 0; j < orden; j++)
                    {
                        adjunta[i, j].Text      = Racional.AString(resultado[i, j]);
                        adjunta[i, j].BackColor = Color.YellowGreen;
                    }
                }
            }
            else
            {
                filaactual             = 0;
                columnaactual          = 0;
                lbExplicacion.Location = new Point(10, 5);
                lbExplicacion.Show();
                if (!directa)
                {
                    btContinuar.Location = new Point(100, matriz[matriz.GetLength(0) - 1, 0].Location.Y + 50);
                    btContinuar.Show();
                }
                resultado = Matematicas.AlgebraLineal.Adjunta(matrizracional);
            }
            lbExplicacion.Focus();
        }
예제 #11
0
        /// <summary>
        ///
        ///  DEVUELVE TRUE SI LA MATRIZ DADA ES DIAGONALIZABLE. COMPROBANDO
        ///  QUE EL RANGO DE LAS MATRICES PROPIAS DE UNA MATRIZ ES IGUAL
        ///  A EL VALOR DEL ORDEN DE LA MATRIZ MENOS LA CANTIDAD DE VECES
        ///  QUE EL VALOR PROPIO SE REPITE ( METODO CON INDICACIONES PASO A PASO
        ///
        /// </summary>

        private void DiagonalizableIndicaciones()
        {
            if (paso == 0)
            {
                diagonalizable        = true;
                lbExplicacion.Visible = false;
                rtbDesarrollo.Visible = true;
                rtbDesarrollo.Text    = "Para empezar construimos la matriz propia, restando a los elementos en la diagonal principal, el valor propio repetido, en este caso: " + repetido.valorpropio.ToString();

                // Construir el string de la matriz con el valor propio repetido restado y mostrarla
                string matrizs = "";
                for (int i = 0; i < matriz.GetLength(0); i++)
                {
                    for (int j = 0; j < matriz.GetLength(0); j++)
                    {
                        if (i == j)
                        {
                            matrizs += Racional.AString(matriz[i, j]) + " - " + repetido.valorpropio.ToString() + "        ";
                        }
                        else
                        {
                            matrizs += Racional.AString(matriz[i, j]) + "        ";
                        }
                    }
                    matrizs += "\n\n";
                }

                rtbDesarrollo.Text += "\n\n" + matrizs;

                /*
                 * lbExplicacion.Text = "Para empezar construimos la matriz propia, restando a los elementos en la diagonal principal el valor propio repetido, en este caso: " + repetido.valorpropio.ToString();
                 *
                 * for (int i = 0; i < matriz.GetLength(0); i++)
                 * {
                 *  for (int j = 0; j < matriz.GetLength(0); j++)
                 *  {
                 *      matrizlb[i, j] = new Label();
                 *      matrizlb[i, j].Location = new Point(Origen.X + (contador * 60), Origen.Y);
                 *      matrizlb[i, j].Size = new Size(50, 30);
                 *      Controls.Add(matrizlb[i, j]);
                 *      matrizlb[i, j].Font = new Font(matrizlb[i, j].Font.Name, 12);
                 *      matrizlb[i, j].Show();
                 *      if (i == j)
                 *          matrizlb[i, j].Text = Racional.AString(matriz[i, j]) + " - " + repetido.valorpropio.ToString();
                 *      else
                 *          matrizlb[i, j].Text = Racional.AString(matriz[i, j]);
                 *      contador++;
                 *  }
                 *  contador = 0;
                 *  Origen.Y += 45;
                 * }
                 *
                 */
                /*
                 * Label lbMatriz = new Label();
                 * lbMatriz.Location = new Point(Origen.X,Origen.Y);
                 * lbMatriz.AutoSize = true;
                 * lbMatriz.Font = new Font("Dejavu-Sans",10);
                 * lbMatriz.Visible = true;
                 * Controls.Add(lbMatriz);
                 * lbMatriz.Text = Matematicas.AlgebraLineal.MatrizAString(matriz);
                 */
                matrizpropia = Matematicas.AlgebraLineal.MatrizPropia(matriz, repetido.valorpropio);
            }

            else if (paso == 1)
            {
                /*
                 * lbExplicacion.Text = "Realizando la resta de la diagonal mayor, la matriz propia es: ";
                 * for (int i = 0; i < matriz.GetLength(0); i++)
                 * {
                 *     for (int j = 0; j < matriz.GetLength(0); j++)
                 *     {
                 *         if( i == j)
                 *         matrizlb[i, j].Text = Racional.AString(matriz[i, j] - repetido.valorpropio);
                 *     }
                 * }
                 */
                rtbDesarrollo.Text += "\n\n Realizando la resta de la diagonal mayor, la matriz propia es: ";
                long valorprop = (long)repetido.valorpropio.Numerador / repetido.valorpropio.Denominador;
                Racional [,] matrizpropia = Matematicas.AlgebraLineal.MatrizValorPropio(matriz, valorprop);
                string matrizpropias = Matematicas.AlgebraLineal.MatrizAString(matrizpropia);
                rtbDesarrollo.Text          += "\n\n" + matrizpropias + "\n\n";
                rtbDesarrollo.SelectionStart = rtbDesarrollo.Text.Length;
                rtbDesarrollo.ScrollToCaret();
            }
            else if (paso == 2)
            {
                rango = Matematicas.AlgebraLineal.Rango(matrizpropia);
                rtbDesarrollo.Text          += "El rango de la matriz propia es: " + Racional.AString(rango) + "\n\n\n";
                rtbDesarrollo.SelectionStart = rtbDesarrollo.Text.Length;
                rtbDesarrollo.ScrollToCaret();
                //lbExplicacion.Text = "El rango de la matriz propia es: " + Racional.AString(rango) + ;
            }
            else if (paso == 3)
            {
                Racional ordenmatriz  = matriz.GetLength(0);
                Racional repeticiones = repetido.repeticiones;
                if (rango > (ordenmatriz - repeticiones) || rango < (ordenmatriz - repeticiones))
                {
                    //lbExplicacion.Text = "Rango de la matriz propia del valor propio repetido " + repetido.valorpropio.ToString() + " es de: " + Racional.AString(rango) + " Y el resultado del orden de la matriz menos la cantidad de repeticiones es de: " + matriz.GetLength(0) + " - " + repetido.repeticiones + " = " + Racional.AString(ordenmatriz - repeticiones) + "\nPor lo tanto la matriz no es diagonalizable.";
                    rtbDesarrollo.Text += "Rango de la matriz propia del valor propio repetido " + repetido.valorpropio.ToString() + " es de: " + Racional.AString(rango) + " Y el resultado del orden de la matriz menos la cantidad de repeticiones es de: " + matriz.GetLength(0) + " - " + repetido.repeticiones + " = " + Racional.AString(ordenmatriz - repeticiones) + "\nPor lo tanto la matriz no es diagonalizable.\n";
                    diagonalizable      = false;
                    btContinuar.Hide();
                    btSalir.Show();
                }
                else
                {
                    //lbExplicacion.Text = "Rango de la matriz propia del valor propio: " + repetido.valorpropio.ToString() + "   Es de: " + Racional.AString(rango) + "\nEl resultado del orden de la matriz menos la cantidad de repeticiones es de: " + matriz.GetLength(0) + " - " + repetido.repeticiones + " = " + Racional.AString(ordenmatriz - repeticiones);
                    rtbDesarrollo.Text += " Rango de la matriz propia del valor propio: " + repetido.valorpropio.ToString() + "   Es de: " + rango.ToString() + "\nEl resultado del orden de la matriz menos la cantidad de repeticiones es de: " + matriz.GetLength(0) + " - " + repetido.repeticiones + " = " + (ordenmatriz - repeticiones).ToString();
                    rtbDesarrollo.Text += "\nPor lo tanto, la matriz es diagonalizable\n\n\n\n";
                    //lbExplicacion.Text += "\nPor lo tanto, la matriz es diagonalizable";
                    btContinuar.Hide();
                    btSalir.Show();
                }
                rtbDesarrollo.SelectionStart = rtbDesarrollo.Text.Length;
                rtbDesarrollo.ScrollToCaret();
            }
        }
예제 #12
0
        /// <summary>
        ///
        ///  LLEVA A CABO LA EXPLICACION PASO A PASO DEL METODO DE RESOLUCION ELEGIDO ANTERIORMENTE
        ///
        /// </summary>

        private void Resolucion()
        {
            if (diagonales) // Resolucion por el metodo de las diagonales
            {
                label3.Location  = new Point(label2.Location.X, label2.Location.Y + label2.Size.Height + 10);
                label3.BackColor = label1.BackColor;
                label4.Location  = new Point(label3.Location.X, label3.Location.Y + label3.Height + 10);
                label3.AutoSize  = true;
                label4.Location  = new Point(label3.Location.X, label3.Location.Y + label3.Height + 10);

                bool ordendos = (matriz.GetLength(0) == 2); // Si la matriz es de orden dos

                lbExplicacion.Text = " Realizamos la misma operacion con todas las diagonales a la derecha.";

                producto = new Racional(1, 1);
                if ((!ordendos & paso < matriz.GetLength(0)) || (ordendos & paso == 0))  // Mientras no se llegue a todas las diagonales a la derecha
                {
                    DespintarCajas();
                    string planteamiento = PintarDiagonal(matriz, paso, Color.GreenYellow, ref producto);
                    label1.Text = planteamiento + " " + Racional.AString(producto);

                    label2.Show();
                    if (producto.Numerador >= 0)
                    {
                        label2.Text += " + ";
                    }
                    if (paso == matriz.GetLength(0))
                    {
                        label2.Text += " = ";
                    }

                    label2.Text += Racional.AString(producto);

                    productos.Add(producto);
                }
                else if ((!ordendos && paso == orden) || (ordendos && paso == 1))// Cuando se hayan realizado todas las diagonales a la derecha
                {
                    Racional totalderecha = 0;
                    foreach (Racional r in productos)
                    {
                        totalderecha += r;
                    }
                    label3.Show(); // Etiqueta para el resultado de las diagonales a la derecha
                    label3.Text      = "Total derecha: " + Racional.AString(totalderecha);
                    label3.Location  = new Point(label2.Location.X, label2.Location.Y + label2.Size.Height + 10);
                    label3.BackColor = label1.BackColor;

                    lbExplicacion.Text = " Una vez realizado el producto de todas las diagonales a la derecha, los sumamos y procedemos a realizar el producto de los elementos de las diagonales a la izquierda.";
                }
                else // Productos de las diagonales a la izquierda
                {
                    if ((!ordendos && descontador >= 0) || (ordendos && paso == 2))
                    {
                        if (descontador == orden - 1)
                        {
                            lbExplicacion.Text = "Comenzamos con el producto de la primera diagonal a la izquierda.";
                        }
                        else
                        {
                            lbExplicacion.Text = " Continuamos realizando el producto de la siguiente diagonal hacia la izquierda: ";
                        }

                        DespintarCajas();
                        producto = 1;
                        string planteamiento = PintarDiagonalIzquierda(matriz, descontador, Color.Coral, ref producto);
                        label1.Text = planteamiento + " = " + Racional.AString(producto);
                        productosizquierda.Add(producto);
                        if (descontador == matriz.GetLength(0) - 1)
                        {
                            label2.Text = " ";
                            label2.Text = "Memo: " + Racional.AString(producto);
                        }
                        else
                        {
                            if (producto.Numerador >= 0)
                            {
                                label2.Text += " + ";
                            }
                            label2.Text += Racional.AString(producto);
                        }
                        descontador--;
                    }
                    else
                    {
                        label2.Text        = " ";
                        lbExplicacion.Text = " Por ultimo restamos al total de la suma de productos de las diagonales a la derecha, el total de la suma de productos de las diagonales a la izquierda. ";
                        Racional totalizquierda = 0;
                        label1.Text = "  ";
                        foreach (Racional r in productosizquierda)
                        {
                            totalizquierda += r;
                        }
                        label4.Show();
                        label4.BackColor = Color.SeaGreen;
                        label4.Text      = "Toltal izquierda:  " + Racional.AString(totalizquierda);
                        Racional totalderecha = 0;
                        foreach (Racional r in productos)
                        {
                            totalderecha += r;
                        }
                        label1.Text = " El determinante o módulo de la matriz es: " + Racional.AString(totalderecha) + " - " + Racional.AString(totalizquierda) + " = " + Racional.AString(totalderecha - totalizquierda);
                        btContinuar.Hide();
                        foreach (TextBox t in matriz)
                        {
                            t.BackColor = Color.White;
                        }
                        lbExplicacion.Focus();
                    }
                }
            } // Fin de la resolucion por el metodo de las diagonales
            else if (menores) // Resolucion por el metodo de las menores principales
            {
                if (paso == 0) // primer paso de la resolucion
                {
                    productos.Clear();
                    producto = 0;
                    btContinuar.Show();
                    btContinuar.Location = new Point(900, 150);
                    radioButton1.Hide();
                    radioButton2.Hide();
                    radioButton3.Hide();
                    EtiquetaFilas.Hide();
                    tbFilas.Hide();
                    label1.BackColor = Color.SeaGreen;
                    label2.BackColor = Color.SeaGreen;
                    // Pintar de negro la fila y columna correspondiente
                    PintarFilaColumna(matriz, 0, 0, Color.Black);
                    lbExplicacion.Focus();
                    // Escribir explicacion en la etiqueta
                    lbExplicacion.Text  = " Primero extraemos la submatriz formada por los elementos cuya fila o columna, no coincida con el elemento numero " + paso.ToString() + " de la matriz, y calculamos el determinante de la misma.";
                    lbExplicacion.Text += " \n\r Mulplicamos el determinante de la submatriz " + Racional.AString(determinantemenor) + " por el elemento numero " + paso.ToString() + " de la matriz. ";
                    lbExplicacion.Text += " \n\r Como el indice del elemento 0 de la matriz es par, guardamos el resultado sin mas.";
                    // Mostrar el planteamiento
                    label1.Show();
                    label1.Location = new Point(matriz[0, 0].Location.X, matriz[matriz.GetLength(0) - 1, 0].Location.Y + matriz[0, 0].Height + 10);
                    label1.Text     = Racional.AString(determinantemenor) + " * " + matriz[0, 0].Text + " = " + Racional.AString(determinantemenor * Racional.StringToRacional(matriz[0, 0].Text));
                    // Mostrar el resultado anterior
                    label2.Show();
                    label2.Location = new Point(label1.Location.X, label1.Location.Y + label1.Height + 10);
                    label2.Text     = "Memo: " + Racional.AString(determinantemenor * Racional.StringToRacional(matriz[0, 0].Text));
                    productos.Add(determinantemenor * Racional.StringToRacional(matriz[0, 0].Text));
                    filaactual    = 0;
                    columnaactual = 1;
                    paso++;
                }
                else if (paso > 0)  // pasos posteriores al primero hasta llegar al orden de la matriz
                {
                    if (paso < matriz.GetLength(0))
                    {
                        // Pintar de negro la fila y columna correspondiente
                        PintarFilaColumna(matriz, filaactual, columnaactual, Color.Black);
                        // Escribir la explicacion en la etiqueta
                        lbExplicacion.Text  = " Continuamos extrayendo la submatriz formada por los elementos cuya fila o columna, no coincida con el elemento numero " + paso.ToString() + " de la matriz, y calculamos el determinante de la misma.";
                        lbExplicacion.Text += " Mulplicamos el determinante de la submatriz " + Racional.AString(determinantemenor) + " por el elemento numero " + paso.ToString() + " de la matriz. ";
                        if (paso % 2 == 0)
                        {
                            lbExplicacion.Text += " \n\r Como el indice del elemento" + paso.ToString() + "  de la matriz es par, guardamos el resultado sin mas.";
                            label1.Show();
                            label1.Text = Racional.AString(determinantemenor) + " * " + matriz[filaactual, columnaactual].Text + " = " + Racional.AString(determinantemenor * Racional.StringToRacional(matriz[filaactual, columnaactual].Text));
                            label2.Show();
                            Racional parcial = determinantemenor * Racional.StringToRacional(matriz[filaactual, columnaactual].Text);
                            if (parcial.Numerador >= 0)
                            {
                                label2.Text += " + ";
                            }
                            label2.Text += Racional.AString(parcial);
                            productos.Add(determinantemenor * Racional.StringToRacional(matriz[filaactual, columnaactual].Text));
                        }
                        else
                        {
                            lbExplicacion.Text += " \n\r Como el indice del elemento " + paso.ToString() + " de la matriz es impar, cambiamos el signo del resultado";
                            label1.Show();
                            label1.Text = Racional.AString(determinantemenor) + " * " + matriz[filaactual, columnaactual].Text + " = " + Racional.AString(determinantemenor * Racional.StringToRacional(matriz[filaactual, columnaactual].Text));
                            label2.Show();
                            Racional parcial = determinantemenor * Racional.StringToRacional(matriz[filaactual, columnaactual].Text) * -1;
                            if (parcial.Numerador >= 0)
                            {
                                label2.Text += " + ";
                            }
                            label2.Text += Racional.AString(parcial);

                            productos.Add(determinantemenor * Racional.StringToRacional(matriz[filaactual, columnaactual].Text) * -1);
                        }
                        columnaactual++;
                        if (columnaactual > matriz.GetLength(0) - 1)
                        {
                            columnaactual = 0;
                            filaactual++;
                        }
                    }
                    else
                    {
                        foreach (Racional r in productos)
                        {
                            producto += r;
                        }
                        label3.AutoSize  = true;
                        label3.Location  = new Point(label2.Location.X, label2.Location.Y + label2.Height + 10);
                        label3.BackColor = Color.SeaGreen;
                        label3.Show();
                        label3.Text = " El determinante de la matriz es la suma de los resultados anteriores: " + Racional.AString(producto);
                        foreach (TextBox t in matriz)
                        {
                            t.BackColor = Color.White;
                        }
                        label1.Hide();
                        lbExplicacion.Hide();
                        btContinuar.Hide();
                        label3.Focus();
                    }
                }
                ////////////////////////////////////
            }  // Fin de la resolucion por el metodo de las menores principales
            // Resolucion por el metodo de Gauss.
            else if (gauss)
            {
                if (paso == 0)
                {
                    lbExplicacion.Focus();
                    foreach (TextBox t in matriz)
                    {
                        t.Location = new Point(t.Location.X + (100 * matriz.GetLength(0)), t.Location.Y);
                    }

                    copiamatriz = new TextBox[matriz.GetLength(0), matriz.GetLength(0)];
                    for (int i = 0; i < matriz.GetLength(0); i++)
                    {
                        for (int j = 0; j < matriz.GetLength(0); j++)
                        {
                            copiamatriz[i, j]           = new TextBox();
                            copiamatriz[i, j].Size      = matriz[i, j].Size;
                            copiamatriz[i, j].TextAlign = HorizontalAlignment.Center;
                            copiamatriz[i, j].Location  = new Point(matriz[i, j].Location.X - (90 * matriz.GetLength(0)), matriz[i, j].Location.Y);
                            Controls.Add(copiamatriz[i, j]);
                            copiamatriz[i, j].Text = matriz[i, j].Text;
                        }
                    }

                    label5.Location = new Point(copiamatriz[0, 0].Location.X, copiamatriz[0, 0].Location.Y - 20);
                    label5.Show(); // Titulo de la matriz
                    label5.Text      = "Matriz original.";
                    label5.BackColor = Color.SeaGreen;
                    label5.Font      = new Font("Dejavu Sans", 10, FontStyle.Underline);
                    label6.Location  = new Point(matriz[0, 0].Location.X, label5.Location.Y);
                    label6.Show(); // Titulo de la matriz copia
                    label6.Text      = "Matriz copia.";
                    label6.Font      = label5.Font;
                    label6.BackColor = Color.SeaGreen;
                    filaactual       = 0;
                    columnaactual    = 0;
                    productos.Clear();
                    producto = 0;
                    btContinuar.Show();
                    btContinuar.Location = new Point(900, 150);
                    radioButton1.Hide();
                    radioButton2.Hide();
                    radioButton3.Hide();
                    EtiquetaFilas.Hide();
                    tbFilas.Hide();
                    lbExplicacion.Show();

                    lbExplicacion.Text  = " Para empezar, tenemos que convertir todos los elementos por debajo del primer elemento de la diagonal principal, en cero. ";
                    producto            = Racional.StringToRacional(matriz[filaarestar, columnaaconvertir].Text) / Racional.StringToRacional(matriz[columnaaconvertir, columnaaconvertir].Text);
                    lbExplicacion.Text += " \n\r Para ello,comenzamos dividiendo el elemento debajo del primer elemento de la diagonal principal por este, y guardamos el cociente.";
                    lbExplicacion.Text += " \n\r Este cociente, lo multiplicamos a cada elemento de la primera fila, y el resultado se lo restamos a cada elemento de la segunda.";

                    label1.Location = new Point(matriz[0, 0].Location.X, matriz[matriz.GetLength(0) - 1, 0].Location.Y + matriz[0, 0].Height + 10);
                    label1.Show();
                    label1.BackColor = Color.SeaGreen;
                    label1.Text      = matriz[filaarestar, columnaaconvertir].Text + " / " + matriz[columnaaconvertir, columnaaconvertir].Text + " = " + Racional.AString(producto);
                    label2.Show();
                    label2.BackColor = Color.SeaGreen;
                    label2.Location  = new Point(label1.Location.X, label1.Location.Y + label1.Height + 10);
                    label2.Text      = "Cociente = " + Racional.AString(producto);
                    filaactual       = 0;
                    label7.Show();
                    label7.BackColor = Color.SeaGreen;
                    label7.ForeColor = Color.Silver;
                    label7.Text      = "Secuencia de operaciones: ";
                    Temporizador1.Start();
                    paso++;
                }
                else if (paso > 0)
                {
                    lbExplicacion.Focus();
                    btContinuar.Hide();
                    label7.Text = "Secuencia de operaciones:  ";
                    // Si ya se ha alcanzado la ultima fila a pero quedan columnas por convertir a cero los elementos por debajo de la diagonal principal
                    if (filaarestar > matriz.GetLength(0) - 1 && columnaaconvertir < matriz.GetLength(0) - 1)
                    {
                        foreach (TextBox t in matriz)
                        {
                            t.BackColor = Color.White; // Repintar todas las celdas con fondo blanco
                        }
                        columnaaconvertir++;
                        filaarestar   = columnaaconvertir + 1;
                        filaactual    = columnaaconvertir;
                        columnaactual = columnaaconvertir;
                    }

                    // Fijar la cantidad de pasos a realizar para convertir todos los elemetos por debajo de la diagonal principal en cero
                    int limite = 0;

                    int orden = matriz.GetLength(0); // Orden de la matriz

                    while (orden > 0)                // Sumar la cantidad de pasos que seran necesarios para convertir la columna en cero
                    {
                        orden--;
                        limite += orden;
                    }

                    if (paso < limite)
                    {
                        lbExplicacion.Text = " Continuamos convitiendo en cero todos los elementos por debajo del elemento " + (paso + 1) + " de la diagonal principal de la matriz.";
                        producto           = Racional.StringToRacional(matriz[filaarestar, columnaaconvertir].Text) / Racional.StringToRacional(matriz[columnaaconvertir, columnaaconvertir].Text);
                        label1.Text        = matriz[filaarestar, columnaaconvertir].Text + " / " + matriz[columnaaconvertir, columnaaconvertir].Text + " = " + Racional.AString(producto);
                        label2.Text        = "Cociente = " + Racional.AString(producto);
                        Temporizador1.Start();
                    }
                    else
                    {
                        lbExplicacion.Text  = " Una vez convertidos en cero todos los elementos por debajo de la diagonal principal, hemos convertido la matriz en una matriz tringular.";
                        lbExplicacion.Text += "\r\n El determinante de las matrices triangulares, es el producto de los elementos de la diagonal principal: ";
                        label2.Hide();
                        label7.Hide();
                        string producto = " ";
                        // Racional resultado = 1;
                        for (int i = 0; i < matriz.GetLength(0); i++)
                        {
                            for (int j = 0; j < matriz.GetLength(0); j++)
                            {
                                if (i == j)
                                {
                                    producto += matriz[i, j].Text + " * ";
                                    // resultado *= Racional.StringToRacional(matriz[i, j].Text);
                                }
                            }
                        }
                        producto = producto.Substring(0, producto.Length - 2);
                        // label1.Text = producto + " = " + Racional.AString(resultado);
                        label1.MaximumSize = new Size(500, 200);
                        label1.Text        = producto + " = " + (Matematicas.AlgebraLineal.Determinante(matrizracional)).ToString();
                    }
                }
            }
        }
예제 #13
0
        /// <summary>
        ///
        ///  REDIBUJA EL CIRCULO CON EL RADIO EN EL ANGULO REDUCIDO EN 0,1 RADIANES
        ///  Y CAMBIA LA ETIQUETA CON EL TEOREMA DE PITAGORAS lbPitagoras
        ///
        /// </summary>
        ///
        private void AnguloMenos()
        {
            float escalaactual = ventanagrafica.Escala;

            origenx = ventanagrafica.OrigenX;
            origeny = ventanagrafica.OrigenY;
            ventanagrafica.EliminarCirculo(0);

            ventanagrafica.Escala = escalaactual;
            ventanagrafica.DesplazarA(new Point(origeny, origenx));
            if (paso == 1)
            {
                ventanagrafica.PintarCirculo(apintar, radio, Color.Olive, 2, anguloradio);
            }
            else
            {
                ventanagrafica.PintarCirculo(apintar, radio, Color.Olive, 2, anguloradio, true);
            }
            tbParametro.Text = anguloradio.ToString();
            double grados = (anguloradio * 57.29577951F);

            tbLargoInicial.Text = grados.ToString();
            double radiodouble = radio.Numerador / radio.Denominador;
            double centroxx    = (double)apintar.X.Numerador / apintar.X.Denominador;
            double centroyy    = (double)apintar.Y.Numerador / apintar.Y.Denominador;

            if (paso == 1)
            {
                lbExplicacion.Text = " Las coordenadas X e Y del punto final del radio, se obtienen sumando o restando el largo de los catetos a las coodenadas X o Y respectivas del centro de la circunferencia.\n Se han añadido a la figura en color amarillo, y puede verse como varian cambiando el ángulo de la línea del radio.\n La ecuación del punto final del radio en este ángulo de la linea del radio es:  " + Racional.AString(radio * radio) + " = ( " + Math.Round((radiodouble * Math.Cos(anguloradio) + centroxx), 4).ToString() + " - " + centroxx.ToString() + " )^2 + ( " + Math.Round((radiodouble * Math.Sin(anguloradio) + centroyy), 4).ToString() + " - " + centroyy.ToString() + ")^2";
            }
            label1.Text = "Teorema de Pitágoras aplicado a esta circunferencia:\nѴ (" + Math.Round(radiodouble * Math.Sin(anguloradio), 2).ToString() + "^2 + " + Math.Round(radiodouble * Math.Cos(anguloradio), 2).ToString() + "^2 )  = " + Racional.AString(radio);
            ventanagrafica.Ventana.Invalidate();
        }
예제 #14
0
        /// <summary>
        ///
        /// MUESTRA LA ECUACION DE LA CIRCUNFERENCIA INTRODUCIDA Y TERMINA LA EXPLICACION
        ///
        /// </summary>
        ///
        private void FinalizarResolucion()
        {
            double radiodouble = (double)(radio.Numerador / radio.Denominador);
            double centroxx    = (double)apintar.X.Numerador / apintar.X.Denominador;
            double centroyy    = (double)apintar.Y.Numerador / apintar.Y.Denominador;

            if (!directa)
            {
                lbExplicacion.Text = " Las coordenadas del centro de la circunferencia, son las mismas esté donde esté el punto final del radio de la circunferencia, si cambiamos las coordenadas del punto final del radio  por las variables X e Y, la ecuación queda: \n " + Racional.AString(radio * radio) + " = ( X - " + centroxx.ToString() + " )^2 + ( Y - " + centroyy.ToString() + ")^2 . Desarrollando los cuadrados de las restas: " + Racional.AString(radio * radio) + " =  X^2 - " + (2 * centroxx).ToString() + "X + " + (centroxx * centroxx).ToString() + " + Y^2  - " + (2 * centroyy).ToString() + "Y + " + (centroyy * centroyy).ToString() + ".  Simplificando: " + ((radiodouble * radiodouble) - (centroxx * centroxx) - (centroyy * centroyy)) + " =  X^2 - " + (2 * centroxx).ToString() + "X + Y^2 - " + (2 * centroyy).ToString() + "Y";
            }
            lbResultado.Visible  = true;
            lbResultado.Location = new Point(btContinuar.Location.X, label1.Location.Y + label1.Height + 5);
            lbResultado.Text     = "Ecuación de esta circunferencia:\nX^2 - " + (2 * centroxx).ToString() + "X + Y^2 - " + (2 * centroyy).ToString() + "Y = " + ((radiodouble * radiodouble) - (centroxx * centroxx) - (centroyy * centroyy));
            btContinuar.Hide();
            if (directa)
            {
                lbExplicacion.Hide();
            }
        }
예제 #15
0
        /// <summary>
        ///
        ///PINTA EL PUNTO FINAL DE LA LINEA DE RADIO Y LAS LINEAS CORREPONDIENTES Y CONTINUA CON LA
        ///EXPLICACION
        ///
        /// </summary>
        ///
        private void ContinuarResolucion()
        {
            ventanagrafica.EliminarCirculo(0);
            ventanagrafica.PintarCirculo(apintar, radio, Color.Olive, 2, anguloradio, true);
            double radiodouble = (double)(radio.Numerador / radio.Denominador);
            double centroxx    = (double)apintar.X.Numerador / apintar.X.Denominador;
            double centroyy    = (double)apintar.Y.Numerador / apintar.Y.Denominador;

            lbExplicacion.Hide();
            lbExplicacion.Show();
            lbExplicacion.Text = " Las coordenadas X e Y del punto final del radio, se obtienen sumando o restando el largo de los catetos a las coodenadas X o Y respectivas del centro de la circunferencia.\n Se han añadido a la figura en color amarillo, y puede verse como varian cambiando el ángulo de la línea del radio.\n La ecuación del punto final del radio en este ángulo de la linea del radio es:  " + Racional.AString(radio * radio) + " = ( " + Math.Round((radiodouble * Math.Cos(anguloradio) + centroxx), 4).ToString() + " - " + centroxx.ToString() + " )^2 + ( " + Math.Round((radiodouble * Math.Sin(anguloradio) + centroyy), 4).ToString() + " - " + centroyy.ToString() + ")^2";
            ventanagrafica.Ventana.Invalidate();
            if (directa)
            {
                FinalizarResolucion();
            }
        }
예제 #16
0
        /// <summary>
        ///
        /// CONTRUYE EL PUNTO CON LOS VALORES INTRODUCIDOS EN LAS CAJAS DE TEXTO, CAMBIA EL TEXTO
        /// DEL BOTON ACEPTAR POR CONTINUAR , LO CAMBIA A COLOR VERDE OSCURO y DIBUJA LOS PUNTOS EN
        /// EL AREA GRAFICA
        ///
        /// </summary>
        ///

        private void IniciarResolucion()
        {
            // Valores por defecto
            if (defecto)
            {
                tbPunto1X.Text = "5";
                tbPunto1Y.Text = "3";
                tbPunto2X.Text = "7";
            }
            // Mostrar los controles
            pnZoom.Show();
            btIzquierda.Show();
            btDerecha.Show();
            btArriba.Show();
            btAbajo.Show();
            btCentrar.Show();
            btZoomMas.Show();
            btZoomMenos.Show();
            lbZoomtitulo.Show();
            lbDesplazamiento.Show();
            pnZoom.Location = btContinuar.Location;
            pnParametro.Show();
            pnParametro.Location   = new Point(btContinuar.Location.X, pnZoom.Location.Y + pnZoom.Height + 5);
            btContinuar.Location   = new Point(btContinuar.Location.X, pnParametro.Location.Y + pnParametro.Height + 5);
            lbTituloParametro.Text = "Radianes:";

            lbPorPanel.Hide();
            lbIgualPanel.Hide();
            tbLargoFinal.Hide();
            lbLargoFinal.Hide();
            tbParametro.Location = new Point(tbParametro.Location.X - 50, tbParametro.Location.Y);

            lbTituloParametro.TextAlign = ContentAlignment.MiddleCenter;
            lbTituloParametro.AutoSize  = true;
            lbSegmentoInicial.AutoSize  = true;
            lbTituloParametro.Location  = new Point(lbTituloParametro.Location.X - 30, lbTituloParametro.Location.Y);
            lbSegmentoInicial.Location  = new Point(lbTituloParametro.Location.X + 80, lbTituloParametro.Location.Y);
            tbLargoInicial.Location     = new Point(tbLargoInicial.Location.X + 100, tbLargoInicial.Location.Y);
            tbLargoInicial.Text         = "57,29";
            lbSegmentoInicial.Text      = "Grados: ";
            apintar = new Punto(tbPunto1X.Text + " " + tbPunto1Y.Text + " " + "0");
            radio   = Racional.StringToRacional(tbPunto2X.Text);
            if (radio.Numerador < 0) // El radio no puede ser negativo
            {
                radio = new Racional(radio.Numerador * -1, radio.Denominador);
            }
            anguloradio = 1;
            ventanagrafica.PintarCirculo(apintar, radio, Color.Olive, 2, anguloradio);
            btCentrar.PerformClick();
            if (!directa)
            {
                lbExplicacion.Text = " El radio de la circunferencia en un ángulo determinado, es la hipotenusa de un triángulo rectángulo.\n La imagen representa la circunferencia introducida junto con el triángulo rectángulo en el que: el radio es la hipotenusa, y el largo de los catetos cumple el teorema de Pitágoras.\n Se puede observar como cambia el largo de los catetos cambiando el ángulo en el que se situa la linea del radio pulsando los botones.";
            }
            label1.Show();
            label1.Location  = new Point(btContinuar.Location.X, btContinuar.Location.Y + btContinuar.Height + 5);
            label1.BackColor = Color.Transparent;
            label1.Font      = new Font(label1.Font.FontFamily, 12);
            label1.Text      = "Teorema de Pitágoras aplicado a esta circunferencia:\n";
            double radiodouble = radio.Numerador / radio.Denominador;

            label1.Text += Racional.AString(radio) + "= Ѵ (" + Math.Round(radiodouble * Math.Sin(1), 2).ToString() + "^2 + " + Math.Round(radiodouble * Math.Cos(1), 2).ToString() + "^2 )  ";
            Controls.Add(ventanagrafica.Ventana);
            if (directa)
            {
                ContinuarResolucion();
            }
            paso = 1;
            ventanagrafica.Ventana.Invalidate();
        }
예제 #17
0
        /// <summary>
        ///
        /// CONTRUYE EL SISTEMA IGUALANDO LAS ECUACIONES DE CADA
        /// PLANO, PINTA EL PUNTO DE PASO DE LA RECTA DE INTERSECCION  Y CONTINUA LA EXPLICACION
        ///
        /// </summary>
        ///
        private void ContinuarResolucion()
        {
            // Construir la recta de interseccion
            interseccion = plano1.Interseccion(plano2);

            // Determinar la variable que se consideró nula
            int  contador     = 0;
            char variablenula = '\0';

            foreach (Racional r in interseccion.PuntoDePaso.Coordenadas)
            {
                if (r.Numerador == 0)
                {
                    variablenula = (char)((int)'X' + contador);
                }
                contador++;
            }

            lbExplicacion.Text = " Obtenemos un punto de paso de la línea de intersección, construyendo un sistema con las ecuaciones de cada plano y dando valor cero a una de las variables. En este caso, le damos valor cero a la coordenada " + variablenula + ".";

            if (!directa)
            {
                // Construir la ventana flotante
                flotante = new ControlesFlotantes();
                flotante.Show();
                flotante.Text          = " ";
                flotante.StartPosition = FormStartPosition.Manual;
                flotante.Location      = pnDatos.Location;
                flotante.Opacity       = 1;

                // Mostrar el sistema de ecuaciones
                int nula = variablenula - 'X';
                label2.Visible   = true;
                label2.AutoSize  = true;
                label2.Font      = new Font(label2.Font.FontFamily, 10);
                label2.BackColor = Color.Transparent;
                label2.Text      = "Sistema con las ecuaciones de cada plano con : " + variablenula + " = 0.";
                label2.Text     += "\n";
                for (int i = 0; i < plano1.EcuacionDelPlano().CantidadDeTerminosIzquierda; i++)
                {
                    if (plano1.EcuacionDelPlano().ObtenerTerminoIzquierda(i).Variables[0] != variablenula)
                    {
                        label2.Text += plano1.EcuacionDelPlano().ObtenerTerminoIzquierda(i).ToString();
                    }
                }
                label2.Text += " = " + Racional.AString(plano1.EcuacionDelPlano().ObtenerTerminoDerecha(0).Coeficiente);
                label2.Text += "\n";
                for (int i = 0; i < plano2.EcuacionDelPlano().CantidadDeTerminosIzquierda; i++)
                {
                    if (plano2.EcuacionDelPlano().ObtenerTerminoIzquierda(i).Variables[0] != variablenula)
                    {
                        label2.Text += plano2.EcuacionDelPlano().ObtenerTerminoIzquierda(i).ToString();
                    }
                }
                label2.Text += " = " + Racional.AString(plano2.EcuacionDelPlano().ObtenerTerminoDerecha(0).Coeficiente);
                flotante.Controls.Add(label2);
                label2.Location = new Point(5, 5);


                // Mostrar el punto de paso
                label2.Text += "\n\n X: " + Racional.AString(interseccion.PuntoDePaso.X) + "\n Y: " + Racional.AString(interseccion.PuntoDePaso.Y) + "\n Z: " + Racional.AString(interseccion.PuntoDePaso.Z);

                // Pintar el punto de paso de la recta de interseccion
                ventanagrafica.PintarPunto(interseccion.PuntoDePaso, 5, false, Color.Red);
                flotante.Size = new Size(flotante.Width, label2.Height + 65);
            }

            ventanagrafica.Ventana.Invalidate();
            if (!directa)
            {
                btContinuar.Show();
            }
            if (directa)
            {
                PrepararResultado();
            }
        }
예제 #18
0
        /// <summary>
        ///
        /// CONSTRUYE LOS DOS VECTORES A SUMAR O RESTAR SEGUN LOS DATOS INTRODUCIDOS EN LAS CAJAS
        /// DE LAS COMPONENTES Y LOS REPRESENTA EN PANTALLA
        ///
        /// </summary>
        ///
        private void IniciarResolucion()
        {
            // Mostrar los controles
            lbTituloAnguloX.Visible = true; btIsometrica.Visible = true;
            lbAnguloX.Visible       = true; btAlzado.Visible = true;
            sbAngulox.Visible       = true; btPerfil.Visible = true;
            lbTituloAnguloY.Visible = true; btPlanta.Visible = true;
            lbAnguloY.Visible       = true;
            sbAnguloY.Visible       = true;
            lbTituloAnguloZ.Visible = true;
            lbAnguloZ.Visible       = true;
            sbAnguloZ.Visible       = true;
            btZoomMas.Visible       = true;
            btZoomMenos.Visible     = true;
            lbZoomtitulo.Visible    = true;
            lbAjustar.Visible       = true;
            btAjustar.Visible       = true;
            pnZoom.Visible          = true;
            btAbajo.Visible         = true;
            btArriba.Visible        = true;
            btDerecha.Visible       = true;
            btIzquierda.Visible     = true;
            btCentrar.Visible       = true;
            btContinuar.Visible     = true;

            if (defecto)
            {
                punto1                = new Punto("26 10 25");
                tbPunto1X.Text        = Racional.AString(punto1.X);
                tbPunto1Y.Text        = Racional.AString(punto1.Y);
                tbPunto1Z.Text        = Racional.AString(punto1.Z);
                punto2                = new Punto("14 30 5");
                tbPunto2X.Text        = Racional.AString(punto2.X);
                tbPunto2Y.Text        = Racional.AString(punto2.Y);
                tbPunto2Z.Text        = Racional.AString(punto2.Z);
                ventanagrafica.Escala = 1.3F;
            }

            vector1 = new Vector(tbPunto1X.Text + " " + tbPunto1Y.Text + " " + tbPunto1Z.Text);
            vector2 = new Vector(tbPunto2X.Text + " " + tbPunto2Y.Text + " " + tbPunto2Z.Text);
            punto1  = new Punto(tbPunto1X.Text + " " + tbPunto1Y.Text + " " + tbPunto1Z.Text);
            punto2  = new Punto(tbPunto2X.Text + " " + tbPunto2Y.Text + " " + tbPunto2Z.Text);
            // Pintar los vectores
            ventanagrafica.PintarVector(new Punto("0 0 0"), new Punto(tbPunto1X.Text + " " + tbPunto1Y.Text + " " + tbPunto1Z.Text), Color.DarkOrange, 7, true);
            ventanagrafica.PintarVector(new Punto("0 0 0"), new Punto(tbPunto2X.Text + " " + tbPunto2Y.Text + " " + tbPunto2Z.Text), Color.SlateBlue, 7, true);
            btIsometrica.PerformClick();
            if (!defecto)
            {
                btAjustar.PerformClick();
            }
            if (!directa)
            {
                lbExplicacion.Text = " El ángulo entre dos vectores θ, se mide sobre el plano que los contiene a ambos.\n La fórmula para calcularlo es: cos θ = ( U * V ) / ( |U| * |V| ).\n Esta fórmula se extrae de la ley de los cosenos: | W |² = | U |² + |V|² - 2 |U| * |V| * cos θ.  Pulse el botón [ Demostración ] para ver como se extrae. ";
            }
            // Pintar el plano entre los vectores
            Punto final1 = new Punto(new Racional[] { vector1.Componentes[0] / 2, vector1.Componentes[1] / 2, vector1.Componentes[2] / 2 });
            Punto final2 = new Punto(new Racional[] { vector2.Componentes[0] / 2, vector2.Componentes[1] / 2, vector2.Componentes[2] / 2 });

            ventanagrafica.PintarSuperficie(new Punto[] { final1, final2, new Punto("0 0 0") }, Color.Chartreuse, false);
            //Pintar las letras que identifican cada vector
            Punto  situacionU = Punto.PuntoMedio(new Punto("0 0 0"), new Punto(vector1.Componentes));
            PointF finalv1    = ventanagrafica.PuntoAPoint(new Punto(vector1.Componentes));
            double pendiente  = finalv1.Y / finalv1.X;

            situacionU.Coordenadas[1] -= 1;
            situacionU.Coordenadas[2] -= 1;
            Punto situacionV = Punto.PuntoMedio(new Punto("0 0 0"), new Punto(vector2.Componentes));

            situacionV.Coordenadas[1] -= 1;
            situacionV.Coordenadas[2] -= 1;
            ventanagrafica.PintarString(situacionU, Color.Orange, 14, "U");
            ventanagrafica.PintarString(situacionV, Color.SlateBlue, 14, "V");
            // Mover las etiquetas para dejar sitio a los signos de multiplicar y el desarrollo de las operaciones
            label35.Location   = new Point(label35.Location.X, label35.Location.Y - 15);
            label36.Location   = new Point(label36.Location.X, label36.Location.Y - 15);
            label37.Location   = new Point(label37.Location.X, label37.Location.Y - 15);
            lbRotuloA.Location = new Point(lbRotuloA.Location.X, lbRotuloA.Location.Y - 15);
            tbPunto1X.Location = new Point(tbPunto1X.Location.X, tbPunto1X.Location.Y - 15);
            tbPunto1Y.Location = new Point(tbPunto1Y.Location.X, tbPunto1Y.Location.Y - 15);
            tbPunto1Z.Location = new Point(tbPunto1Z.Location.X, tbPunto1Z.Location.Y - 15);
            // Mostrar las etiquetas con los signos
            label1.Show();
            label1.Text      = "*";
            label1.BackColor = Color.Transparent;
            label1.Font      = new Font(label1.Font.FontFamily, 15, FontStyle.Bold);
            pnDatos.Controls.Add(label1);
            label1.Location = new Point(tbPunto1X.Location.X + (tbPunto1X.Width / 2) - 5, (tbPunto1X.Location.Y + tbPunto2X.Location.Y) / 2 + 2);

            label2.Show();
            label2.Text      = "*";
            label2.BackColor = Color.Transparent;
            label2.Font      = new Font(label1.Font.FontFamily, 15, FontStyle.Bold);
            pnDatos.Controls.Add(label2);
            label2.Location = new Point(tbPunto1Y.Location.X + (tbPunto1Y.Width / 2) - 5, label1.Location.Y);

            label3.Show();
            label3.Text      = "*";
            label3.BackColor = Color.Transparent;
            label3.Font      = new Font(label1.Font.FontFamily, 15, FontStyle.Bold);
            pnDatos.Controls.Add(label3);
            label3.Location = new Point(tbPunto1Z.Location.X + (tbPunto1Z.Width / 2) - 5, label1.Location.Y);

            label4.Show();
            label4.Text = Racional.AString(vector1.Componentes[0] * vector2.Componentes[0]);
            label4.Font = new Font(label1.Font.FontFamily, 10, FontStyle.Bold);
            pnDatos.Controls.Add(label4);
            label4.Location  = new Point(tbPunto1X.Location.X, tbPunto2X.Location.Y + tbPunto2X.Height);
            label4.BackColor = Color.Transparent;

            label5.Show();
            label5.BackColor = Color.Transparent;
            label5.Text      = " + ";
            label5.Font      = new Font(label1.Font.FontFamily, 10, FontStyle.Bold);
            pnDatos.Controls.Add(label5);
            label5.Location  = new Point(tbPunto1X.Location.X + tbPunto2X.Width, label4.Location.Y);
            label4.BackColor = Color.Transparent;

            label6.Show();
            label6.Text = Racional.AString(vector1.Componentes[1] * vector2.Componentes[1]);
            label6.Font = new Font(label1.Font.FontFamily, 10, FontStyle.Bold);
            pnDatos.Controls.Add(label6);
            label6.Location  = new Point(tbPunto1Y.Location.X, label5.Location.Y);
            label6.BackColor = Color.Transparent;

            label7.Show();
            label7.BackColor = Color.Transparent;
            label7.Text      = " + ";
            label7.Font      = new Font(label1.Font.FontFamily, 10, FontStyle.Bold);
            pnDatos.Controls.Add(label7);
            label7.Location  = new Point(tbPunto1Y.Location.X + tbPunto2X.Width, label6.Location.Y);
            label7.BackColor = Color.Transparent;

            label8.Show();
            label8.Text = Racional.AString(vector1.Componentes[2] * vector2.Componentes[2]);
            label8.Font = new Font(label1.Font.FontFamily, 10, FontStyle.Bold);
            pnDatos.Controls.Add(label8);
            label8.Location  = new Point(tbPunto1Z.Location.X, label5.Location.Y);
            label8.BackColor = Color.Transparent;

            label9.Show();
            label9.BackColor = Color.Chartreuse;
            label9.Text      = " = " + Racional.AString(vector1 * vector2);
            label9.Font      = new Font(label1.Font.FontFamily, 13, FontStyle.Bold);
            label9.Location  = new Point(pnDatos.Location.X + pnDatos.Width, pnDatos.Location.Y + pnDatos.Height - 21);

            label10.Show();
            label10.Font      = new Font(label8.Font.FontFamily, 9, FontStyle.Underline);
            label10.BackColor = Color.Transparent;
            label10.Text      = "Producto punto (U*V): ";
            pnDatos.Controls.Add(label10);
            label10.Location = new Point(label35.Location.X - 130, label8.Location.Y);

            if (!directa)
            {
                btDemostracion.Show();
            }
            // Mostrar los modulos de los vectores
            label11.Show();
            label11.Font      = new Font(label10.Font.FontFamily, 10, FontStyle.Bold);
            label11.Location  = new Point(btContinuar.Location.X, btContinuar.Location.Y + btContinuar.Height + 5);
            label11.BackColor = Color.Transparent;
            label11.Text      = "Módulo del vector 1 ( | U | ): ";

            label12.Show();
            label12.Font      = new Font(label11.Font.FontFamily, 13, FontStyle.Bold);
            label12.Location  = new Point(label11.Location.X + label11.Width, label11.Location.Y);
            label12.BackColor = Color.DarkOrange;
            label12.Text      = Math.Round(vector1.ModuloDecimal(), 2).ToString();

            label13.Show();
            label13.Font      = new Font(label10.Font.FontFamily, 10, FontStyle.Bold);
            label13.Location  = new Point(btContinuar.Location.X, label11.Location.Y + label11.Height + 10);
            label13.BackColor = Color.Transparent;
            label13.Text      = "Módulo del vector 2 ( | V | ): ";

            label14.Show();
            label14.Font      = new Font(label11.Font.FontFamily, 13, FontStyle.Bold);
            label14.Location  = new Point(label13.Location.X + label13.Width, label13.Location.Y);
            label14.BackColor = Color.SlateBlue;
            label14.Text      = Math.Round(vector2.ModuloDecimal(), 2).ToString();

            // Mostrar la formula del angulo entre vectores
            label15.Show();
            label15.Font      = label14.Font;
            label15.Location  = new Point(btContinuar.Location.X, label14.Location.Y + label14.Height + 5);
            label15.BackColor = Color.LightYellow;
            label15.Text      = "           U * V " + "\ncos Φ = ----------" + "\n             |U| * |V|";

            if (directa)
            {
                paso++;
                lbExplicacion.Hide();
                Finalizar();
            }
        }