/// <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(); } }
/// <summary> /// /// DIBUJA EL PLANO PERPENDICULAR A LA RECTA Y QUE PASA POR EL PUNTO , MUESTRA LA ECUACION DEL /// PLANO Y CONTINUA LA EXPLICACION /// /// </summary> /// private void ContinuarResolucion() { lbExplicacion.Text = "Construimos la ecuación del plano, con el punto del cual queremos conocer la distancia a la recta como punto de paso del plano, y el vector paralelo a la recta como vector perpendicular al plano."; Vector perpendicular = new Vector(punto1, punto2); // Construir el plano plano = new Plano(perpendicular, punto3); if (!directa) { // Mostrar la ecuacion del plano 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, 10); label1.Text = "Ecuación del plano:\n"; foreach (Termino t in plano.EcuacionDelPlano().ObtenerLadoIzquierdo.Terminos) { if (t.Coeficiente.Numerador > 0) { label1.Text += " + "; } label1.Text += Math.Round(t.Coeficiente.ToDouble(), 4).ToString() + t.Variables[0]; } label1.Text += " = " + Math.Round(plano.EcuacionDelPlano().ObtenerTerminoDerecha(0).Coeficiente.ToDouble(), 4).ToString(); } // Dibujar el plano long tamaño = (long)perpendicular.ModuloDecimal() * 2; // Para determinar el tamaño en funcion del largo de la recta ventanagrafica.PintarPlano(perpendicular, punto3, tamaño, Color.Chartreuse); btCentrar.PerformClick(); if (directa) { SeguirResolucion(); } }
/// <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(); } }
/// <summary> /// /// DIBUJA LOS PLANOS /// /// </summary> /// private void IniciarResolucion() { btDefecto.Hide(); if (defecto) { this.Focus(); btContinuar.Visible = true; this.AcceptButton = this.btContinuar; paso++; //Punto de paso 1 tbPunto1X.Text = "0"; tbPunto1Y.Text = "10"; tbPunto1Z.Text = "10"; //Vector perpendicular 1 tbPunto2X.Text = "0"; tbPunto2Y.Text = "10"; tbPunto2Z.Text = "0"; //Punto de paso 2 tbPunto3X.Text = "0"; tbPunto3Y.Text = "0"; tbPunto3Z.Text = "20"; //Vector perpendicular 2 tbPunto4X.Text = "0"; tbPunto4Y.Text = "0"; tbPunto4Z.Text = "10"; } // 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; btDefecto.Hide(); punto1 = new Punto(tbPunto1X.Text + " " + tbPunto1Y.Text + " " + tbPunto1Z.Text); punto2 = new Punto(tbPunto3X.Text + " " + tbPunto3Y.Text + " " + tbPunto3Z.Text); vector1 = new Vector(tbPunto2X.Text + " " + tbPunto2Y.Text + " " + tbPunto2Z.Text); vector2 = new Vector(tbPunto4X.Text + " " + tbPunto4Y.Text + " " + tbPunto4Z.Text); lbExplicacion.Text = " Todo punto de la línea de intersección entre los dos planos, pertenecerá a ambos. Por lo tanto,todo punto de la recta de intersección cumplirá las ecuaciones de los dos planos."; if (directa) { lbExplicacion.Hide(); } // Construir los planos plano1 = new Plano(vector1, punto1); plano2 = new Plano(vector2, punto2); // Mostrar las ecuaciones de los planos label1.Show(); label1.Location = new Point(btContinuar.Location.X + btContinuar.Width + 5, btContinuar.Location.Y); label1.Font = new Font(label1.Font.FontFamily, 10); label1.BackColor = Color.Transparent; label1.Text = "Ecuación del plano1: \n" + plano1.EcuacionDelPlano().ToString() + " \n\n Ecuación del plano2: \n" + plano2.EcuacionDelPlano().ToString(); // Dibujar los planos Vector escalado1 = new Vector(vector1); escalado1.MultiplicarPorEscalar(10); ventanagrafica.PintarPlano(escalado1, punto1, 50, Color.DarkOrange); ventanagrafica.PintarPlano(vector2, punto2, 50, Color.SlateBlue); // Punto oculto para que se ajuste la escala al tamaño de los planos Vector posicion1 = new Vector(plano1.PuntoDePaso.Coordenadas); // Vector de posicion del punto de paso del 1er plano Vector posicion2 = new Vector(plano2.PuntoDePaso.Coordenadas); // Vector de posicion del punto de paso del 2º plano if (posicion1.ModuloDecimal() > posicion2.ModuloDecimal()) { Vector ampliado = new Vector(posicion1); ampliado.MultiplicarPorEscalar(10); oculto = new Punto(ampliado.Componentes); } else { Vector ampliado = new Vector(posicion1); ampliado.MultiplicarPorEscalar(2); oculto = new Punto(ampliado.Componentes); } ventanagrafica.PintarPunto(oculto, 1, false, Color.Black); btIsometrica.PerformClick(); btAjustar.PerformClick(); if (directa) { ContinuarResolucion(); } paso = 1; }
/// <summary> /// /// SUSTITUYE LOS VALORES X, Y, Z EN LA ECUACION DEL PLANO, POR LA ECUACION PARAMETRICA DE LA /// RECTA CORRESPONDIENTE Y REALIZA LAS OPERACIONES PASO A PASO PARA DESPEJAR EL VALOR DEL /// PARAMETRO P /// /// </summary> /// private void ContinuarResolucion() { lbExplicacion.Text = " Para encontrar el punto que está en la recta y en el plano seguimos los siguientes pasos:\n Sustituimos los valores x,y,z de la ecuación del plano por la correspondiente ecuación paramétrica de la recta, eliminamos parentesis, simplificamos y despejamos P."; if (!directa) { flotante = new ControlesFlotantes(); flotante.Show(); label3.Show(); flotante.Controls.Add(label3); label3.Location = new Point(5, 5); label3.BackColor = Color.Transparent; label3.Font = new Font(label3.Font.FontFamily, 12); label3.Text = "Sustituir: \n"; flotante.AutoSize = true; flotante.StartPosition = FormStartPosition.Manual; flotante.Location = new Point(pnDatos.Location.X - flotante.Width - 5, pnDatos.Location.Y + 20); flotante.Opacity = 1; // ESCRIBIR EL DESARROLLO DE LAS SUSTITUCIONES EN LA ETIQUETA // Coeficientes de las incognitas en la ecuacion del plano en formato double double coeficientex = plano.EcuacionDelPlano().ObtenerTerminoIzquierda(0).Coeficiente.ToDouble(); double coeficientey = plano.EcuacionDelPlano().ObtenerTerminoIzquierda(1).Coeficiente.ToDouble(); double coeficientez = plano.EcuacionDelPlano().ObtenerTerminoIzquierda(2).Coeficiente.ToDouble(); // Coeficiente del termino independiente de la ecuacion del plano en formato double independiente = plano.EcuacionDelPlano().ObtenerTerminoDerecha(0).Coeficiente.ToDouble(); // Coordenadas del punto de paso de la recta en formato double double ax = punto1.X.ToDouble(); double ay = punto1.Y.ToDouble(); double az = punto1.Z.ToDouble(); // Componentes del vector unitario paralelo a la recta en formato double double vpi = linea1.VectorParalelo.Componentes[0].ToDouble(); double vpj = linea1.VectorParalelo.Componentes[1].ToDouble(); double vpk = linea1.VectorParalelo.Componentes[2].ToDouble(); label3.Text += Math.Round(coeficientex, 4).ToString() + " * (" + Math.Round(ax, 4).ToString(); if (vpi > 0) { label3.Text += " + "; } label3.Text += Math.Round(vpi, 4).ToString() + "P )"; if (coeficientey > 0) { label3.Text += " + "; } label3.Text += Math.Round(coeficientey, 4).ToString() + " * ( " + Math.Round(ay, 4).ToString(); if (vpj > 0) { label3.Text += " + "; } label3.Text += Math.Round(vpj, 4).ToString() + "P )"; if (coeficientez > 0) { label3.Text += " + "; } label3.Text += Math.Round(coeficientez, 4).ToString() + " * (" + Math.Round(az, 4).ToString(); if (vpk > 0) { label3.Text += " + "; } label3.Text += Math.Round(vpk, 4).ToString() + "P ) = " + Math.Round(independiente, 4).ToString(); label3.Text += "\n\n Eliminar parentesis: \n"; n1 = coeficientex * ax; p1 = coeficientex * vpi; n2 = coeficientey * ay; p2 = coeficientey * vpj; n3 = coeficientez * az; p3 = coeficientez * vpk; label3.Text += Math.Round(n1, 4).ToString(); if (p1 > 0) { label3.Text += " + "; } label3.Text += Math.Round(p1, 4).ToString() + "P"; if (n2 > 0) { label3.Text += " + "; } label3.Text += Math.Round(n2, 4).ToString(); if (p2 > 0) { label3.Text += " + "; } label3.Text += Math.Round(p2, 4).ToString() + "P"; if (n3 > 0) { label3.Text += " + "; } label3.Text += Math.Round(n3, 4).ToString(); if (p3 > 0) { label3.Text += " + "; } label3.Text += Math.Round(p3, 4).ToString() + "P = " + Math.Round(independiente, 4).ToString(); // Determinar el parametro double sumap = p1 + p2 + p3; double suman = independiente + n1 * -1 + n2 * -1 + n3 * -1; parametro = suman / sumap; label3.Text += "\n\n Simplificar y despejar\n"; label3.Text += "P = " + Math.Round(parametro, 4).ToString(); } if (directa) { FinalizarResolucion(); } }