lunes, 2 de mayo de 2016

POO: IMPLEMENTACIÓN BÁSICA DE MÉTODOS DE RESOLUCIÓN DE TRIÁNGULOS OBLICUÁNGULOS


Se les llama triángulos oblicuángulos, a aquellos triángulos que no poseen ángulos internos de 90 grados (es decir, no son triángulos rectángulos).


A, B y C: Lados del triángulo

a, b, c: Ángulos internos del triángulo

Si para los triángulos rectángulos se tiene el teorema de Pitágoras para su resolución, aparte de las funciones trigonométricas, para los triángulos oblicuángulos se tienen las llamadas ley del seno y del coseno.

Ley del seno: La medida de cada lado del triángulo oblicuángulo es proporcional al seno del ángulo interno opuesto a dicho lado.


Ley del coseno: El cuadrado de la medida de un lado de un triángulo oblicuángulo es igual a la suma de los cuadrados de los otros dos lados menos el doble producto de la medida de los mismos por el coseno del ángulo interno que forman entre ellos.


A continuación se presenta una implementación muy básica de estas leyes, utilizando el lenguaje Java, por medio de una clase de Java en donde se codifican cuatro métodos.

1) El primer método utiliza la ley del seno para calcular la medida del lado A cuando se conocen las medidas del lado B, del ángulo b opuesto al lado B y del ángulo a opuesto al lado A: 
2) El segundo método utiliza la ley del seno para calcular la medida del ángulo a cuando se conocen las medidas de los lados A, B y el ángulo b opuesto al lado B:
3) El tercero método utiliza la ley del coseno para calcular la medida de un lado A cuando se conocen las medidas de los lados B y C y el ángulo a entre B y C: 
4) El cuarto método utiliza la ley del coseno para calcular la medida del ángulo a cuando se conocen las medidas de los lados A, B y C:

Para la prueba del código se utilizó el siguiente triángulo oblicuángulo:

A = 3 unidades de longitud
B = 5 unidades de longitud
C = 7 unidades de longitud
a = 21 grados
b = 35 grados
c = 124 grados


Código:
/**
 * PruebaOblicuangulos.java
 * Implementación básica de métodos que aplican la ley del seno y la ley del
 * coseno para la resolución de triángulos oblicuángulos, tanto para calcular
 * ángulos internos como lados de dichos triángulos.
 * 
 * @author J.B.
 */
  
class Oblicuangulo
{
    // En esta clase se implementan en forma básica métodos para calcular
    // las medidas de lados y ángulos internos de un triángulo oblicuángulo
    // utilizando las leyes del seno y del coseno
   
    Oblicuangulo() {}
   
    double senoCalcularLadoA(double ladoB, double anguloA, double anguloB)
    {
        // Aplica ley del seno para calcular un lado del triángulo
        // Cuando se conoce un lado B, el ángulo opiesto a dicho lado
        // y el ángulo opuesto al lado desconocido.
        double r = 0;
        anguloA = (anguloA * Math.PI) / 180; // Conversión a radianes
        anguloB = (anguloB * Math.PI) / 180;       
        r = ladoB * (Math.sin(anguloA) / Math.sin(anguloB));
        return r;
    }
   
    double senoCalcularAnguloA(double ladoA, double ladoB, double anguloB)
    {
        // Aplica ley del seno para calcular un ángulo interno opuesto a un lado
        // conocido, cuando se conocen dos lados y un ángulo opuesto a uno de los lados.
        double r = 0;
        anguloB = (anguloB * Math.PI) / 180;       
        r = Math.asin((Math.sin (anguloB) * (ladoA / ladoB)));       
        r = r * (180 / Math.PI);
        return r;
    }
   
    double cosenoCalcularLadoA(double ladoB, double ladoC, double anguloA)
    {
        // Aplica ley del coseno para calcular la medida de un lado cuando se conocen
        // dos lados y el ángulo entre dichos lados.
        double r = 0;
        anguloA = (anguloA * Math.PI) / 180;       
        r = Math.sqrt(Math.pow(ladoB, 2) + Math.pow(ladoC, 2) - (2 *(ladoB) * (ladoC) * Math.cos(anguloA)));               
        return r;
    }
   
    double cosenoCalcularAnguloA(double ladoA, double ladoB, double ladoC)
    {
        // Aplica ley del coseno para calcular la medida de un ángulo interno
        // cuando se conocen la medida de los tres lados del triángulo
        double r = 0;
        r = Math.acos((Math.pow(ladoA,2) - Math.pow(ladoB, 2) - Math.pow(ladoC, 2)) / (-2 * ladoB* ladoC));       
        r = r * (180 / Math.PI);       
        return r;
    }
}

public class PruebaOblicuangulos {   
    public static void main(String[] args) {
        Oblicuangulo obj = new Oblicuangulo();
        double ladoA, ladoB, ladoC;
        double anguloA, anguloB, anguloC;
        double r;
               
        /* Utilizando la ley del coseno para calcular la medida
         * de un lado A cuando se conocen las medidas de los lados
         * B y C y el angulo a entre B y C:       
         */
       
        System.out.println("Lado A por ley del coseno:");
        ladoB = 5;
        ladoC = 7;
        anguloA = 21;
               
        r = obj.cosenoCalcularLadoA(ladoB, ladoC, anguloA);
        System.out.println("El valor de la medida del lado A es:" + r);

       
        /* Utilizando la ley del coseno para calcular la medida
         * del ángulo a cuando se conocen las medidas de los lados
         * A, B y C:        
         */
        System.out.println("");
        System.out.println("Ángulo a por ley del coseno:");
        ladoB = 5;
        ladoC = 7;
        ladoA = 3;
       
        r = obj.cosenoCalcularAnguloA(ladoA, ladoB, ladoC);
        System.out.println("El valor de la medida del ángulo A es:" + r);
       
        /* Utilizando la ley del seno para calcular la medida
         * del ángulo a cuando se conocen las medidas de los lados
         * A, B y el ángulo b opuesto al lado B:
         */
       
        System.out.println("");
        System.out.println("Ángulo A por ley del seno:");       
        ladoA = 3;
        ladoB = 5;
        anguloB = 35;
       
        r = obj.senoCalcularAnguloA(ladoA, ladoB, anguloB);
        System.out.println("El valor de la medida del ángulo A es:" + r);
       
        /* Utilizando la ley del seno para calcular la medida
         * del lado A cuando se conocen las medidas del lado B, del ángulo b
         * opuesto al lado B y del ángulo a opuesto al lado A:         
         */
       
        System.out.println("");
        System.out.println("Lado A por ley del seno:");       
       
        ladoB = 5;
        anguloB = 35;
        anguloA = 21;
       
        r = obj.senoCalcularLadoA(ladoB, anguloA, anguloB);
        System.out.println("El valor de la medida del lado A es:" + r);               
    }   
}


Ejecución:




Entre las mejoras que pueden hacerse a la clase Oblicuángulo están:

- Verificación de que los lados del triángulo así como sus ángulos internos efectivamente pueden formar uno de acuerdo a sus medidas.
- Implementar un método de conversión entre grados y radianes y viceversa
- Sobrecarga de constructores para permitir que los parámetros puedan ser ingresados por teclado
- Permitir a la clase tener propiedades que representen tanto los lados como los ángulos internos.


No hay comentarios:

Publicar un comentario

Seguidores