Horizontal sundial calculations: Difference between revisions

+Haskell
(+Haskell)
Line 221:
 
end program SunDial</lang>
 
=={{header|Haskell}}==
<lang haskell>module Rosetta.HorSunDial where
 
roundDec :: Int -> Double -> Double
roundDec d = (/10.0^d). fromIntegral. round. (*10.0^d)
 
radToDegr = ((180/pi)*)
degrToRad = ((pi/180)*)
 
main = do
let lat = -4.95
long = -150.5
legalMerid = -150
sinOfLat = sin $ degrToRad lat
diff = legalMerid - long
putStrLn $ "Latitude " ++ show lat
putStrLn $ "Longitude " ++ show long
putStrLn $ "Legal meridian " ++ show legalMerid
putStrLn $ "Sine of latitude " ++ show (roundDec 6 sinOfLat)
putStrLn $ "Diff longitude " ++ show (-diff)
putStrLn "hour sun hour angle dial hour line angle"
mapM_ (\h ->
let sha = diff + 15*h
dhla = radToDegr . atan. (sinOfLat *). tan $ degrToRad sha
in putStrLn $ take 7 (show h ++ repeat ' ')
++ take 16 (show (roundDec 3 sha) ++ repeat ' ' )
++ " " ++ show (roundDec 3 dhla)
) [-6,-5..6]</lang>
Output:
<pre>*Rosetta.HorSunDial> main
Latitude -4.95
Longitude -150.5
Legal meridian -150.0
Sine of latitude -8.6286e-2
Diff longitude -0.5
hour sun hour angle dial hour line angle
-6.0 -89.5 84.225
-5.0 -74.5 17.283
-4.0 -59.5 8.334
-3.0 -44.5 4.847
-2.0 -29.5 2.795
-1.0 -14.5 1.278
0.0 0.5 -4.3e-2
1.0 15.5 -1.371
2.0 30.5 -2.91
3.0 45.5 -5.018
4.0 60.5 -8.671
5.0 75.5 -18.451
6.0 90.5 84.225</pre>
 
=={{header|J}}==
Anonymous user