Created
September 30, 2016 03:09
-
-
Save fero23/2cdb7bd2cfdee5b8c8f0a412323bf433 to your computer and use it in GitHub Desktop.
Haskell triangle calculation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
data Side = Adjacent Double | Opposite Double | Hypotenuse Double deriving Show | |
type Angles = Maybe (Double, Double, Double) | |
type Sides = Maybe (Double, Double, Double) | |
data Triangle = Triangle Angles Sides | |
toDegrees :: Double -> Double | |
toDegrees rad = rad * 360 / (2 * pi) | |
toRadian :: Double -> Double | |
toRadian deg = deg * 2 * pi / 360 | |
instance Show Triangle where | |
show (Triangle (Just (a1, a2, a3)) (Just (s1, s2, s3))) = | |
"Angles: " | |
++ show (round $ toDegrees a1) | |
++ ", " ++ show (round $ toDegrees a2) | |
++ ", " ++ show (round $ toDegrees a3) | |
++ "\nSides: " | |
++ show s1 | |
++ ", " ++ show s2 | |
++ ", " ++ show s3 | |
calcTriangle :: Double -> Side -> Triangle | |
calcTriangle angle side = loop $ Triangle Nothing Nothing | |
where | |
a1 = toRadian angle | |
loop triangle = case triangle of | |
(Triangle _ sides@(Just (adj, op, hyp))) -> | |
let a2 = acos (op / hyp) in | |
Triangle (Just (a1, a2, pi - a1 - a2)) sides | |
(Triangle _ _) -> case side of | |
(Adjacent side) -> | |
loop . Triangle Nothing $ Just (side, tan a1 * side, side / cos a1) | |
(Opposite side) -> | |
loop . Triangle Nothing $ Just (side / tan a1, side, side / sin a1) | |
(Hypotenuse side) -> | |
loop . Triangle Nothing $ Just (cos a1 * side, sin a1 * side, side) | |
{- | |
*Main> putStrLn . show $ calcTriangle 60 (Hypotenuse 2) | |
Angles: 60, 30, 90 | |
Sides: 1.0000000000000002, 1.7320508075688772, 2.0 | |
-} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment