0votos

Resolución de Triángulos mediante teorema del sen y del coseno en Haskell

por josejuan hace 4 años

Es un problema más interesante de lo que parece a primera vista (aunque desde luego, no puede considerarse difícil).

Hallar los ángulos y lados que no sabemos de un triángulo mediante el teorema del seno y del coseno.Introducir los valores en grados sexagesimales , trabajar con ellos en radianes y devolver los datos otra vez en grados sexagesimales en su defecto , si no se puede resolver devolver mensaje de que se necesitan mas datos. Todo esto en lenguaje C#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import Data.Maybe 
{-  Ambos teoremas pueden usarse conjuntamente (y con 
    otros) para ir despejando incógnitas, la solución 
    permite añadir deducciones que relacionan valores 
    conocidos para obtener otros desconocidos. 
 
    Otro teorema que no indica el enunciado pero que es 
    preciso/deseable es el obvio de que A + B + C = Pi. 
 
    No se revisan parámetros incorrectos (que no forman triángulos) 
 
    Fijamos el conocimiento de un triángulo como tuplas 
    con el lado y ángulo, que pueden o no estar determinadas -} 
 
type Corner   = (Maybe Double, Maybe Double) 
type Triangle = (Corner, Corner, Corner) 
 
{-  `s4x` puede ampliarse añadiendo tantas relaciones 
    como se deseen (conozcan) -} 
 
s4x :: Triangle -> Maybe Triangle 
s4x ((Nothing, Just  a), u@(Just y, Just b), v                 ) = Just ((Just  x, Just a), u, v) where x = y * (sin a / sin b) 
s4x ((Nothing, Just  a), u@(Just y,      _), v@(Just z,      _)) = Just ((Just  x, Just a), u, v) where x = sqrt $ y**2 + z**2 - 2*y*z * cos a 
s4x ((maybe_x, Nothing), u@(     _, Just b), v@(     _, Just c)) = Just ((maybe_x, Just a), u, v) where a = pi - b - c 
s4x ((Just  x, Nothing), u@(Just y, Just b), v                 ) = Just ((Just  x, Just a), u, v) where a = asin (x * sin b / y) 
s4x ((Just  x, Nothing), u@(Just y,      _), v@(Just z,      _)) = Just ((Just  x, Just a), u, v) where a = acos $ (y**2 + z**2 - x**2) / (2*y*z) 
s4x _ = Nothing 
 
{-  Dado un triángulo, existen 6 permutaciones de sus esquinas 
    y algunas de ellas podrá despejar incógnita (o quizás ninguna). 
    Aquí pueden añadirse tantas relaciones como se deseen -} 
 
solveStep :: Triangle -> Maybe Triangle 
solveStep (a, b, c) = listToMaybe $ catMaybes $ map s4x [(a,b,c),(a,c,b),(b,a,c),(b,c,a),(c,a,b),(c,b,a)] 
 
{-  Entonces, resolver un triángulo consiste en tener todas sus 
    incógnitas resueltas o sino, no se puede resolver -} 
 
solve :: Triangle -> Maybe Triangle 
solve t@((Just _, Just _), (Just _, Just _), (Just _, Just _)) = Just t 
solve t = solveStep t >>= solve 
 
{-  Y ya está -} 
 
 
 
 
 
 
 
 
 
 
 
 
{-  Por ejemplo, dado un ángulo de 45º y dos catetos de largo 2 -} 
test = solve ((Just 2, Nothing), (Just 2, Just $ pi / 5), (Nothing, Nothing)) 
{-  Just ((Just 3.2,Just 1.9) 
         ,(Just 2.0,Just 0.6) 
         ,(Just 2.0,Just 0.6)) 
-} 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.