Horizontal sundial calculations: Difference between revisions

Content added Content deleted
(Added Perl example)
m (→‎{{header|Haskell}}: (minor tidying))
Line 1,018: Line 1,018:


=={{header|Haskell}}==
=={{header|Haskell}}==
<lang haskell>module Rosetta.HorSunDial where
<lang haskell>roundDec :: Int -> Double -> Double
roundDec d = (/ 10.0 ^ d) . fromIntegral . round . (* 10.0 ^ d)


radToDegr = ((180 / pi) *)
roundDec :: Int -> Double -> Double
roundDec d = (/10.0^d). fromIntegral. round. (*10.0^d)


radToDegr = ((180/pi)*)
degrToRad = ((pi / 180) *)
degrToRad = ((pi/180)*)


main = do
main = do
let lat = -4.95
let lat = -4.95
long = -150.5
long = -150.5
legalMerid = -150
legalMerid = -150
sinOfLat = sin $ degrToRad lat
sinOfLat = sin $ degrToRad lat
diff = legalMerid - long
diff = legalMerid - long
(putStrLn . unlines)
putStrLn $ "Latitude " ++ show lat
[ "Latitude " ++ show lat
putStrLn $ "Longitude " ++ show long
, "Longitude " ++ show long
putStrLn $ "Legal meridian " ++ show legalMerid
, "Legal meridian " ++ show legalMerid
putStrLn $ "Sine of latitude " ++ show (roundDec 6 sinOfLat)
, "Sine of latitude " ++ show (roundDec 6 sinOfLat)
putStrLn $ "Diff longitude " ++ show (-diff)
, "Diff longitude " ++ show (-diff)
putStrLn "hour sun hour angle dial hour line angle"
, "hour sun hour angle dial hour line angle"
mapM_ (\h ->
]
mapM_
let sha = diff + 15*h
(\h ->
dhla = radToDegr . atan. (sinOfLat *). tan $ degrToRad sha
in putStrLn $ take 7 (show h ++ repeat ' ')
let sha = diff + 15 * h
dhla = radToDegr . atan . (sinOfLat *) . tan $ degrToRad sha
++ take 16 (show (roundDec 3 sha) ++ repeat ' ' )
++ " " ++ show (roundDec 3 dhla)
in putStrLn $
take 7 (show h ++ repeat ' ') ++
) [-6,-5..6]</lang>
take 16 (show (roundDec 3 sha) ++ repeat ' ') ++
" " ++ show (roundDec 3 dhla))
[-6,-5 .. 6]</lang>
{{out}}
{{out}}
<pre>*Rosetta.HorSunDial> main
<pre>*Rosetta.HorSunDial> main