/// <summary> /// ///DIBUJA EL PUNTO DE INTERSECCION DE LA RECTA CON EL PLANO, LO MUESTRA EN LA ETIQUETA Y SIGUE ///LA EXPLICACION /// /// /// </summary> /// private void SeguirResolucion() { lbExplicacion.Text = " Una vez obtenida la ecuación de la recta, hay que calcular el punto de intersección de la recta con el plano. ( Ver como calcular el punto de intersección entre recta y plano en el menú anterior. )"; // Definir el punto de interseccion puntointerseccion = plano.Interseccion(recta); // Pintar el punto de interseccion ventanagrafica.PintarPunto(puntointerseccion, 10, false, Color.Yellow); // Mostrar el punto de interseccion en la etiqueta label1.Text += "\n Punto de Intersección entre recta y plano: \n" + Math.Round(puntointerseccion.X.ToDouble(), 4).ToString() + " X ; " + Math.Round(puntointerseccion.Y.ToDouble(), 4).ToString() + " Y ; " + Math.Round(puntointerseccion.Z.ToDouble(), 4).ToString() + " Z"; if (!directa) { btZoomMas.PerformClick(); btZoomMenos.PerformClick(); } if (directa) { FinalizarResolucion(); } }
/// <summary> /// ///DIBUJA EL PUNTO DE INTERSECCION DE LA RECTA CON EL PLANO, LO MUESTRA EN LA ETIQUETA Y SIGUE ///LA EXPLICACION /// /// /// </summary> /// private void SeguirResolucion() { lbExplicacion.Text = " Con la ecuación del plano y las ecuaciones parámetricas de la recta, calculamos el punto de intersección de la recta con el plano. ( De color rojo en el gráfico.)"; if (!directa) { label1.Text += "\n\nPunto de intersección:\n"; label1.Text += "X: " + Math.Round(plano.Interseccion(linea1).X.ToDouble(), 4).ToString(); label1.Text += "\nY: " + Math.Round(plano.Interseccion(linea1).Y.ToDouble(), 4).ToString(); label1.Text += "\nZ: " + Math.Round(plano.Interseccion(linea1).Z.ToDouble(), 4).ToString(); } interseccion = plano.Interseccion(linea1); ventanagrafica.PintarPunto(interseccion, 12, false, Color.Red); ventanagrafica.EliminarLinea(0); ventanagrafica.PintarLinea(punto1, interseccion, Color.DarkOrange, 5); ventanagrafica.PintarLinea(interseccion, punto2, Color.FromArgb(10, Color.DarkOrange), 2); btCentrar.PerformClick(); if (directa) { FinalizarResolucion(); } }
/// <summary> /// /// MUESTRA LAS COORDENADAS DEL PUNTO DE INTERSECCION APLICANDO EL PARAMETRO A CADA UNA /// DE LAS ECUACIONES DE LA RECTA Y DIBUJA EL PUNTO DE INTERSECCION Y EXTIENDE LA RECTA HASTA /// LLEGAR AL PUNTO /// /// </summary> /// private void FinalizarResolucion() { btContinuar.Hide(); lbExplicacion.Text = " Por último, basta con aplicar el parámetro obtenido a las ecuaciones paramétricas de la recta, para obtener las coordenadas x, y , z del punto de intersección buscado.\n(Mostrado en el gráfico en color rojo.)"; // Dibujar el punto de interseccion de la recta con el plano ventanagrafica.PintarPunto(plano.Interseccion(linea1), 10, false, Color.Red); // Dibujar la linea que va desde el punto inicial al punto de interseccion de la recta con el plano si el punto esta fuera del segmento de recta if (new Vector(punto1, punto2).ModuloDecimal() < new Vector(punto1, plano.Interseccion(linea1)).ModuloDecimal() || new Vector(punto1, punto2).ModuloDecimal() < new Vector(punto2, plano.Interseccion(linea1)).ModuloDecimal()) { if (parametro < 0) { ventanagrafica.PintarLinea(punto2, plano.Interseccion(linea1), Color.DarkOrange, 3); } else { ventanagrafica.PintarLinea(punto1, plano.Interseccion(linea1), Color.DarkOrange, 3); } } btCentrar.PerformClick(); lbResultado.Show(); lbResultado.Location = new Point(10, lbExplicacion.Height + 10); lbResultado.Text = "Punto de intersección = " + Math.Round(plano.Interseccion(linea1).X.ToDouble(), 6).ToString() + "x ;" + Math.Round(plano.Interseccion(linea1).Y.ToDouble(), 6).ToString() + "y ;" + Math.Round(plano.Interseccion(linea1).Z.ToDouble(), 6).ToString() + "z "; ventanagrafica.PintarPunto(plano.Interseccion(linea1), 10, true, Color.Red); //Reducir la precision de las coordenadas del punto de interseccion para evitar overflow Punto interseccion = plano.Interseccion(linea1); Racional[] coords = interseccion.Coordenadas; Racional[] reducida = new Racional[coords.Length]; int cont = 0; foreach (Racional r in coords) { double s = Math.Round(r.ToDouble(), 10); reducida[cont] = s; cont++; } interseccion = new Punto(reducida); ventanagrafica.PintarLinea(punto2, interseccion, Color.Chartreuse, 3); ventanagrafica.PintarPlano(new Vector(punto4.Coordenadas), plano.Interseccion(linea1), 10, Color.Chartreuse); btCentrar.PerformClick(); }
/// <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 EL PLANO, EL PUNTO Y INICIA/ LA EXPLICACION /// /// </summary> /// private void IniciarResolucion() { btDefecto.Hide(); if (defecto) { this.Focus(); btContinuar.Visible = true; this.AcceptButton = this.btContinuar; paso++; //Vector perpendicular tbPunto1X.Text = "2"; tbPunto1Y.Text = "6"; tbPunto1Z.Text = "3"; //Punto de paso tbPunto2X.Text = "15"; tbPunto2Y.Text = "26"; tbPunto2Z.Text = "10"; // Punto del que se quiere encontrar la distancia al plano tbPunto3X.Text = "50"; tbPunto3Y.Text = "60"; tbPunto3Z.Text = "45"; } // 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; // Crear el vector perpendicular al plano perpendicular = new Vector(tbPunto1X.Text + " " + tbPunto1Y.Text + " " + tbPunto1Z.Text); // Crear el punto de paso del plano puntopasoplano = new Punto(tbPunto2X.Text + " " + tbPunto2Y.Text + " " + tbPunto2Z.Text); // Crear el punto del que se quiere encontrar la distancia al plano punto = new Punto(tbPunto3X.Text + " " + tbPunto3Y.Text + " " + tbPunto3Z.Text); // Crear el plano plano = new Plano(perpendicular, puntopasoplano); // Crear la recta perpendicular al plano y que pasa por el punto recta = new Recta(punto, plano.VectorPerpendicular); // Obtener el punto de interseccion de la recta con el plano puntointerseccion = plano.Interseccion(recta); // Punto oculto para establecer la escala Punto ficticio = plano.ADistanciaXY(35, 35); if (ficticio != null) { ventanagrafica.PintarVector(ficticio, ficticio, Color.Black, 1, false); } else { ficticio = new Punto("35 35 35"); ventanagrafica.PintarVector(ficticio, ficticio, Color.Black, 1, false); } if (directa) { lbExplicacion.Hide(); } lbExplicacion.Text = " La distancia entre el punto y el plano, es el módulo del vector que vá desde el punto inicial, al punto donde una recta perpendicular al plano y que pasa por el punto inicial, corta al plano."; // Calcular el tamaño del plano para que pase por el punto de interseccion con la recta perpendicular Racional dist = plano.PuntoDePaso.Distancia(puntointerseccion); int tamaño = (int)dist.ToDouble(); if (tamaño == 0) { tamaño = 5; } // Pintar el plano ventanagrafica.PintarPlano(plano.VectorPerpendicular, puntointerseccion, 50 + tamaño, Color.Chartreuse); // Pintar el punto ventanagrafica.PintarPunto(punto, 10, true, Color.Coral); if (!directa) { btAjustar.PerformClick(); } btIsometrica.PerformClick(); if (directa) { ContinuarResolucion(); } paso = 1; }
/// <summary> /// /// DIBUJA LA RECTA, EL PLANO E INICIA LA EXPLICACION /// /// </summary> /// private void IniciarResolucion() { btDefecto.Hide(); // Valores por defecto if (defecto) { this.Focus(); btContinuar.Visible = true; this.AcceptButton = this.btContinuar; paso++; tbPunto1X.Text = "33"; tbPunto1Y.Text = "12"; tbPunto1Z.Text = "8"; tbPunto2X.Text = "3"; tbPunto2Y.Text = "5"; tbPunto2Z.Text = "10"; tbPunto3X.Text = "4"; tbPunto3Y.Text = "13"; tbPunto3Z.Text = "-9"; tbPunto4X.Text = "2"; tbPunto4Y.Text = "-1"; tbPunto4Z.Text = "3"; } // 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); // Punto inicial de la recta punto2 = new Punto(tbPunto2X.Text + " " + tbPunto2Y.Text + " " + tbPunto2Z.Text); // Punto final de la recta punto3 = new Punto(tbPunto3X.Text + " " + tbPunto3Y.Text + " " + tbPunto3Z.Text); // Punto de paso del plano punto4 = new Punto(tbPunto4X.Text + " " + tbPunto4Y.Text + " " + tbPunto4Z.Text); // Vector perpendicular al plano lbExplicacion.Text = " El punto de intersección, será un punto que estará a la vez en el plano y en la recta. Por lo tanto, el punto buscado debe cumplir tanto la ecuación de la recta, como la ecuación del plano."; if (directa) { lbExplicacion.Hide(); } // // Crear el objeto linea. linea1 = new Recta(punto1, punto2); // Dibujar el segmento de linea entre los puntos introducidos. ventanagrafica.PintarLinea(punto1, punto2, Color.DarkOrange, 3F); // Crear el objeto plano plano = new Plano(new Vector(punto4.Coordenadas), punto3); // Dibujar el plano segun el vector y punto de paso introducidos. Racional factor = plano.Interseccion(linea1).CoordenadaMaxima; // Para hacer el plano mas o menos grande segun donde esté el punto de interseccion ventanagrafica.PintarPlano(new Vector(punto4.Coordenadas), punto3, 50, Color.Chartreuse); // Mostrar la ecuacion paramétrica de la rectas if (!directa) { label1.Show(); } label1.Location = new Point(btContinuar.Location.X + btContinuar.Width + 5, btContinuar.Location.Y);// + btContinuar.Height + 10); label1.BackColor = Color.Transparent; label1.Font = new Font(label1.Font.FontFamily, 10); label1.Text = "Ecuaciones paramétricas de la recta:\n"; foreach (Ecuacion e in linea1.EcuacionesParametricas()) { // label1.Text += e.ToString() + "\n"; label1.Text += e.ObtenerLadoIzquierdo.ToString() + " = " + Math.Round(e.ObtenerTerminoDerecha(0).Coeficiente.ToDouble(), 4).ToString(); if (e.ObtenerTerminoDerecha(1).Coeficiente.Numerador > 0) { label1.Text += " + "; } label1.Text += Math.Round(e.ObtenerTerminoDerecha(1).Coeficiente.ToDouble(), 4).ToString() + "p\n"; } // Mostrar la ecuacion del plano if (!directa) { label2.Show(); } label2.Location = new Point(label1.Location.X, label1.Location.Y + label1.Height + 10); label2.Font = label1.Font; label2.BackColor = Color.Transparent; label2.Text = "Ecuación del plano: \n"; label2.Text += plano.ToString(); btIsometrica.PerformClick(); if (directa) { ContinuarResolucion(); } paso = 1; }