Horizontal sundial calculations: Difference between revisions

m
(→‎{{header|Java}}: Added missing variable declaration for 'hraRad'.)
m (→‎{{header|Wren}}: Minor tidy)
 
(43 intermediate revisions by 24 users not shown)
Line 12:
Wikipedia: A [[wp:sundial|sundial]] is a device that measures time by the position of the [[wp:Sun|Sun]]. In common designs such as the horizontal sundial, the sun casts a [[wp:shadow|shadow]] from its ''style'' (also called its [[wp:Gnomon|Gnomon]], a thin rod or a sharp, straight edge)<!-- The style is the time telling edge of the gnomon, Waugh,1973 p29--> onto a flat surface marked with lines indicating the hours of the day (also called the [[wp:Sundial#Terminology|dial face]] or dial plate). As the sun moves across the sky, the shadow-edge progressively aligns with different hour-lines on the plate. Such designs rely on the style being aligned with the axis of the Earth's rotation. Hence, if such a sundial is to tell the correct time, the style must point towards [[wp:true north|true north]] (not the [[wp:North Magnetic Pole|north]] or [[wp:Magnetic South Pole|south magnetic pole]]) and the style's angle with horizontal must equal the sundial's geographical [[wp:latitude|latitude]].
<br><br>
 
=={{header|11l}}==
{{trans|Python}}
 
<syntaxhighlight lang="11l">V lat = Float(input(‘Enter latitude => ’))
V lng = Float(input(‘Enter longitude => ’))
V ref = Float(input(‘Enter legal meridian => ’))
print()
 
V slat = sin(radians(lat))
print(‘ sine of latitude: #.3’.format(slat))
print(‘ diff longitude: #.3’.format(lng - ref))
print()
print(‘Hour, sun hour angle, dial hour line angle from 6am to 6pm’)
 
L(h) -6 .. 6
V hra = 15.0 * h
hra -= lng - ref
V hla = degrees(atan(slat * tan(radians(hra))))
print(‘HR=#3; HRA=#3.3; HLA=#3.3’.format(h, hra, hla))</syntaxhighlight>
 
{{out}}
<pre>
Enter latitude => -4.95
Enter longitude => -150.5
Enter legal meridian => -150
 
sine of latitude: -0.086
diff longitude: -0.500
 
Hour, sun hour angle, dial hour line angle from 6am to 6pm
HR= -6; HRA=-89.500; HLA= 84.225
HR= -5; HRA=-74.500; HLA= 17.283
HR= -4; HRA=-59.500; HLA= 8.334
HR= -3; HRA=-44.500; HLA= 4.847
HR= -2; HRA=-29.500; HLA= 2.795
HR= -1; HRA=-14.500; HLA= 1.278
HR= 0; HRA= 0.500; HLA= -0.043
HR= 1; HRA= 15.500; HLA= -1.371
HR= 2; HRA= 30.500; HLA= -2.910
HR= 3; HRA= 45.500; HLA= -5.018
HR= 4; HRA= 60.500; HLA= -8.671
HR= 5; HRA= 75.500; HLA=-18.451
HR= 6; HRA= 90.500; HLA= 84.225
</pre>
 
=={{header|Ada}}==
{{trans|ALGOL 68}}
sundial.adb:
<langsyntaxhighlight Adalang="ada">with Ada.Text_IO;
with Ada.Numerics.Elementary_Functions;
procedure Sundial is
Line 60 ⟶ 105:
end;
end loop;
end Sundial;</langsyntaxhighlight>
{{out}}
<pre>Enter latitude: -4.95
Line 97 ⟶ 142:
> Simon
-->
<langsyntaxhighlight lang="algol68">BEGIN
REAL lat, slat, lng, ref;
print ( "Enter latitude => " ); read (lat);
Line 120 ⟶ 165:
new line(stand out)
OD
END</langsyntaxhighlight>
{{out}}
<pre>
Line 145 ⟶ 190:
HR= +6; HRA= +90.500; HLA= +84.225
</pre>
 
=={{header|Arturo}}==
 
{{trans|Nim}}
 
<syntaxhighlight lang="arturo">degToRad: function [deg]-> deg * pi // 180
radToDeg: function [rad]-> rad * 180 // pi
lat: to :floating input "Enter latitude => "
lng: to :floating input "Enter longitude => "
med: to :floating input "Enter legal meridian => "
print ""
slat: sin degToRad lat
 
print " sine of latitude: " ++ to :string .format:".3f" slat
print " diff longitude: " ++ to :string .format:".3f" lng-med
print ""
print "Hour, sun hour angle, dial hour line angle from 6am to 6pm"
loop (neg 6)..6 'h [
hra: med + (to :floating 15*h) - lng
hla: radToDeg atan slat * tan degToRad hra
print "HR=" ++ (to :string .format:"3d" h) ++ "; " ++
"HRA=" ++ (to :string .format:"7.3f" hra) ++ "; " ++
"HLA=" ++ (to :string .format:"7.3f" hla)
]</syntaxhighlight>
 
{{out}}
 
<pre>Enter latitude => -4.95
Enter longitude => -150.5
Enter legal meridian => -150
 
sine of latitude: -0.086
diff longitude: -0.500
 
Hour, sun hour angle, dial hour line angle from 6am to 6pm
HR= -6; HRA=-89.500; HLA= 84.225
HR= -5; HRA=-74.500; HLA= 17.283
HR= -4; HRA=-59.500; HLA= 8.334
HR= -3; HRA=-44.500; HLA= 4.847
HR= -2; HRA=-29.500; HLA= 2.795
HR= -1; HRA=-14.500; HLA= 1.278
HR= 0; HRA= 0.500; HLA= -0.043
HR= 1; HRA= 15.500; HLA= -1.371
HR= 2; HRA= 30.500; HLA= -2.910
HR= 3; HRA= 45.500; HLA= -5.018
HR= 4; HRA= 60.500; HLA= -8.671
HR= 5; HRA= 75.500; HLA=-18.451
HR= 6; HRA= 90.500; HLA= 84.225</pre>
 
=={{header|AutoHotkey}}==
{{incorrect|AutoHotkey|6AM,5AM,4AM,3AM,2AM,1AM,0PM - use hour+12 instead of abs(hour), I suspect}}
{{trans|F#}}
AutoHotkey is not a command-line programming language, let me make that clear. However, in translating the F# I found that the command line really is best for this type of app. The first 3 comments in the script describe the workarounds used to interface with the commandline.
<langsyntaxhighlight AutoHotkeylang="autohotkey">DllCall("AllocConsole") ; Open a console window for this application
Pi := 4*ATan(1)
,Degrees := Pi/180
Line 180 ⟶ 277:
FileAppend, %clockhour%`t`t%shr%`t`t%dhla%`n, CONOUT$
}
MsgBox close me when done.</langsyntaxhighlight>
{{out}}
<pre>Enter Latitude:-4.95
Line 206 ⟶ 303:
 
=={{header|AWK}}==
<syntaxhighlight lang="awk">
<lang AWK>
# syntax: GAWK -f HORIZONTAL_SUNDIAL_CALCULATIONS.AWK
BEGIN {
Line 224 ⟶ 321:
function dr(x) { return x * 3.14159265 / 180 } # degrees to radians
function rd(x) { return x * 180 / 3.14159265 } # radians to degrees
</syntaxhighlight>
</lang>
<p>output:</p>
<pre>
Line 246 ⟶ 343:
18 90.500 -95.775
</pre>
 
=={{header|BBC BASIC}}==
=={{header|BASIC}}==
==={{header|ANSI BASIC}}===
{{trans|ALGOL-68|ANSI BASIC has a possibility to use degrees in calculations.}}
{{works with|Decimal BASIC}}
<syntaxhighlight lang="basic">
100 REM Horizontal sundial calculations
110 INPUT PROMPT "Enter latitude => ": Lat
120 INPUT PROMPT "Enter longitude => ": Lng
130 INPUT PROMPT "Enter legal meridian => ": Ref
140 PRINT
150 OPTION ANGLE DEGREES
160 LET Slat = SIN(Lat)
170 PRINT " sine of latitude: "; Slat
180 PRINT " diff longitude: "; Lng - Ref
190 PRINT
200 PRINT "Hour, sun hour angle, dial hour line angle from 6am to 6pm"
210 FOR Hour = -6 TO 6
220 LET HourAngle = 15 * Hour
230 LET HourAngle = HourAngle - (Lng - Ref) ! correct for longitude difference
240 LET HourLineAngle = ATN(Slat * TAN(HourAngle))
250 PRINT USING "HR=###; HRA=####.###; HLA=####.###": Hour, HourAngle, HourLineAngle
260 NEXT Hour
270 END
</syntaxhighlight>
{{out}}
<pre>
Enter latitude => -4.95
Enter longitude => -150.5
Enter legal meridian => -150
 
sine of latitude: -8.62863657979234E-2
diff longitude: -.5
 
Hour, sun hour angle, dial hour line angle from 6am to 6pm
HR= -6; HRA= -89.500; HLA= 84.225
HR= -5; HRA= -74.500; HLA= 17.283
HR= -4; HRA= -59.500; HLA= 8.334
HR= -3; HRA= -44.500; HLA= 4.847
HR= -2; HRA= -29.500; HLA= 2.795
HR= -1; HRA= -14.500; HLA= 1.278
HR= 0; HRA= .500; HLA= -.043
HR= 1; HRA= 15.500; HLA= -1.371
HR= 2; HRA= 30.500; HLA= -2.910
HR= 3; HRA= 45.500; HLA= -5.018
HR= 4; HRA= 60.500; HLA= -8.671
HR= 5; HRA= 75.500; HLA= -18.451
HR= 6; HRA= 90.500; HLA= 84.225
</pre>
 
==={{header|BASIC256}}===
<syntaxhighlight lang="basic256">call SolarhoraAngle(-4.95, -150.5, -150.0)
end
 
function rad2deg(theta)
return theta * 180 / pi
end function
 
function deg2rad(theta)
return theta * pi / 180
end function
 
function sign(x)
if x < 0 then sign = -1
if x > 0 then sign = 1
if x = 0 then sign = 0
end function
 
subroutine SolarhoraAngle(latitude, longitude, meridian)
print "Latitude = "; latitude
print "Longitude = "; longitude
print "Meridian = "; meridian
print
print "sine of latitude: "; sin(latitude * pi / 180)
print " diff longitude: "; longitude - meridian
print
print " Time Sun hora angle Dial hora line angle"
for hora = 6 to 18
hra = (15 * hora) - longitude + meridian - 180
hla = rad2deg(atan(sin(deg2rad(latitude)) * tan(deg2rad(hra))))
if abs(hra) > 90 then hla += 180 * sign(hra * latitude)
if hora > 12 then time = hora - 12 : ap$ = " p.m." else time = hora : ap$ = " a.m."
print time; ap$; chr(9); hra; chr(9); chr(9); hla
next hora
end subroutine</syntaxhighlight>
 
==={{header|BBC BASIC}}===
{{works with|BBC BASIC for Windows}}
<langsyntaxhighlight lang="bbcbasic"> INSTALL @lib$+"FNUSING"
INPUT "Enter latitude (degrees) : " latitude
Line 261 ⟶ 444:
IF ABS(hra) > 90 hla += 180 * SGN(hra * latitude)
PRINT FNusing("##.##", hour), FNusing(" ####.### ", hra), FNusing(" ####.###", hla)
NEXT hour</langsyntaxhighlight>
{{out}}
(note the correct '''negative''' value for time 18:00)
Line 282 ⟶ 465:
17.00 75.500 -18.451
18.00 90.500 -95.775</pre>
 
==={{header|Chipmunk Basic}}===
{{works with|Chipmunk Basic|3.6.4}}
<syntaxhighlight lang="qbasic">10 CLS
20 DEF FNR(x) = x * PI/180
30 DEF FND(x) = x * 180/PI
40 INPUT " Enter latitude (degrees): ";latitude
50 INPUT " Enter longitude (degrees): ";longitude
60 INPUT "Enter legal meridian (degrees): ";meridian
70 PRINT
80 PRINT " Time Sun hour angle Dial hour line angle"
90 FOR h = 6 TO 18
100 hra = 15*h-longitude+meridian-180
110 hla = FN D(ARCTAN(SIN(FN R(latitude))*TAN(FN R(hra))))
120 IF ABS(hra) > 90 THEN hla = hla+180*SGN(hra*latitude)
130 PRINT USING "##.##";h;TAB (10)
140 PRINT USING "####.###";hra;TAB (27)
150 PRINT USING "####.###";hla
160 NEXT h
170 END</syntaxhighlight>
{{out}}
<pre>Same as FreeBASIC entry.</pre>
 
==={{header|FreeBASIC}}===
{{trans|BBC BASIC}}
<syntaxhighlight lang="freebasic">' version 04-11-2016
' compile with: fbc -s console
 
#Macro deg2rad (x)
(x) * Atn(1) / 45
#EndMacro
 
#Macro rad2deg (x)
(x) * 45 / Atn(1)
#EndMacro
 
' ------=< MAIN >=------
 
Dim As Double latitude, longitude, meridian, hra, hla
Dim As ULong h
 
Input " Enter latitude (degrees): ", latitude
Input " Enter longitude (degrees): ", longitude
Input "Enter legal meridian (degrees): ", meridian
 
Print
Print " Time Sun hour angle Dial hour line angle"
 
For h = 6 To 18
hra = h * 15 - longitude + meridian - 180
hla = rad2deg(Atn(Sin(deg2rad(latitude)) * Tan(deg2rad(hra))))
If Abs(hra) > 90 Then hla += 180 * Sgn(hra * latitude)
Print Using "##.## ####.### ####.###"; h; hra; hla
Next
 
' empty keyboard buffer
While InKey <> "" : Wend
Print : Print "hit any key to end program"
Sleep
End</syntaxhighlight>
{{out}}
<pre> Enter latitude (degrees): -4.95
Enter longitude (degrees): -150.5
Enter legal meridian (degrees): -150
 
Time Sun hour angle Dial hour line angle
6.00 -89.500 84.225
7.00 -74.500 17.283
8.00 -59.500 8.334
9.00 -44.500 4.847
10.00 -29.500 2.795
11.00 -14.500 1.278
12.00 0.500 -0.043
13.00 15.500 -1.371
14.00 30.500 -2.910
15.00 45.500 -5.018
16.00 60.500 -8.671
17.00 75.500 -18.451
18.00 90.500 -95.775</pre>
 
==={{header|FutureBasic}}===
<syntaxhighlight lang="futurebasic">window 1
 
def fn rad2deg( theta as double ) as double = theta * 180 / pi
def fn deg2rad( theta as double ) as double = theta * pi / 180
 
local fn SolarHourAngle( latitude as double, longitude as double, meridian as double )
long hour
double hra, hla, t
CFStringRef ap
print "Latitude = "; latitude; chr$(13); "Longitude = "; longitude; chr$(13); "Meridian = "; meridian
print : print "sine of latitude: "; sin(latitude * pi / 180 ); chr$(13); " diff longitude: "; longitude - meridian
print : print "Time", "Sun hour angle", "Dial hour line angle"
for hour = 6 to 18
hra = ( 15 * hour ) - longitude + meridian - 180
hla = fn rad2deg( atn( sin( fn deg2rad( latitude ) ) * tan( fn deg2rad( hra ) )))
if abs( hra ) > 90 then hla = hla + 180 * sgn( hra * latitude )
if hour > 12 then t = hour - 12 : ap = @" a.m." else t = hour : ap = @" p.m."
print using "##"; t; ap, using "####.##"; hra, using "####.###"; hla
next hour
end fn
 
fn SolarHourAngle( -4.95, -150.5, -150.0 )
 
HandleEvents</syntaxhighlight>
 
Output:
<pre>
Latitude = -4.95
Longitude = -150.5
Meridian = -150
 
sine of latitude: -0.0862863658
diff longitude: -0.5
 
Time Sun hour angle Dial hour line angle
6 p.m. -89.50 84.225
7 p.m. -74.50 17.283
8 p.m. -59.50 8.334
9 p.m. -44.50 4.847
10 p.m. -29.50 2.795
11 p.m. -14.50 1.278
12 p.m. 0.50 -0.043
1 a.m. 15.50 -1.371
2 a.m. 30.50 -2.910
3 a.m. 45.50 -5.018
4 a.m. 60.50 -8.671
5 a.m. 75.50 -18.451
6 a.m. 90.50 -95.775
</pre>
 
==={{header|GW-BASIC}}===
{{trans|ALGOL 68}}
{{works with|PC-BASIC|any}}
<syntaxhighlight lang="qbasic">
10 ' Horizontal sundial calculations
20 PRINT "Enter latitude => ";
30 INPUT LAT
40 PRINT "Enter longitude => ";
50 INPUT LNG
60 PRINT "Enter legal meridian => ";
70 INPUT REF
80 PRINT
90 LET PI = 4 * ATN(1)
100 LET SLAT = SIN(LAT * PI / 180)
110 PRINT " sine of latitude: "; USING "#.##^^^^"; SLAT
120 PRINT " diff longitude: "; USING "####.###"; LNG - REF
130 PRINT
140 PRINT "Hour, sun hour angle, dial hour line angle from 6am to 6pm"
150 FOR H% = -6 TO 6
160 LET HRA = 15 * H%
170 LET HRA = HRA - (LNG - REF): ' correct for longitude difference
180 LET HLA = ATN(SLAT * TAN(HRA * PI / 180)) * 180 / PI
190 PRINT "HR="; USING "+##"; H%;
200 PRINT "; HRA="; USING "+###.###"; HRA;
210 PRINT "; HLA="; USING "+###.###"; HLA
220 NEXT H%
230 END
</syntaxhighlight>
{{out}}
<pre>
Enter latitude => ? -4.95
Enter longitude => ? -150.5
Enter legal meridian => ? -150
sine of latitude: -.86E-01
diff longitude: -0.500
Hour, sun hour angle, dial hour line angle from 6am to 6pm
HR= -6; HRA= -89.500; HLA= +84.225
HR= -5; HRA= -74.500; HLA= +17.283
HR= -4; HRA= -59.500; HLA= +8.334
HR= -3; HRA= -44.500; HLA= +4.847
HR= -2; HRA= -29.500; HLA= +2.795
HR= -1; HRA= -14.500; HLA= +1.278
HR= +0; HRA= +0.500; HLA= -0.043
HR= +1; HRA= +15.500; HLA= -1.371
HR= +2; HRA= +30.500; HLA= -2.910
HR= +3; HRA= +45.500; HLA= -5.018
HR= +4; HRA= +60.500; HLA= -8.671
HR= +5; HRA= +75.500; HLA= -18.451
HR= +6; HRA= +90.500; HLA= +84.225
</pre>
 
==={{header|IS-BASIC}}===
<syntaxhighlight lang="is-basic">100 PROGRAM "SunDial.bas"
110 OPTION ANGLE RADIANS
120 TEXT 80
130 LET DR=PI/180:LET RD=180/PI
140 INPUT PROMPT "Enter latitude: ":LAT
150 INPUT PROMPT "Enter longitude: ":LNG
160 INPUT PROMPT "Enter legal meridian: ":REF
170 LET S=SIN(LAT*DR)
180 PRINT :PRINT "Sine of latitude :";S
190 PRINT "Diff longitude: ";LNG-REF
200 PRINT " Hour,",,"sun hour angle, dial hour line angle from 6am to 6 pm"
210 FOR H=6 TO 18
220 LET HRA=15*H-LNG+REF
230 LET HLA=ATN(S*TAN(HRA*DR))*RD
240 PRINT "HR = ";H,"HRA =";HRA,"HLA =";HLA
250 NEXT</syntaxhighlight>
 
==={{header|Liberty BASIC}}===
Based on Algol & BBC BASIC versions. Note Liberty BASIC works in radians.
<syntaxhighlight lang="lb">global pi
pi = 3.14159265
input "Enter latitude (degrees) : "; latitude ' -4.95
input "Enter longitude (degrees) : "; longitude ' -150.5
input "Enter legal meridian (degrees): "; meridian ' -150.0
print
print "Time Sun hour angle Dial hour line angle"
for hour = 6 TO 18
hra = 15 * hour - longitude + meridian - 180
hla = rad2deg(atn(sin(deg2rad(latitude)) * tan(deg2rad(hra))))
if abs(hra) > 90 then hla = hla + 180 * sgn(hra * latitude)
print using( "##.##", hour), using("####.### ", hra), using("####.###", hla)
next hour
end
 
function rad2deg(theta)
rad2deg = theta * 180 / pi
end function
 
function deg2rad(theta)
deg2rad = theta * pi / 180
end function
 
function sgn(x)
if x > 0 then sgn = 1 else sgn = -1
end function</syntaxhighlight>
{{out}}
<pre>
Enter latitude (degrees) : -4.95
Enter longitude (degrees) : -150.5
Enter legal meridian (degrees): -150.0
 
Time Sun hour angle Dial hour line angle
6.00 -89.500 84.225
7.00 -74.500 17.283
8.00 -59.500 8.334
9.00 -44.500 4.847
10.00 -29.500 2.795
11.00 -14.500 1.278
12.00 0.500 -0.043
13.00 15.500 -1.371
14.00 30.500 -2.910
15.00 45.500 -5.018
16.00 60.500 -8.671
17.00 75.500 -18.451
18.00 90.500 -95.775
</pre>
 
==={{header|Microsoft Small Basic}}===
{{trans|ALGOL-68}}
<syntaxhighlight lang="microsoftsmallbasic">
TextWindow.Write("Enter latitude => ")
lat = TextWindow.ReadNumber()
TextWindow.Write("Enter longitude => ")
lng = TextWindow.ReadNumber()
TextWindow.Write("Enter legal meridian => ")
ref = TextWindow.ReadNumber()
sLat = Math.Sin(Math.GetRadians(lat))
TextWindow.WriteLine("")
TextWindow.Write(" sine of latitude: ")
TextWindow.WriteLine(Math.Round(sLat * 10000) / 10000)
TextWindow.Write(" diff longitude: ")
TextWindow.WriteLine(lng - ref)
TextWindow.WriteLine("")
TextWindow.WriteLine("Hour, sun hour angle, dial hour line angle from 6am to 6pm")
For hour = -6 To 6
hourAngle = 15 * hour
hourAngle = hourAngle - (lng - ref) ' correct for longitude difference
hourLineAngle = math.GetDegrees(Math.ArcTan(sLat * Math.Tan(Math.GetRadians(hourAngle))))
TextWindow.Write("HR=")
TextWindow.CursorLeft = 3 + (3 - Text.GetLength(hour))
TextWindow.Write(hour)
TextWindow.Write("; HRA=")
TextWindow.CursorLeft = 12 + (6 - Text.GetLength(hourAngle))
TextWindow.Write(hourAngle)
TextWindow.Write("; HLA=")
TextWindow.CursorLeft = 24 + (4 - Text.GetLength(Math.Floor(hourLineAngle)))
TextWindow.Write(Math.Round(hourLineAngle * 1000) / 1000)
TextWindow.WriteLine("")
EndFor
</syntaxhighlight>
{{out}}
 
Enter latitude => -4.95
Enter longitude => -150.5
Enter legal meridian => -150
sine of latitude: -0.0863
diff longitude: -0.5
Hour, sun hour angle, dial hour line angle from 6am to 6pm
HR= -6; HRA= -89.5; HLA= 84.225
HR= -5; HRA= -74.5; HLA= 17.283
HR= -4; HRA= -59.5; HLA= 8.334
HR= -3; HRA= -44.5; HLA= 4.847
HR= -2; HRA= -29.5; HLA= 2.795
HR= -1; HRA= -14.5; HLA= 1.278
HR= 0; HRA= 0.5; HLA= -0.043
HR= 1; HRA= 15.5; HLA= -1.371
HR= 2; HRA= 30.5; HLA= -2.91
HR= 3; HRA= 45.5; HLA= -5.018
HR= 4; HRA= 60.5; HLA= -8.671
HR= 5; HRA= 75.5; HLA= -18.451
HR= 6; HRA= 90.5; HLA= 84.225
 
==={{header|Minimal BASIC}}===
{{works with|QBasic}}
{{trans|ALGOL-68}}
<syntaxhighlight lang="gwbasic">
10 REM Horizontal sundial calculations
20 DEF FNM(X) = INT(X*1000+0.5)/1000
30 PRINT "Enter latitude";
40 INPUT L
50 PRINT "Enter longitude";
60 INPUT L1
70 PRINT "Enter legal meridian";
80 INPUT R
90 PRINT
100 LET P = 4*ATN(1)
110 LET S1 = SIN(L*P/180)
120 PRINT " sine of latitude:"; S1
130 PRINT " diff longitude: "; FNM(L1-R)
140 PRINT
150 PRINT "Hour, sun hour angle, dial hour line angle from 6am to 6pm"
160 FOR H = -6 TO 6
170 LET A1 = 15*H
180 REM Correct for longitude difference:
190 LET A1 = A1-(L1-R)
200 LET A2 = ATN(S1*TAN(A1*P/180))*180/P
210 PRINT "HR ="; H;
220 PRINT TAB(9); "HRA ="; FNM(A1);
230 PRINT TAB(24); "HLA ="; FNM(A2)
240 NEXT H
250 END
</syntaxhighlight>
 
==={{header|PureBasic}}===
{{trans|ALGOL 68}}
<syntaxhighlight lang="purebasic">If OpenConsole()
Define.f lat, slat, lng, ref
Define.i h
Print("Enter latitude => "): lat=ValF(Input())
Print("Enter longitude => "): lng=ValF(Input())
Print("Enter legal meridian => "): ref=ValF(Input())
PrintN("")
slat=Sin(lat*2*#PI/360)
PrintN(" sine of latitude: "+StrF(slat,3))
PrintN(" diff longitude: "+StrF((lng-ref),3)+#CRLF$)
PrintN("Hour, sun hour angle, dial hour line angle from 6am to 6pm")
For h=-6 To 6
Define.f hra, hla
hra=15*h
hra=hra-(lng-ref)
hla=ATan(slat*Tan(hra*2*#PI/360))*360/(2*#PI)
PrintN("HR="+RSet(Str(h),3)+"; HRA="+RSet(StrF(hra,3),7)+"; HLA="+RSet(StrF(hla,3),7))
Next
EndIf</syntaxhighlight>
{{out}}
<pre>Enter latitude => -4.95
Enter longitude => -150.5
Enter legal meridian => -150
 
sine of latitude: -0.086
diff longitude: -0.500
 
Hour, sun hour angle, dial hour line angle from 6am to 6pm
HR= -6; HRA=-89.500; HLA= 84.225
HR= -5; HRA=-74.500; HLA= 17.283
HR= -4; HRA=-59.500; HLA= 8.334
HR= -3; HRA=-44.500; HLA= 4.847
HR= -2; HRA=-29.500; HLA= 2.795
HR= -1; HRA=-14.500; HLA= 1.278
HR= 0; HRA= 0.500; HLA= -0.043
HR= 1; HRA= 15.500; HLA= -1.371
HR= 2; HRA= 30.500; HLA= -2.910
HR= 3; HRA= 45.500; HLA= -5.018
HR= 4; HRA= 60.500; HLA= -8.671
HR= 5; HRA= 75.500; HLA=-18.451
HR= 6; HRA= 90.500; HLA= 84.225
</pre>
 
==={{header|Run BASIC}}===
<syntaxhighlight lang="runbasic">global pi
pi = 22 / 7
print "Enter latitude (degrees) : "; :input latitude ' -4.95
print "Enter longitude (degrees) : "; :input longitude ' -150.5
print "Enter legal meridian (degrees): "; :input meridian ' -150.0
 
print
print "Time Sun hour angle Dial hour line angle"
for hour = 6 TO 18
hra = (15 * hour) - longitude + meridian -180
hla =rad2deg( atn( sin( deg2rad( latitude)) *tan( deg2rad( hra))))
if abs( hra) >90 then hla =hla +180 *sgn( hra *latitude)
print using( "##", hour);" ";using("####.##", hra);" ";using("####.###", hla)
next hour
function rad2deg( theta)
rad2deg =theta *180 /pi
end function
function deg2rad( theta)
deg2rad =theta *pi /180
end function
function sgn( x)
if x >0 then sgn =1 else sgn =-1
end function
end</syntaxhighlight>
{{out}}
<pre>
Enter latitude: -4.95
Enter longitude: -150.5
Enter legal meridian: -150
 
Time Sun hour angle Dial hour line angle
6 -89.50 84.606
7 -74.50 17.316
8 -59.50 8.342
9 -44.50 4.850
10 -29.50 2.796
11 -14.50 1.279
12 0.50 -0.043
13 15.50 -1.371
14 30.50 -2.911
15 45.50 -5.021
16 60.50 -8.680
17 75.50 -18.488
18 90.50 -96.224</pre>
 
==={{header|True BASIC}}===
<syntaxhighlight lang="qbasic">FUNCTION rad2deg(theta)
LET rad2deg = theta*180/PI
END FUNCTION
FUNCTION deg2rad(theta)
LET deg2rad = theta*PI/180
END FUNCTION
FUNCTION signo(x)
IF x > 0 THEN LET signo = 1 ELSE LET signo = -1
END FUNCTION
INPUT prompt "Enter latitude (degrees) : ": latitude ! -4.95
INPUT prompt "Enter longitude (degrees) : ": longitude ! -150.5
INPUT prompt "Enter legal meridian (degrees): ": meridian ! -150.0
PRINT
PRINT "Time Sun hora angle Dial hora line angle"
FOR hora = 6 TO 18
LET hra = (15*hora)-longitude+meridian-180
LET hla = rad2deg(ATN(SIN(deg2rad(latitude))*TAN(deg2rad(hra))))
IF abs(hra) > 90 THEN LET hla = hla+180*signo(hra*latitude)
PRINT USING "## ####.## ####.###": hora, hra, hla
NEXT hora
END</syntaxhighlight>
 
==={{header|XBasic}}===
{{trans|ALGOL-68}}
{{works with|Windows XBasic}}
<syntaxhighlight lang="xbasic">
PROGRAM "sundial"
VERSION "0.0001"
 
IMPORT "xma"
 
DECLARE FUNCTION Entry()
 
FUNCTION Entry()
lat! = SINGLE(INLINE$("Enter latitude => "))
lng! = SINGLE(INLINE$("Enter longitude => "))
ref! = SINGLE(INLINE$("Enter legal meridian => "))
PRINT
slat! = SIN(lat! * $$PI / 180.0)
PRINT " sine of latitude: "; FORMAT$("#.##^^^^", slat!)
PRINT " diff longitude: "; FORMAT$("#.###", lng! - ref!)
PRINT
PRINT "Hour, sun hour angle, dial hour line angle from 6am to 6pm"
FOR hour@ = -6 TO 6
hourAngle! = 15 * hour@
hourAngle! = hourAngle! - (lng! - ref!) ' correct for longitude difference
hourLineAngle! = ATAN(slat! * TAN(hourAngle! * $$PI / 180.0)) * 180.0 / $$PI
PRINT "HR="; FORMAT$("###", hour@);
PRINT "; HRA="; FORMAT$("####.###", hourAngle!);
PRINT "; HLA="; FORMAT$("####.###", hourLineAngle!)
NEXT hour@
END FUNCTION
END PROGRAM
</syntaxhighlight>
{{out}}
<pre>
Enter latitude => -4.95
Enter longitude => -150.5
Enter legal meridian => -150
 
sine of latitude: -8.63E-02
diff longitude: -0.500
 
Hour, sun hour angle, dial hour line angle from 6am to 6pm
HR= -6; HRA= -89.500; HLA= 84.225
HR= -5; HRA= -74.500; HLA= 17.283
HR= -4; HRA= -59.500; HLA= 8.334
HR= -3; HRA= -44.500; HLA= 4.847
HR= -2; HRA= -29.500; HLA= 2.795
HR= -1; HRA= -14.500; HLA= 1.278
HR= 0; HRA= 0.500; HLA= -0.043
HR= 1; HRA= 15.500; HLA= -1.371
HR= 2; HRA= 30.500; HLA= -2.910
HR= 3; HRA= 45.500; HLA= -5.018
HR= 4; HRA= 60.500; HLA= -8.671
HR= 5; HRA= 75.500; HLA= -18.451
HR= 6; HRA= 90.500; HLA= 84.225
</pre>
 
==={{header|Yabasic}}===
<syntaxhighlight lang="yabasic">SolarHourAngle(-4.95, -150.5, -150.0)
end
 
sub rad2deg(theta)
return theta * 180 / pi
end sub
 
sub deg2rad(theta)
return theta * pi / 180
end sub
 
sub SolarHourAngle(latitude, longitude, meridian)
local long, hour, hra, hla, time, ap$
print "Latitude = ", latitude
print "Longitude = ", longitude
print "Meridian = ", meridian
print "\nsine of latitude: ", sin(latitude * pi / 180)
print " diff longitude: ", longitude - meridian
print "\n Time Sun hour angle Dial hour line angle"
for hour = 6 to 18
hra = (15 * hour) - longitude + meridian - 180
hla = rad2deg(atan(sin(deg2rad(latitude)) * tan(deg2rad(hra))))
if abs(hra) > 90 hla = hla + 180 * sig(hra * latitude)
if hour > 12 then time = hour - 12 : ap$ = " a.m." else time = hour : ap$ = " p.m." : fi
print time using "##", ap$, chr$(9), hra using "####.##", chr$(9), chr$(9), hla using "####.###"
next hour
end sub</syntaxhighlight>
 
==={{header|ZX Spectrum Basic}}===
{{trans|ERRE}}
<syntaxhighlight lang="zxbasic">10 DEF FN r(x)=x*PI/180
20 DEF FN d(x)=x*180/PI
30 INPUT "Enter latitude (degrees): ";latitude
40 INPUT "Enter longitude (degrees): ";longitude
50 INPUT "Enter legal meridian (degrees): ";meridian
60 PRINT "Latitude: ";latitude
70 PRINT "Longitude:";longitude
80 PRINT "Legal meridian: ";meridian
90 PRINT '" Sun Dial"
100 PRINT "Time hour angle hour line ang."
110 PRINT "________________________________"
120 FOR h=6 TO 18
130 LET hra=15*h-longitude+meridian-180
140 LET hla=FN d(ATN (SIN (FN r(latitude))*TAN (FN r(hra))))
150 IF ABS (hra)>90 THEN LET hla=hla+180*SGN (hra*latitude)
160 PRINT h;" ";hra;" ";hla
170 NEXT h</syntaxhighlight>
 
=={{header|C}}==
{{trans|ALGOL 68}}
<langsyntaxhighlight lang="c">#include <stdio.h>
#include <math.h>
 
Line 327 ⟶ 1,079:
 
return 0;
}</langsyntaxhighlight>
 
=={{header|C sharp|C#}}==
<langsyntaxhighlight lang="csharp">using System;
 
namespace RosettaCode
Line 361 ⟶ 1,113:
}
}
}</langsyntaxhighlight>
 
=={{header|C++}}==
<syntaxhighlight lang="cpp">#include <cmath>
#include <iostream>
#include <numbers>
 
// constants used in the calculations
static const double DegreesPerHour = 15.0;
static const double DegreesPerRadian = 180.0 * std::numbers::inv_pi;
 
// a structure for the calculation results
struct SundialCalculation
{
double HourAngle;
double HourLineAngle;
};
 
// a class for a sundial at a location
class Sundial
{
// intermediate values used in the caclulations
double m_sinLatitude;
double m_timeZoneCorrection;
public:
Sundial(double latitude, double longitude, double legalMeridian) noexcept
: m_sinLatitude(sin(latitude / DegreesPerRadian))
, m_timeZoneCorrection(legalMeridian - longitude) {}
 
SundialCalculation CalculateShadow(double hoursSinceNoon) const noexcept
{
double hourAngle = hoursSinceNoon * DegreesPerHour + m_timeZoneCorrection;
double hourAngleRad = hourAngle / DegreesPerRadian;
double hlaRad = atan2(m_sinLatitude * sin(hourAngleRad), cos(hourAngleRad));
double hourLineAngle = hlaRad * DegreesPerRadian;
return SundialCalculation {hourAngle, hourLineAngle};
}
};
 
int main()
{
double latitude, longitude, legalMeridian;
std::cout << "Enter latitude:";
std::cin >> latitude;
std::cout << "Enter longitude:";
std::cin >> longitude;
std::cout << "Enter legal meridian:";
std::cin >> legalMeridian;
// create a sundial at the user specified location
const Sundial sundial(latitude, longitude, legalMeridian);
for(int hour = -6; hour < 7; ++hour)
{
// cacluate the angles
auto result = sundial.CalculateShadow(hour);
 
// print the results
auto amOrPm = hour < 0 ? "am" : "pm";
auto hourString = std::to_string(hour < 1 ? 12 + hour : hour);
std::cout << hourString << amOrPm <<
" - sun hour angle:" << result.HourAngle <<
", dial hour line angle:" << result.HourLineAngle << "\n";
}
}
</syntaxhighlight>
{{out}}
<pre>
Enter latitude:-4.95
Enter longitude:-150.5
Enter legal meridian:-150
6am - sun hour angle:-89.5, dial hour line angle:84.2248
7am - sun hour angle:-74.5, dial hour line angle:17.2829
8am - sun hour angle:-59.5, dial hour line angle:8.33371
9am - sun hour angle:-44.5, dial hour line angle:4.84671
10am - sun hour angle:-29.5, dial hour line angle:2.79487
11am - sun hour angle:-14.5, dial hour line angle:1.27835
12pm - sun hour angle:0.5, dial hour line angle:-0.0431443
1pm - sun hour angle:15.5, dial hour line angle:-1.37079
2pm - sun hour angle:30.5, dial hour line angle:-2.90964
3pm - sun hour angle:45.5, dial hour line angle:-5.01802
4pm - sun hour angle:60.5, dial hour line angle:-8.6714
5pm - sun hour angle:75.5, dial hour line angle:-18.451
6pm - sun hour angle:90.5, dial hour line angle:-95.7752
</pre>
 
=={{header|COBOL}}==
{{works with|OpenCOBOL}}
<langsyntaxhighlight lang="cobol">PROGRAM-ID. horizontal-sundial-calc.
 
DATA DIVISION.
Line 418 ⟶ 1,254:
dial-hour-line-angle-disp
END-PERFORM
.</langsyntaxhighlight>
 
{{out}}
Line 447 ⟶ 1,283:
=={{header|D}}==
{{trans|Python}}
<langsyntaxhighlight lang="d">import std.stdio, std.math, std.conv, std.string;
 
double radians(in double x) pure nothrow { return x * (PI / 180); }
Line 474 ⟶ 1,310:
writefln("HR=%3d; HRA=%7.3f; HLA=%7.3f", h, hra, hla);
}
}</langsyntaxhighlight>
{{out|Example run}}
<pre>Enter latitude => -4.95
Line 498 ⟶ 1,334:
HR= 6; HRA= 90.500; HLA= 84.225
</pre>
=={{header|Delphi}}==
See [[#Pascal]]
 
=={{header|DWScript}}==
{{trans|Java}}
<langsyntaxhighlight lang="delphi">procedure PrintSundial(lat, lng, lme : Float);
begin
PrintLn(Format('latitude: %7.2f', [lat]));
Line 523 ⟶ 1,361:
end;
 
PrintSundial(-4.95, -150.5, -150);</langsyntaxhighlight>
{{out}}
<pre>latitude: -4.95
Line 545 ⟶ 1,383:
HR= 5; HRA= 75.500; HLA=-18.451
HR= 6; HRA= 90.500; HLA=-95.775</pre>
 
=={{header|EasyLang}}==
<syntaxhighlight lang="text">
func getn s$ .
write s$
v = number input
print v
return v
.
lat = getn "Enter latitude: "
lng = getn "Enter longitude: "
merid = getn "Enter legal meridian: "
slat = sin lat
diff = lng - merid
print ""
print " sine of latitude: " & slat
print " diff longitude: " & diff
print ""
print "Hour\tSun hour angle\tDial hour line angle"
for h = -6 to 6
hra = 15 * h - diff
hla = atan2 (slat * sin hra) cos hra
print h + 12 & "\t" & hra & "\t\t" & hla
.
</syntaxhighlight>
 
=={{header|ERRE}}==
<langsyntaxhighlight ERRElang="erre">PROGRAM SUN_DIAL
 
FUNCTION RAD(X)
Line 575 ⟶ 1,438:
 
END PROGRAM
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 601 ⟶ 1,464:
=={{header|Euphoria}}==
{{works with|OpenEuphoria}}
<syntaxhighlight lang="euphoria">
<lang Euphoria>
include std/console.e
include std/mathcons.e
Line 637 ⟶ 1,500:
 
if getc(0) then end if
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 662 ⟶ 1,525:
=={{header|F_Sharp|F#}}==
{{trans|C#}}
<langsyntaxhighlight lang="fsharp">// Learn more about F# at http://fsharp.net
 
open System
Line 697 ⟶ 1,560:
//To keep the console window open, can be omitted with block comment (" (* comment *) ")
Console.WriteLine("Press any key to continue...")
Console.ReadKey() |> ignore</langsyntaxhighlight>
{{out|Example output}}
<pre>
Line 723 ⟶ 1,586:
6PM 90.5 84.225
Press any key to continue...
</pre>
 
=={{header|Factor}}==
{{trans|Java}}
<syntaxhighlight lang="factor">USING: formatting io kernel locals math math.functions math.libm
math.parser math.ranges math.trig sequences ;
IN: rosetta-code.sundial
 
: get-num ( str -- x ) write flush readln string>number ;
 
: get-input ( -- lat lng ref )
"Enter latitude: " "Enter longitude: "
"Enter legal meridian: " [ get-num ] tri@ ;
 
: .diff ( lat lng ref -- )
- [ deg>rad sin ] dip
"sine of latitude: %.3f\ndiff longitude: %.3f\n" printf ;
 
: line-angle ( lat hra-rad -- hla )
[ deg>rad sin ] [ [ sin * ] [ cos ] bi ] bi* fatan2 rad>deg
;
 
:: .angles ( lat lng ref -- )
"Hour, sun hour angle, dial hour line angle from 6am to 6pm"
print
-6 6 [a,b] [
:> h 15.0 h * :> hra!
ref hra lng - + hra!
lat hra deg>rad line-angle :> hla
h hra hla
"HR= %3d; \t HRA=%7.3f; \t HLA= %7.3f\n" printf
] each ;
 
: sundial-demo ( -- ) get-input nl 3dup .diff nl .angles ;
 
MAIN: sundial-demo</syntaxhighlight>
{{out}}
<pre>
Enter latitude: -4.95
Enter longitude: -150.5
Enter legal meridian: -150
 
sine of latitude: -0.086
diff longitude: -0.500
 
Hour, sun hour angle, dial hour line angle from 6am to 6pm
HR= -6; HRA=-89.500; HLA= 84.225
HR= -5; HRA=-74.500; HLA= 17.283
HR= -4; HRA=-59.500; HLA= 8.334
HR= -3; HRA=-44.500; HLA= 4.847
HR= -2; HRA=-29.500; HLA= 2.795
HR= -1; HRA=-14.500; HLA= 1.278
HR= 0; HRA= 0.500; HLA= -0.043
HR= 1; HRA= 15.500; HLA= -1.371
HR= 2; HRA= 30.500; HLA= -2.910
HR= 3; HRA= 45.500; HLA= -5.018
HR= 4; HRA= 60.500; HLA= -8.671
HR= 5; HRA= 75.500; HLA= -18.451
HR= 6; HRA= 90.500; HLA= -95.775
</pre>
 
=={{header|Forth}}==
<langsyntaxhighlight lang="forth">: faccept ( -- f )
pad 32 accept pad swap >float 0= throw ;
: >radians ( deg -- rad ) 180e f/ pi f* ;
Line 744 ⟶ 1,666:
fdup f. ." , "
>radians fsincos fswap frot f* fswap fatan2 >degrees f.
loop fdrop fdrop ;</langsyntaxhighlight>
 
=={{header|Fortran}}==
{{works with|gfortran}} with <tt>-fbackslash</tt> option
<langsyntaxhighlight lang="fortran">program SunDial
 
real :: lat, slat, lng, ref
Line 792 ⟶ 1,714:
end function rd
 
end program SunDial</langsyntaxhighlight>
=={{header|freeBASIC}}==
{{trans|BBC BASIC}}
<lang freebasic>' version 04-11-2016
' compile with: fbc -s console
 
#Macro deg2rad (x)
(x) * Atn(1) / 45
#EndMacro
 
#Macro rad2deg (x)
(x) * 45 / Atn(1)
#EndMacro
 
' ------=< MAIN >=------
 
Dim As Double latitude, longitude, meridian, hra, hla
Dim As ULong h
 
Input " Enter latitude (degrees): ", latitude
Input " Enter longitude (degrees): ", longitude
Input "Enter legal meridian (degrees): ", meridian
 
Print
Print " Time Sun hour angle Dial hour line angle"
 
For h = 6 To 18
hra = h * 15 - longitude + meridian - 180
hla = rad2deg(Atn(Sin(deg2rad(latitude)) * Tan(deg2rad(hra))))
If Abs(hra) > 90 Then hla += 180 * Sgn(hra * latitude)
Print Using "##.## ####.### ####.###"; h; hra; hla
Next
 
' empty keyboard buffer
While InKey <> "" : Wend
Print : Print "hit any key to end program"
Sleep
End</lang>
{{out}}
<pre> Enter latitude (degrees): -4.95
Enter longitude (degrees): -150.5
Enter legal meridian (degrees): -150
 
Time Sun hour angle Dial hour line angle
6.00 -89.500 84.225
7.00 -74.500 17.283
8.00 -59.500 8.334
9.00 -44.500 4.847
10.00 -29.500 2.795
11.00 -14.500 1.278
12.00 0.500 -0.043
13.00 15.500 -1.371
14.00 30.500 -2.910
15.00 45.500 -5.018
16.00 60.500 -8.671
17.00 75.500 -18.451
18.00 90.500 -95.775</pre>
 
=={{header|FutureBasic}}==
<lang futurebasic>
include "ConsoleWindow"
 
local fn rad2deg( theta as double ) as double
end fn = theta * 180 / pi
 
local fn deg2rad( theta as double ) as double
end fn = theta * pi / 180
 
local fn SolarHourAngle( latitude as double, longitude as double, meridian as double )
dim as long hour
dim as double hra, hla, time
dim as Str15 ap
 
print "Latitude = "; latitude; chr$(13); "Longitude = "; longitude; chr$(13); "Meridian = "; meridian
print : print "sine of latitude: "; sin(latitude * pi / 180 ); chr$(13); " diff longitude: "; longitude - meridian
print : print "Time", "Sun hour angle", "Dial hour line angle"
for hour = 6 to 18
hra = ( 15 * hour ) - longitude + meridian - 180
hla = fn rad2deg( atn( sin( fn deg2rad( latitude ) ) * tan( fn deg2rad( hra ) )))
if abs( hra ) > 90 then hla = hla + 180 * sgn( hra * latitude )
if hour > 12 then time = hour - 12 : ap = " a.m." else time = hour : ap = " p.m."
print using "##"; time; ap, using "####.##"; hra, using "####.###"; hla
next hour
end fn
fn SolarHourAngle( -4.95, -150.5, -150.0 )
</lang>
 
Output:
<pre>
Latitude = -4.95
Longitude = -150.5
Meridian = -150
 
sine of latitude: -0.0862863658
diff longitude: -0.5
 
Time Sun hour angle Dial hour line angle
6 p.m. -89.50 84.225
7 p.m. -74.50 17.283
8 p.m. -59.50 8.334
9 p.m. -44.50 4.847
10 p.m. -29.50 2.795
11 p.m. -14.50 1.278
12 p.m. 0.50 -0.043
1 a.m. 15.50 -1.371
2 a.m. 30.50 -2.910
3 a.m. 45.50 -5.018
4 a.m. 60.50 -8.671
5 a.m. 75.50 -18.451
6 a.m. 90.50 -95.775
</pre>
 
=={{header|Go}}==
<langsyntaxhighlight lang="go">package main
 
import (
Line 938 ⟶ 1,749:
fmt.Printf("%2.0f %8.3f %8.3f\n", h, hra, hla)
}
}</langsyntaxhighlight>
{{out}}
<pre>
Line 963 ⟶ 1,774:
6 90.500 -95.775
</pre>
 
=={{header|GW-BASIC}}==
{{trans|ALGOL 68}}
{{works with|PC-BASIC|any}}
<lang qbasic>
10 ' Horizontal sundial calculations
20 PRINT "Enter latitude => ";
30 INPUT LAT
40 PRINT "Enter longitude => ";
50 INPUT LNG
60 PRINT "Enter legal meridian => ";
70 INPUT REF
80 PRINT
90 LET PI = 4 * ATN(1)
100 LET SLAT = SIN(LAT * PI / 180)
110 PRINT " sine of latitude: "; USING "#.##^^^^"; SLAT
120 PRINT " diff longitude: "; USING "####.###"; LNG - REF
130 PRINT
140 PRINT "Hour, sun hour angle, dial hour line angle from 6am to 6pm"
150 FOR H% = -6 TO 6
160 LET HRA = 15 * H%
170 LET HRA = HRA - (LNG - REF): ' correct for longitude difference
180 LET HLA = ATN(SLAT * TAN(HRA * PI / 180)) * 180 / PI
190 PRINT "HR="; USING "+##"; H%;
200 PRINT "; HRA="; USING "+###.###"; HRA;
210 PRINT "; HLA="; USING "+###.###"; HLA
220 NEXT H%
230 END
</lang>
{{out}}
<pre>
Enter latitude => ? -4.95
Enter longitude => ? -150.5
Enter legal meridian => ? -150
sine of latitude: -.86E-01
diff longitude: -0.500
Hour, sun hour angle, dial hour line angle from 6am to 6pm
HR= -6; HRA= -89.500; HLA= +84.225
HR= -5; HRA= -74.500; HLA= +17.283
HR= -4; HRA= -59.500; HLA= +8.334
HR= -3; HRA= -44.500; HLA= +4.847
HR= -2; HRA= -29.500; HLA= +2.795
HR= -1; HRA= -14.500; HLA= +1.278
HR= +0; HRA= +0.500; HLA= -0.043
HR= +1; HRA= +15.500; HLA= -1.371
HR= +2; HRA= +30.500; HLA= -2.910
HR= +3; HRA= +45.500; HLA= -5.018
HR= +4; HRA= +60.500; HLA= -8.671
HR= +5; HRA= +75.500; HLA= -18.451
HR= +6; HRA= +90.500; HLA= +84.225
</pre>
 
=={{header|Haskell}}==
<syntaxhighlight lang="haskell">roundDec :: Int -> Double -> Double
<lang haskell>module Rosetta.HorSunDial where
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)
 
radToDegrdegrToRad = ((180/pi / 180) *)
degrToRad = ((pi/180)*)
 
main = do
let lat = -4.95
long = -150.5
legalMerid = -150
sinOfLat = sin $ degrToRad lat
diff = legalMerid - long
(putStrLn . unlines)
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 -> ]
mapM_
let sha = diff + 15*h
(\h ->
dhla = radToDegr . atan. (sinOfLat *). tan $ degrToRad sha
in putStrLn $ take 7 (showlet hsha ++= repeatdiff '+ ')15 * h
dhla = radToDegr . atan . (sinOfLat *) . tan $ degrToRad sha
++ take 16 (show (roundDec 3 sha) ++ repeat ' ' )
++ " " ++ showin (roundDecputStrLn 3 dhla)$
take 7 (show h ++ repeat ' ') ++
) [-6,-5..6]</lang>
take 16 (show (roundDec 3 sha) ++ repeat ' ') ++
" " ++ show (roundDec 3 dhla))
[-6,-5 .. 6]</syntaxhighlight>
{{out}}
<pre>*Rosetta.HorSunDial> main
Line 1,069 ⟶ 1,829:
 
=={{header|Icon}} and {{header|Unicon}}==
<langsyntaxhighlight Iconlang="icon">procedure main()
PrintSundial(-4.95, -150.5, -150);
end
Line 1,092 ⟶ 1,852:
" HRA=",hra,", HLA=",hla)
}
end</langsyntaxhighlight>
{{out}}
<pre>latitude: -4.95
Line 1,116 ⟶ 1,876:
 
=={{header|J}}==
<langsyntaxhighlight lang="j">require 'trig'
atan2=: {:@*.@j. NB. arc tangent of y divided by x
Line 1,130 ⟶ 1,890:
r=.((,. (,. (atan2 *&slat)/@+.@r.&.rfd)) diff + 15&*) i:6
smoutput lbl ,: ('3.0';'7.3';'7.3') 8!:1 r
)</langsyntaxhighlight>
{{out|Example}}
<langsyntaxhighlight lang="j"> horiz _4.95 _150.5 _150
Latitude _4.95
Longitude _150.5
Line 1,154 ⟶ 1,914:
│ 5 │ 75.500 │-18.451 │
│ 6 │ 90.500 │-95.775 │
└──────┴────────────────┴────────────────────┘</langsyntaxhighlight>
 
=={{header|Java}}==
{{trans|C}} (Substitutes in atan2 for the hour line angle calculation)
<langsyntaxhighlight lang="java">import java.util.Scanner;
 
public class Sundial {
Line 1,189 ⟶ 1,949:
}
}
}</langsyntaxhighlight>
{{out}}
<pre>Enter latitude: -4.95
Line 1,212 ⟶ 1,972:
HR= 5; HRA= 75.500; HLA= -18.451
HR= 6; HRA= 90.500; HLA= -95.775</pre>
 
=={{header|jq}}==
{{works with|jq}}
'''Also works with gojq, the Go implementation of jq.'''
 
'''Adapted from [[#Wren|Wren]]'''
 
'''Generic Utilities'''
<syntaxhighlight lang=jq>
# `prompts` should be an array defining the prompts, variable names, and their types,
# as exemplified below.
# After all values have been gathered, `get` emits an object defining the bindings.
def get($prompts):
label $out
| foreach range(0;infinite) as $_ ({i:null, imax: ($prompts|length)};
if .i == null then .i = 0
elif .i == .imax then break $out
else .help = null
| first(inputs) as $n
| $prompts[.i].type as $type
| if $type == null or $type == "string"
then .result[$prompts[.i].key] = $n
| .i += 1
elif $type == "number"
then (try ($n|tonumber) catch null) as $n
| if $n then .result[$prompts[.i].key] = $n
| .i += 1
else .help = .i
end
elif $type == "integer"
then if ($n|test("^[0-9]+$"))
then .result[$prompts[.i].key] = ($n|tonumber)
| .i += 1
else .help = .i
end
elif $type|type == "object"
then if $type.regex and ($n | test($type.regex))
then .result[$prompts[.i].key] = $n
| .i += 1
else .help = .i
end
else .
end
end;
(select(.help) | $prompts[.help].help // empty),
if .i < .imax then $prompts[.i].prompt
else .result
end )
;
 
def lpad($len): tostring | ($len - length) as $l | (" " * $l)[:$l] + .;
def rpad($len): tostring | ($len - length) as $l | . + ("0" * $l)[:$l];
 
# Input: a string of digits with up to one "."
# Output: the corresponding string representation with exactly $n decimal digits
def align_decimal($n):
tostring
| if index(".")
then capture("(?<i>[0-9]*[.])(?<j>[0-9]{0," + ($n|tostring) + "})")
| .i + (.j|rpad($n))
else . + "." + ("0" * $n)
end ;
 
def pi: 4*(1|atan);
</syntaxhighlight>
'''The Task'''
<syntaxhighlight lang=jq>
def prompts: [
{ prompt: "Enter latitude: ", key: "lat", type: "number", help: "in degrees"},
{ prompt: "Enter longitude: ", key: "lng", type: "number", help: "in degrees"},
{ prompt: "Enter legal meridian: ", key: "ref", type: "number", help: "in degrees"}
];
 
def task:
get(prompts)
| if type != "object" then . # the prompts
else
((.lat * pi / 180)|sin) as $slat
| (.lng - .ref) as $diff
| "\n sine of latitude : \($slat)",
" diff longitude : \($diff)",
"\nHour, sun hour angle, dial hour line angle from 6am to 6pm",
(range(-6;7) as $h
| (15*$h - $diff) as $hra
| (($hra * pi /180)|sin) as $s
| (($hra * pi /180)|cos) as $c
| (atan2($slat*$s; $c) * 180 / pi) as $hla
| [$h|lpad(3)] + ([$hra, $hla] | map(align_decimal(3)|lpad(7))) | join(" ") )
end;
task
</syntaxhighlight>
'''Invocation''':
The program handles user input errors provided the -R option is specified:
<pre>
jq -nRr -f horizontal-sundial-calculations.jq
</pre>
'''Transcript'''
<pre>
Enter latitude:
-4.95
Enter longitude:
-150.5
Enter legal meridian:
?
in degrees
Enter legal meridian:
-150
 
sine of latitude : -0.08628636579792338
diff longitude : -0.5
 
Hour, sun hour angle, dial hour line angle from 6am to 6pm
-6 89.500 84.224
-5 74.500 17.282
-4 59.500 8.333
-3 44.500 4.846
-2 29.500 2.794
-1 14.500 1.278
0 0.500 0.043
1 15.500 1.370
2 30.500 2.909
3 45.500 5.018
4 60.500 8.671
5 75.500 18.450
6 90.500 95.775
</pre>
 
 
=={{header|Julia}}==
{{trans|Python}}
<langsyntaxhighlight lang="julia">
print("Enter latitude => ")
lat = parse(Float64, readline(STDIN))
Line 1,236 ⟶ 2,124:
@printf "HR = %3d; HRA = %7.3f; HLA = %7.3f\n" h hra hla
end
</syntaxhighlight>
</lang>
 
{{out}}
Line 1,265 ⟶ 2,153:
 
=={{header|Kotlin}}==
<langsyntaxhighlight lang="scala">import java.lang.Math.atan2
import java.lang.Math.cos
import java.lang.Math.sin
Line 1,297 ⟶ 2,185:
println("%2d %s %+7.3f %+7.3f".format(hr, am, sha, dhla))
}
}</langsyntaxhighlight>
Sample input/output:
{{out}}
Line 1,326 ⟶ 2,214:
6 PM +90.500 -95.775
</pre>
 
=={{header|Liberty BASIC}}==
Based on Algol & BBC BASIC versions. Note Liberty BASIC works in radians.
<lang lb>global pi
pi =3.14159265
 
input "Enter latitude (degrees) : "; latitude ' -4.95
input "Enter longitude (degrees) : "; longitude ' -150.5
input "Enter legal meridian (degrees): "; meridian ' -150.0
 
print
print "Time Sun hour angle Dial hour line angle"
 
for hour = 6 TO 18
hra =15 *hour - longitude +meridian -180
hla =rad2deg( atn( sin( deg2rad( latitude)) *tan( deg2rad( hra))))
if abs( hra) >90 then hla =hla +180 *sgn( hra *latitude)
print using( "##.##", hour), using("####.### ", hra), using("####.###", hla)
next hour
 
function rad2deg( theta)
rad2deg =theta *180 /pi
end function
 
function deg2rad( theta)
deg2rad =theta *pi /180
end function
 
function sgn( x)
if x >0 then sgn =1 else sgn =-1
end function
 
end</lang>
 
=={{header|LiveCode}}==
Translation of BASIC versions.
<langsyntaxhighlight LiveCodelang="livecode">on mouseUp
ask "Enter lng,lat,meridian"
if it is empty then exit mouseup
Line 1,389 ⟶ 2,244:
function sgn x
if x >0 then return 1 else return -1
end sgn</langsyntaxhighlight>
 
 
=={{header|Logo}}==
<langsyntaxhighlight lang="logo">type "|Enter latitude: |
make "lat readword
type "|Enter longitude: |
Line 1,405 ⟶ 2,259:
make "hla arctan product sin :lat quotient sin :hra cos :hra
print (sentence "hour :hour ": :hra ", :hla)
]</langsyntaxhighlight>
 
=={{header|Microsoft Small BasicLua}}==
{{trans|ALGOL-68Python}}
<syntaxhighlight lang="lua">io.write("Enter latitude => ")
<lang microsoftsmallbasic>
lat = tonumber(io.read())
TextWindow.Write("Enter latitude => ")
lat = TextWindow.ReadNumber()
TextWindow.Write("Enter longitude => ")
lng = TextWindow.ReadNumber()
TextWindow.Write("Enter legal meridian => ")
ref = TextWindow.ReadNumber()
sLat = Math.Sin(Math.GetRadians(lat))
TextWindow.WriteLine("")
TextWindow.Write(" sine of latitude: ")
TextWindow.WriteLine(Math.Round(sLat * 10000) / 10000)
TextWindow.Write(" diff longitude: ")
TextWindow.WriteLine(lng - ref)
TextWindow.WriteLine("")
TextWindow.WriteLine("Hour, sun hour angle, dial hour line angle from 6am to 6pm")
For hour = -6 To 6
hourAngle = 15 * hour
hourAngle = hourAngle - (lng - ref) ' correct for longitude difference
hourLineAngle = math.GetDegrees(Math.ArcTan(sLat * Math.Tan(Math.GetRadians(hourAngle))))
TextWindow.Write("HR=")
TextWindow.CursorLeft = 3 + (3 - Text.GetLength(hour))
TextWindow.Write(hour)
TextWindow.Write("; HRA=")
TextWindow.CursorLeft = 12 + (6 - Text.GetLength(hourAngle))
TextWindow.Write(hourAngle)
TextWindow.Write("; HLA=")
TextWindow.CursorLeft = 24 + (4 - Text.GetLength(Math.Floor(hourLineAngle)))
TextWindow.Write(Math.Round(hourLineAngle * 1000) / 1000)
TextWindow.WriteLine("")
EndFor
</lang>
{{out}}
 
io.write("Enter latitude longitude => -4.95")
lng = tonumber(io.read())
Enter longitude => -150.5
 
Enter legal meridian => -150
io.write("Enter legal meridian => ")
ref = tonumber(io.read())
sine of latitude: -0.0863
 
diff longitude: -0.5
print()
 
Hour, sun hour angle, dial hour line angle from 6am to 6pm
slat = math.sin(math.rad(lat))
HR= -6; HRA= -89.5; HLA= 84.225
 
HR= -5; HRA= -74.5; HLA= 17.283
print(string.format(" sine of latitude: %.3f", slat))
HR= -4; HRA= -59.5; HLA= 8.334
print(string.format(" diff longitude: %.3f", lng-ref))
HR= -3; HRA= -44.5; HLA= 4.847
print()
HR= -2; HRA= -29.5; HLA= 2.795
print("Hour, sun hour angle, dial hour line angle from 6am to 6pm")
HR= -1; HRA= -14.5; HLA= 1.278
 
HR= 0; HRA= 0.5; HLA= -0.043
for h = -6, 6 do
HR= 1; HRA= 15.5; HLA= -1.371
hra = 15 * h
HR= 2; HRA= 30.5; HLA= -2.91
HR= 3;hra HRA= hra 45.5;- HLA=(lng - -5.018ref)
hla = math.deg(math.atan(slat * math.tan(math.rad(hra))))
HR= 4; HRA= 60.5; HLA= -8.671
print(string.format("HR= 5%3d; HRA= 75%7.53f; HLA=%7.3f", -18.451h, hra, hla))
end</syntaxhighlight>
HR= 6; HRA= 90.5; HLA= 84.225
 
=={{header|Mathematica}} / {{header|Wolfram Language}}==
<syntaxhighlight lang="mathematica">lat = Input["latitude", -4.95];
lng = Input["longitude", -150.5];
ref = Input["legal meridian", -150];
 
slat = Sin[lat Degree];
Table[
hra = 15 h;
hra -= lng - ref;
hla = N@ArcTan[slat Tan[hra Degree]]/Degree;
{h, hra, hla}
,
{h, -6, 6}
] // Prepend[{"Hour", "Sun hour angle",
"Dial hour line angle"}] // Grid</syntaxhighlight>
{{out}}
<pre>Hour Sun hour angle Dial hour line angle
-6 -89.5 84.2248
-5 -74.5 17.2829
-4 -59.5 8.33371
-3 -44.5 4.84671
-2 -29.5 2.79487
-1 -14.5 1.27835
0 0.5 -0.0431443
1 15.5 -1.37079
2 30.5 -2.90964
3 45.5 -5.01802
4 60.5 -8.6714
5 75.5 -18.451
6 90.5 84.2248</pre>
 
=={{header|МК-61/52}}==
<syntaxhighlight lang="text">МГ П2 -> МГ П1 -> МГ sin П0
6 /-/ П3
ИП3 1 5 * ИП1 ИП2 - - П4
tg ИП0 * arctg ИП4 ИП3 С/П
ИП3 1 + П3 7 - x=0 12
Сx С/П</langsyntaxhighlight>
 
''Input'': ''latitude'' ^ ''longitude'' ^ ''legal meridian'' С/П ... С/П ...; switch of the angle measure set to ''Г''.
Line 1,481 ⟶ 2,336:
{{trans|ALGOL-68}}
{{works with|ADW Modula-2|any (Compile with the linker option ''Console Application'').}}
<langsyntaxhighlight lang="modula2">
MODULE SunDial;
 
Line 1,531 ⟶ 2,386:
END;
END SunDial.
</syntaxhighlight>
</lang>
{{out}}
Enter latitude => -4.95
Line 1,555 ⟶ 2,410:
HR= 6; HRA= 90.500; HLA= 84.225
 
=={{header|NimnewLISP}}==
{{trans|PythonLua}}
<syntaxhighlight lang="newlisp">(define pi 3.141592654)
<lang nim>import rdstdin, strutils, math, strfmt
(define (radians degrees) (mul degrees (div pi 180)))
(define (degrees radians) (mul radians (div 180 pi)))
 
(print "Enter latitude => ")
proc radians(x): float = x * Pi / 180
(set 'lat (float (read-line)))
proc degrees(x): float = x * 180 / Pi
 
(print "Enter longitude => ")
(set 'lng (float (read-line)))
 
(print "Enter legal meridian => ")
(set 'rf (float (read-line)))
 
(println)
 
(set 'slat (sin (radians lat)))
 
(println (format " sine of latitude: %.3f" slat))
(println (format " diff longitude: %.3f" (sub lng rf)))
(println)
(println "Hour, sun hour angle, dial hour line angle from 6am to 6pm")
 
(for (h -6 6)
(set 'hra (sub (mul 15 h) lng rf))
(set 'hla (degrees (atan (mul slat (tan (radians hra))))))
(println (format "HR=%3d; HRA=%7.3f; HLA=%7.3f" h hra hla))
)
 
(exit)</syntaxhighlight>
 
=={{header|Nim}}==
{{trans|Python}}
<syntaxhighlight lang="nim">import rdstdin, strutils, math, strformat
let lat = parseFloat readLineFromStdin "Enter latitude => "
let lng = parseFloat readLineFromStdin "Enter longitude => "
let med = parseFloat readLineFromStdin "Enter legal meridian => "
echo ""
 
let slat = sin radians lat.degToRad
echo &" sine of latitude: {slat:.3f}".fmt(slat)
echo &" diff longitude: {lng-med:.3f}".fmt(lng-med)
echo ""
echo "Hour, sun hour angle, dial hour line angle from 6am to 6pm"
 
for h in -6..6:
let hra = float(15 * h) - lng + med
let hla = degrees arctan(slat * tan radians (hra.degToRad)).radToDeg
echo &"HR={h:3d}; HRA={hra:7.3f}; HLA={hla:7.3f}".fmt(h, hra, hla)</langsyntaxhighlight>
 
Output:
{{out}}
<pre>Enter latitude => -4.95
Enter longitude => -150.5
Line 1,602 ⟶ 2,487:
=={{header|Objeck}}==
{{trans|C#}}
<langsyntaxhighlight lang="objeck">
class Sundial {
function : Main(args : String[]) ~ Nil {
Line 1,628 ⟶ 2,513:
}
}
</syntaxhighlight>
</lang>
 
=={{header|OCaml}}==
{{trans|ALGOL 68}}
<langsyntaxhighlight lang="ocaml">let () =
let pi = 4. *. atan 1. in
print_endline "Enter latitude => ";
Line 1,655 ⟶ 2,540:
Printf.printf "HR= %3d; \t HRA=%7.3f; \t HLA= %7.3f\n" h hra hla;
done
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 1,685 ⟶ 2,570:
 
=={{header|Octave}}==
<langsyntaxhighlight lang="octave">lat = input("Enter latitude: ");
lng = input("Enter longitude: ");
ref = input("Enter legal meridian: ");
Line 1,696 ⟶ 2,581:
hlas = atand( tand(hras) .* slat );
printf("HR= %3d; \t HRA=%7.3f; \t HLA= %7.3f\n",
[ [-6:6]; hras; hlas] );</langsyntaxhighlight>
 
=={{header|OoRexx}}==
{{trans|REXX}}
<langsyntaxhighlight lang="oorexx">/*REXX pgm shows: hour, sun hour angle, dial hour line angle, 6am ---> 6pm*/
/* Use trigonometric functions provided by rxCalc */
parse arg lat lng mer . /*get the optional arguments from the CL*/
Line 1,737 ⟶ 2,622:
sep: say indent copies('-',w1) copies('-',w2) copies('-',w3)
Return
::Requires rxMath Library</langsyntaxhighlight>
{{out}}
Not the same as for REXX anymore as the REXX computer programming example has been updated.
Same as for REXX.
 
=={{header|Pascal}}==
<langsyntaxhighlight lang="pascal">Program SunDial;
 
Const
Line 1,777 ⟶ 2,662:
tab, ' HLA= ', hla:7:3)
end
end.</langsyntaxhighlight>
 
=={{header|Perl 6}}==
{{trans|Raku}}
<lang perl6>sub postfix:<°> ($a) { $a * pi / 180 } # degrees to radians
<syntaxhighlight lang="perl">use utf8;
sub postfix:<®> ($a) { $a * 180 / pi } # radians to degrees
binmode STDOUT, ":utf8";
 
use constant π => 3.14159265;
my $latitude = prompt 'Enter latitude => ';
my $longitude = prompt 'Enter longitude => ';
my $meridian = prompt 'Enter legal meridian => ';
 
sub d2r { $_[0] * π / 180 } # degrees to radians
my $lat_sin = sin( $latitude° );
sub r2d { $_[0] * 180 / π } # radians to degrees
say 'Sine of latitude: ', $lat_sin.fmt("%.4f");
 
say 'Longitude offset: ', my $offset = $meridian - $longitude;
print 'Enter latitude => '; $latitude = <>;
say '=' x 48;
print 'Enter longitude => '; $longitude = <>;
say ' Hour : Sun hour angle° : Dial hour line angle°';
print 'Enter legal meridian => '; $meridian = <>;
 
$lat_sin = sin( d2r($latitude) );
for -6 .. 6 -> $hour {
$offset = $meridian - $longitude;
print 'Sine of latitude: ' . sprintf "%.4f\n", $lat_sin;
print 'Longitude offset: ' . $offset . "\n";
print '=' x 48 . "\n";
print " Hour : Sun hour angle°: Dial hour line angle°\n";
 
for $hour (-6 .. 6) {
my $sun_deg = $hour * 15 + $offset;
my $line_deg = r2d atan2( ( sin(d2r($sun_deg°)) * $lat_sin ), cos(d2r($sun_deg°)) )®;
printf "%2d %s %78.3f %78.3f\n",
($hour + 12) % 12 || 12, ($hour < 0 ?? 'AM' !!: 'PM'), $sun_deg, $line_deg;
}</langsyntaxhighlight>
{{out|Example output}}
<pre>Enter latitude => -4.95
<pre>
Enter latitude => -4.95
Enter longitude => -150.5
Enter legal meridian => -150
 
Sine of latitude: -0.0863
Longitude offset: 0.5
================================================
Hour : Sun hour angle° : Dial hour line angle°
6 AM -89.500 84.225
7 AM -74.500 17.283
Line 1,820 ⟶ 2,712:
4 PM 60.500 -8.671
5 PM 75.500 -18.451
6 PM 90.500 -95.775</pre>
</pre>
 
=={{header|Phix}}==
For better behaviour/proper input on pwa/p2js I suppose this should really be a pGUI app.
Copy of [[Horizontal_sundial_calculations#Euphoria|Euphoria]]
<!--<syntaxhighlight lang="phix">(phixonline)-->
<lang Phix>atom lat = prompt_number("Enter Latitude: ",{})
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
atom lng = prompt_number("Enter Longitude: ",{})
<span style="color: #008080;">function</span> <span style="color: #000000;">prompt</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">text</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">atom</span> <span style="color: #000000;">v</span><span style="color: #0000FF;">)</span>
atom lm = prompt_number("Enter Legal Meridian: ",{})
<span style="color: #008080;">if</span> <span style="color: #7060A8;">platform</span><span style="color: #0000FF;">()!=</span><span style="color: #004600;">JS</span> <span style="color: #008080;">then</span>
puts(1,'\n')
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Enter %s (%g):"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">text</span><span style="color: #0000FF;">,</span><span style="color: #000000;">v</span><span style="color: #0000FF;">})</span>
<span style="color: #004080;">object</span> <span style="color: #000000;">answer</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">gets</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">'\n'</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #004080;">string</span><span style="color: #0000FF;">(</span><span style="color: #000000;">answer</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">v</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">to_number</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">trim</span><span style="color: #0000FF;">(</span><span style="color: #000000;">answer</span><span style="color: #0000FF;">),</span><span style="color: #000000;">v</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">else</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%s:%g\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">text</span><span style="color: #0000FF;">,</span><span style="color: #000000;">v</span><span style="color: #0000FF;">})</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">v</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">deg2rad</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">PI</span><span style="color: #0000FF;">/</span><span style="color: #000000;">180</span><span style="color: #0000FF;">,</span>
atom ha, hla
<span style="color: #000000;">rad2deg</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">180</span><span style="color: #0000FF;">/</span><span style="color: #004600;">PI</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">lat</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">prompt</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"Latitude"</span><span style="color: #0000FF;">,-</span><span style="color: #000000;">4.95</span><span style="color: #0000FF;">),</span>
function Deg2Rad(atom degrees)
<span style="color: #000000;">lng</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">prompt</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"Longitude"</span><span style="color: #0000FF;">,-</span><span style="color: #000000;">150.5</span><span style="color: #0000FF;">),</span>
return degrees * PI / 180
<span style="color: #000000;">mer</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">prompt</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"Legal Meridian"</span><span style="color: #0000FF;">,-</span><span style="color: #000000;">150</span><span style="color: #0000FF;">),</span>
end function
<span style="color: #000000;">slat</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sin</span><span style="color: #0000FF;">(</span><span style="color: #000000;">lat</span><span style="color: #0000FF;">*</span><span style="color: #000000;">deg2rad</span><span style="color: #0000FF;">)</span>
function Rad2Deg(atom radians)
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"""
return radians * 180 / PI
end function
Sine of latitude: %g
Longitude offset: %g
function atan2(atom y, atom x)
return 2*arctan((sqrt(power(x,2)+power(y,2)) - x)/y)
Hour Sun hour angle Dial hour line angle
end function
-------- -------------- --------------------
"""</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">slat</span><span style="color: #0000FF;">,</span><span style="color: #000000;">lng</span><span style="color: #0000FF;">-</span><span style="color: #000000;">mer</span><span style="color: #0000FF;">})</span>
atom s_lat = sin(Deg2Rad(lat))
<span style="color: #008080;">for</span> <span style="color: #000000;">hour</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">6</span> <span style="color: #008080;">to</span> <span style="color: #000000;">6</span> <span style="color: #008080;">do</span>
puts(1,"Hour, Sun Hour Angle, Dial Hour Line Angle\n")
<span style="color: #004080;">atom</span> <span style="color: #000000;">ha</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">hour</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">15</span> <span style="color: #0000FF;">-</span> <span style="color: #000000;">lng</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">mer</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sin</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ha</span><span style="color: #0000FF;">*</span><span style="color: #000000;">deg2rad</span><span style="color: #0000FF;">),</span>
for hour = -6 to 6 do
<span style="color: #000000;">c</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">cos</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ha</span><span style="color: #0000FF;">*</span><span style="color: #000000;">deg2rad</span><span style="color: #0000FF;">),</span>
ha = hour * 15 - lng + lm
<span style="color: #000000;">hla</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">atan2</span><span style="color: #0000FF;">(</span><span style="color: #000000;">slat</span><span style="color: #0000FF;">*</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #000000;">c</span><span style="color: #0000FF;">)*</span><span style="color: #000000;">rad2deg</span>
atom s = sin(Deg2Rad(ha))
<span style="color: #004080;">integer</span> <span style="color: #000000;">hour12</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">hour</span><span style="color: #0000FF;"><=</span><span style="color: #000000;">0</span><span style="color: #0000FF;">?</span><span style="color: #000000;">hour</span><span style="color: #0000FF;">+</span><span style="color: #000000;">12</span><span style="color: #0000FF;">:</span><span style="color: #000000;">hour</span><span style="color: #0000FF;">)</span>
atom c = cos(Deg2Rad(ha))
<span style="color: #004080;">string</span> <span style="color: #000000;">am</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">hour</span><span style="color: #0000FF;"><</span><span style="color: #000000;">0</span><span style="color: #0000FF;">?</span><span style="color: #008000;">"am"</span><span style="color: #0000FF;">:</span><span style="color: #008000;">"pm"</span><span style="color: #0000FF;">)</span>
hla = Rad2Deg(atan2(s_lat*s,c))
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%3d:00%s %12.3f %17.3f\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">hour12</span><span style="color: #0000FF;">,</span><span style="color: #000000;">am</span><span style="color: #0000FF;">,</span><span style="color: #000000;">ha</span><span style="color: #0000FF;">,</span><span style="color: #000000;">hla</span><span style="color: #0000FF;">})</span>
printf(1,"%3d %7.3f %7.3f\n",{hour+12,ha,hla})
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
end for
<!--</syntaxhighlight>-->
{} = wait_key()</lang>
{{out}}
<pre>
Enter Latitude: (-4.95):
Enter Longitude: (-150.5):
Enter Legal Meridian: (-150):
 
Sine of latitude: -0.086286
Hour, Sun Hour Angle, Dial Hour Line Angle
Longitude offset: -0.5
6 -89.500 84.225
 
7 -74.500 17.283
8Hour Sun hour angle -59.500 Dial hour line 8.334angle
-------- -------------- --------------------
9 -44.500 4.847
10 6:00am -2989.500 284.795225
11 7:00am -1474.500 117.278283
12 8:00am 0-59.500 -0 8.043334
13 9:00am 15-44.500 -1 4.371847
1410:00am 30-29.500 - 2.910795
1511:00am 45-14.500 -5 1.018278
1612:00pm 600.500 -80.671043
17 1:00pm 75 15.500 -181.451371
18 2:00pm 90 30.500 -952.775910
3:00pm 45.500 -5.018
4:00pm 60.500 -8.671
5:00pm 75.500 -18.451
6:00pm 90.500 -95.775
</pre>
 
=={{header|PicoLisp}}==
{{trans|ALGOL 68}}
<langsyntaxhighlight PicoLisplang="picolisp">(load "@lib/math.l")
 
(de prompt (Str . Arg)
Line 1,906 ⟶ 2,812:
(align 8 (round Hra))
"; HLA="
(align 8 (round Hla)) ) ) ) ) ) )</langsyntaxhighlight>
{{out}}
<pre>Enter latitude => -4.95
Line 1,931 ⟶ 2,837:
 
=={{header|PowerShell}}==
<syntaxhighlight lang="powershell">
<lang PowerShell>
function Get-Sundial
{
Line 1,982 ⟶ 2,888:
$sundial | Select-Object -Property "Sine of Latitude", "Longitude Difference" | Format-List
$sundial.Hours | Format-Table -AutoSize
</syntaxhighlight>
</lang>
{{Out}}
<pre>
Line 2,008 ⟶ 2,914:
6:00 PM 90.5 84.225
 
</pre>
 
=={{header|PureBasic}}==
{{trans|ALGOL 68}}
<lang PureBasic>If OpenConsole()
Define.f lat, slat, lng, ref
Define.i h
Print("Enter latitude => "): lat=ValF(Input())
Print("Enter longitude => "): lng=ValF(Input())
Print("Enter legal meridian => "): ref=ValF(Input())
PrintN("")
slat=Sin(lat*2*#PI/360)
PrintN(" sine of latitude: "+StrF(slat,3))
PrintN(" diff longitude: "+StrF((lng-ref),3)+#CRLF$)
PrintN("Hour, sun hour angle, dial hour line angle from 6am to 6pm")
For h=-6 To 6
Define.f hra, hla
hra=15*h
hra=hra-(lng-ref)
hla=ATan(slat*Tan(hra*2*#PI/360))*360/(2*#PI)
PrintN("HR="+RSet(Str(h),3)+"; HRA="+RSet(StrF(hra,3),7)+"; HLA="+RSet(StrF(hla,3),7))
Next
EndIf</lang>
{{out}}
<pre>Enter latitude => -4.95
Enter longitude => -150.5
Enter legal meridian => -150
 
sine of latitude: -0.086
diff longitude: -0.500
 
Hour, sun hour angle, dial hour line angle from 6am to 6pm
HR= -6; HRA=-89.500; HLA= 84.225
HR= -5; HRA=-74.500; HLA= 17.283
HR= -4; HRA=-59.500; HLA= 8.334
HR= -3; HRA=-44.500; HLA= 4.847
HR= -2; HRA=-29.500; HLA= 2.795
HR= -1; HRA=-14.500; HLA= 1.278
HR= 0; HRA= 0.500; HLA= -0.043
HR= 1; HRA= 15.500; HLA= -1.371
HR= 2; HRA= 30.500; HLA= -2.910
HR= 3; HRA= 45.500; HLA= -5.018
HR= 4; HRA= 60.500; HLA= -8.671
HR= 5; HRA= 75.500; HLA=-18.451
HR= 6; HRA= 90.500; HLA= 84.225
</pre>
 
=={{header|Python}}==
{{trans|ALGOL 68}}
<langsyntaxhighlight lang="python">from __future__ import print_function
import math
try: raw_input
Line 2,080 ⟶ 2,938:
hra -= lng - ref
hla = math.degrees(math.atan(slat * math.tan(math.radians(hra))))
print("HR=%3d; HRA=%7.3f; HLA=%7.3f" % (h, hra, hla))</langsyntaxhighlight>
{{out}}
<pre>
Line 2,113 ⟶ 2,971:
Also, I apologize for the length; I added quite a bit of commenting, and I peeled things out into functions so I could test them. Hopefully, the result--though longer--is also more readable.
 
<langsyntaxhighlight Racketlang="racket">#lang racket
 
;; print the table for a given latitude and longitude-offset,
Line 2,190 ⟶ 3,048:
(check-= (to-hla -30 90) -90 1e-5)
(check < (to-hla -30 91) -90)
</syntaxhighlight>
</lang>
{{Out}}
<pre>Welcome to DrRacket, version 5.3.3.5--2013-02-20(5eddac74/d) [3m].
Line 2,215 ⟶ 3,073:
HR= 6; HRA= 90.500; HLA=-95.775
>
</pre>
 
=={{header|Raku}}==
(formerly Perl 6)
<syntaxhighlight lang="raku" line>sub postfix:<°> ($a) { $a * pi / 180 } # degrees to radians
sub postfix:<®> ($a) { $a * 180 / pi } # radians to degrees
 
my $latitude = prompt 'Enter latitude => ';
my $longitude = prompt 'Enter longitude => ';
my $meridian = prompt 'Enter legal meridian => ';
 
my $lat_sin = sin( $latitude° );
say 'Sine of latitude: ', $lat_sin.fmt("%.4f");
say 'Longitude offset: ', my $offset = $meridian - $longitude;
say '=' x 48;
say ' Hour : Sun hour angle° : Dial hour line angle°';
 
for -6 .. 6 -> $hour {
my $sun_deg = $hour * 15 + $offset;
my $line_deg = atan2( ( sin($sun_deg°) * $lat_sin ), cos($sun_deg°) )®;
printf "%2d %s %7.3f %7.3f\n",
($hour + 12) % 12 || 12, ($hour < 0 ?? 'AM' !! 'PM'), $sun_deg, $line_deg;
}</syntaxhighlight>
{{out|Example output}}
<pre>
Enter latitude => -4.95
Enter longitude => -150.5
Enter legal meridian => -150
Sine of latitude: -0.0863
Longitude offset: 0.5
================================================
Hour : Sun hour angle° : Dial hour line angle°
6 AM -89.500 84.225
7 AM -74.500 17.283
8 AM -59.500 8.334
9 AM -44.500 4.847
10 AM -29.500 2.795
11 AM -14.500 1.278
12 PM 0.500 -0.043
1 PM 15.500 -1.371
2 PM 30.500 -2.910
3 PM 45.500 -5.018
4 PM 60.500 -8.671
5 PM 75.500 -18.451
6 PM 90.500 -95.775
</pre>
 
Line 2,222 ⟶ 3,125:
 
The &nbsp; ''legal meridian'' &nbsp; is calculated instead of relying on a specified amount.
 
The time range was extended &nbsp; (to include quarter─hour times), &nbsp; and to show that the &nbsp;''dial hour line angle''&nbsp; just doesn't
<br> change its sign when it exceeds &nbsp;<big>'''±&nbsp;90º'''</big>.
 
No attempt was made to explain the inner workings of the trigonometric functions.
<langsyntaxhighlight lang="rexx">/*REXX program displays: hour, sun hour angle, dial hour line angle, 6am ───► 6pm. */
numeric digits 60 length( pi() ) - length(.) /*in case sundial is in polar regions. */
parse arg lat lng . /*obtain optional arguments from the CL*/
/* ┌───────────◄ None specified? Then use the default*/
/* │ of Jules Verne's Lincoln Island, */
$= left('', 30) /* ↓ aka Ernest Legouve Reef. */
if lat=='' | lat=="," then lat= -4.95 /*Not specified? Then use the default.*/
if lng=='' | lng=="," then lng= -150.5 /* " " " " " " */
mer= format(lng/15, , 0) * 15 15 /*calculate legal meridian longitude. */
sineLat= sin( d2r(lat) ) /*calculate sine of (radian) latitude. */
w1= max( length('hour' ), length("midnight" )) + 2 /*compute the max hour width.*/
w2= max( length('sun hour' ), length("angle" )) + 2 /* " " " angle " */
w3= max( length('dial hour'), length("line angle")) + 2 /* " " " lineº " */
L= max( length(lat), length(lng), length(mer) ) /*find the maximum length of three3 numbers.*/
say ' latitude:' right(lat, L) /*display the latitude to the terminal*/
say ' longitude:' right(lng, L) /* " " longitude " " " */
say ' legal meridian:' right(mer, L) /* " legal meridian " " " */
say $ indent=leftcenter('', 30) ', w1) center("sun hour", w2) center('dial hour' , /*make prettier: indented presentation.*/w3)
say indent$ center(' hour', w1) center("sun hourangle" , w2) center('dialline hourangle' , w3)
say indent center('hour', w1) center("angle" , w2) center('line angle', w3)
call sep /*to help a one─eyed pirate's eyeball. */
do h=-65 to 6 19 by .25 /*Okey dokey then, now let's show stuff*/
hra= 15 * h - lng + mer - 180 /*calculate sun hour angle (in degrees)*/
select
hla= r2d( Atan(sineLat * tan(d2r(hra)))) /*this is the heavy lifting calculation*/
when abs(h)==12 then hc='midnight' /*Holy smokes! Above the arctic circle.*/
if when h <0 abs(hra)>90 then hchla= -hhla + 'am'180 * /sign(hra*convertlat) da hour/*adjust for humannegative beans (sic)angle*/
call civil when h==0 then hc='noon' /* ··· easier to understand now. /*convert the time─of─day to civil time*/
say $ center(hc, w1) right(format(hra,,1), w2-2)@ right(format(hla,,1), w3-5)
when h >0 then hc= h 'pm' /* ··· even more meaningful. */
end /*select*/
hra=15 * h - lng + mer /*calculate sun hour angle (in degrees)*/
hla=r2d( Atan(sineLat * tan( d2r(hra)))) /*this is the heavy lifting calculation*/
if abs(hra)>90 then hla=hla + 180*sign(hra*lat) /*adjust for negative angle. */
say indent center(hc, w1) right(format(hra, ,1), w2) right(format(hla, ,1), w3)
end /*h*/
call sep /*to help a one─eyed pirate's eyeball. */
exit 0 /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
pi: pi= 3.1415926535897932384626433832795028841971693993751058209749445923078; return pi
Line 2,265 ⟶ 3,165:
r2d: return d2d( (arg(1) * 180 / pi() ) ) /*convert radians ──► degrees. */
r2r: return arg(1) //(pi() * 2) /*normalize radians ──► a unit circle. */
sep: say indent$ copies('═', w1) copies("═", w2) copies('═', w3); @= left('',3); return
tan: procedure; parse arg x; _= cos(x); if _=0 then call tanErr; return sin(x)/_
tellErr: say; say '*** error ***'; say; say arg(1); say; exit 13
AsinErr: call tellErr 'Asin(x), X must be in the range of -1 ──► +1, X=' x
AcosErr: call tellErr 'Acos(x), X must be in the range of -1 ──► +1, X=' x
tanErr: call tellErr 'tan(' || x") causes division by zero, X=" x
Acos: procedure; arg x; if x<-1 | x>1 then call AcosErr; return .5 * pi() - Asin(x)
Atan: procedure; parse arg x; if abs(x)=1 then return pi()/4*x/4; return Asin(x/sqrt(1+x*x))
/*──────────────────────────────────────────────────────────────────────────────────────*/
Asin: procedure; parse arg x; if x<-1 | x>1 then call AsinErr; s= x*x
if abs(x)>=sqrt(2)*.5 then return sign(x) * Acos(sqrt(1-s)); z= x; o= x; p= z
do j=2 by 2; o= o*s*(j-1)/j; z=z+o/(j+1); if z=p then leave; p= z; end; return z
/*──────────────────────────────────────────────────────────────────────────────────────*/
Asinsin: procedure; parse arg x; if x<-1 | x>1= r2r(x); then call AsinErr; s=x*x numeric fuzz min(5, digits() - 3)
if abs(x)>=sqrt(2)*.5pi then return; sign(x) * Acos(sqrt(1-s)); z=x; o=x; return p=z.sinCos(x, x, 1)
do j=2 by 2; o=o*s*(j-1)/j; z=z+o/(j+1); if z=p then leave; p=z; end; return z
/*──────────────────────────────────────────────────────────────────────────────────────*/
sincos: procedure; parse arg x; x= r2r(x); numeric fuzz min(5, digits a= abs(x); - 3) hpi= pi * .5
ifnumeric absfuzz min(x)=pi6, digits() - then return 3); if a=pi then return .sinCos(x,x,-1)
if a=hpi | a=hpi*3 then return 0; if a=pi/3 then return .5
if a=pi * 2 / 3 then return '-.5'; return .sinCos(1, 1, '-1')
/*──────────────────────────────────────────────────────────────────────────────────────*/
cos.sinCos: procedure; parse arg xz,!,i; x=r2r( x*x); a=abs(x); hpi p=pi*.5 z
do #=2 by 2; != numeric fuzz min-!*x/(6, digits#*(#+i)); -z= 3)z+!; if z=p then leave; if ap=pi() z; thenend; return -1z
if a=hpi | a=hpi*3 then return 0; if a=pi()/3 then return .5
if a=pi() * 2 / 3 then return -.5; return .sinCos(1,1,-1)
/*──────────────────────────────────────────────────────────────────────────────────────*/
.sinCoscivil: parse arg z,_,i; select x=x*x; /* [↓] Maybe p=zbelow Antarctic circle, */
do kwhen h==2 by0 2; _then hc= -_*x'midnight' /(k*(k+i)); z=z+_; if z=p then leave; p=z; end;or above return z Arctic " */
when h <12 then hc= h 'am' /*convert da hour for human beans (sic)*/
when h==12 then hc= 'noon' /* ··· easier to understand now. */
when h >0 then hc= h 'pm' /* ··· even more meaningful. */
end /*select*/
parse var hc hh ampm .; if \datatype(hh, 'N') then return /*not numeric? */
hh= hh / 1; if hh>12 then hh= hh - 12 /*civil time ? */
if pos(., hh)==0 then do; hc= right(hh, 2)' ' ampm; return; end /*exact hour ? */
parse var hh hr '.' -0 mn; if hr==0 then hr= 12 /*get MN; noon?*/
mn= mn * 60 / 1; hc= right(hr, 2)":"right(mn, 2, 0) ampm; return /*reformat time*/
/*──────────────────────────────────────────────────────────────────────────────────────*/
sqrt: procedure; parse arg x; if x=0 then return 0; d=digits(); numeric digits; h=d+6
m.=9; numeric form; parse value format(x,2,1,,0) 'E0' with g 'E' _ .; g=g*.5'e'_ % 2
do j=0 while h>9; m.j= h; h= h % 2 + 1; end /*j*/
do k=j+5 to 0 by -1; numeric digits m.k; g= (g+x/g) *.5; end /*k*/; return g</langsyntaxhighlight>
{{out|output|text=&nbsp; when using the default inputs:}}
<pre>
Line 2,299 ⟶ 3,211:
legal meridian: -150
sun hour dial hour
hour angle angle line angle
══════════ ══════════ ════════════
6 am -89.5 84.2
5 am -74.5 17.3
4 am -59.5 8.3
3 am -44.5 4.8
2 am -29.5 2.8
1 am -14.5 1.3
noon 0.5 0.0
1 pm 15.5 -1.4
2 pm 30.5 -2.9
3 pm 45.5 -5.0
4 pm 60.5 -8.7
5 pm 75.5 -18.5
6 pm 90.5 84.2
══════════ ══════════ ════════════
5 am -104.5 161.5
5:15 am -100.8 155.6
5:30 am -97.0 144.9
5:45 am -93.3 123.3
6 am -89.5 84.2
6:15 am -85.8 49.3
6:30 am -82.0 31.5
6:45 am -78.3 22.5
7 am -74.5 17.3
7:15 am -70.8 13.9
7:30 am -67.0 11.5
7:45 am -63.3 9.7
8 am -59.5 8.3
8:15 am -55.8 7.2
8:30 am -52.0 6.3
8:45 am -48.3 5.5
9 am -44.5 4.8
9:15 am -40.8 4.3
9:30 am -37.0 3.7
9:45 am -33.3 3.2
10 am -29.5 2.8
10:15 am -25.8 2.4
10:30 am -22.0 2.0
10:45 am -18.3 1.6
11 am -14.5 1.3
11:15 am -10.8 0.9
11:30 am -7.0 0.6
11:45 am -3.3 0.3
12 pm 0.5 0.0
12:15 pm 4.3 -0.4
12:30 pm 8.0 -0.7
12:45 pm 11.8 -1.0
1 pm 15.5 -1.4
1:15 pm 19.3 -1.7
1:30 pm 23.0 -2.1
1:45 pm 26.8 -2.5
2 pm 30.5 -2.9
2:15 pm 34.3 -3.4
2:30 pm 38.0 -3.9
2:45 pm 41.8 -4.4
3 pm 45.5 -5.0
3:15 pm 49.3 -5.7
3:30 pm 53.0 -6.5
3:45 pm 56.8 -7.5
4 pm 60.5 -8.7
4:15 pm 64.3 -10.1
4:30 pm 68.0 -12.1
4:45 pm 71.8 -14.7
5 pm 75.5 -18.5
5:15 pm 79.3 -24.4
5:30 pm 83.0 -35.1
5:45 pm 86.8 -56.7
6 pm 90.5 -95.8
6:15 pm 94.3 -130.7
6:30 pm 98.0 -148.5
6:45 pm 101.8 -157.5
7 pm 105.5 -162.7
══════════ ══════════ ════════════
</pre>
 
=={{header|Ring}}==
<langsyntaxhighlight lang="ring">
# Project : Horizontal sundial calculations
# Date : 2017/10/24
# Author : Gal Zsolt (~ CalmoSoft ~)
# Email : <calmosoft@gmail.com>
 
load "stdlib.ring"
Line 2,346 ⟶ 3,299:
see "" + hour + " " + hra + " " + hla + nl
next
</syntaxhighlight>
</lang>
Output:
<pre>
Line 2,371 ⟶ 3,324:
{{trans|ALGOL 68}}
{{trans|Python}}
<langsyntaxhighlight lang="ruby">include Math
DtoR = PI/180
 
Line 2,393 ⟶ 3,346:
hla = atan( slat * tan( hra * DtoR ))/ DtoR
puts "HR =%3d; HRA =%7.3f; HLA =%7.3f" % [h, hra, hla]
end</langsyntaxhighlight>
{{out}}
<pre>
Line 2,419 ⟶ 3,372:
</pre>
 
=={{header|Run BASICRust}}==
<syntaxhighlight lang="rust">
<lang runbasic>global pi
use std::io;
pi = 22 / 7
struct SundialCalculation {
hour_angle: f64,
print "Enter latitude (degrees) : "; :input latitude ' -4.95
hour_line_angle: f64,
print "Enter longitude (degrees) : "; :input longitude ' -150.5
}
print "Enter legal meridian (degrees): "; :input meridian ' -150.0
 
fn get_input(prompt: &str) -> Result<f64, Box<dyn std::error::Error>> {
print
println!("{}", prompt);
print "Time Sun hour angle Dial hour line angle"
let mut input = String::new();
let stdin = io::stdin();
for hour = 6 TO 18
stdin.read_line(&mut input)?;
hra = (15 * hour) - longitude + meridian -180
Ok(input.trim().parse::<f64>()?)
hla =rad2deg( atn( sin( deg2rad( latitude)) *tan( deg2rad( hra))))
}
if abs( hra) >90 then hla =hla +180 *sgn( hra *latitude)
 
print using( "##", hour);" ";using("####.##", hra);" ";using("####.###", hla)
fn calculate_sundial(hour: i8, lat: f64, lng: f64, meridian: f64) -> SundialCalculation {
next hour
let diff = lng - meridian;
let hour_angle = f64::from(hour) * 15. - diff;
function rad2deg( theta)
let hour_line_angle = (hour_angle.to_radians().tan() * lat.to_radians().sin())
rad2deg =theta *180 /pi
.atan()
end function
.to_degrees();
 
function deg2rad( theta)
SundialCalculation {
deg2rad =theta *pi /180
hour_angle,
end function
hour_line_angle,
}
function sgn( x)
}
if x >0 then sgn =1 else sgn =-1
fn main() -> Result<(), Box<dyn std::error::Error>> {
end function
let lat = get_input("Enter latitude => ")?;
end</lang>
let lng = get_input("Enter longitude => ")?;
let meridian = get_input("Enter legal meridian => ")?;
let diff = lng - meridian;
 
let sine_lat = lat.to_radians().sin();
println!("Sine of latitude: {:.5}", sine_lat);
println!("Diff longitude: {}", diff);
 
println!(" Hrs Angle Hour Line Angle");
(-6..=6).for_each(|hour| {
let sd = calculate_sundial(hour, lat, lng, meridian);
println!(
"{:>3}{} {:>5} {:>+15.5}",
if hour == 0 { 12 } else { (hour + 12) % 12 },
if hour <= 6 { "pm" } else { "am" },
sd.hour_angle,
sd.hour_line_angle
);
});
Ok(())
}
 
</syntaxhighlight>
{{out}}
<pre>
Enter latitude: -4.95 =>
-4.95
Enter longitude: -150.5
Enter legallongitude meridian: -150 =>
-150.5
 
Enter legal meridian =>
Time Sun hour angle Dial hour line angle
-150
6 -89.50 84.606
Sine of latitude: -0.08629
7 -74.50 17.316
8 Diff longitude: -590.505 8.342
Hrs Angle Hour Line Angle
9 -44.50 4.850
10 6pm -2989.50 5 2+84.79622483
11 7pm -1474.50 5 1+17.27928293
12 8pm 0-59.505 -0+8.04333371
13 9pm 15-44.505 -1+4.37184671
14 10pm 30-29.505 -+2.91179487
15 11pm 45-14.505 -5+1.02127835
16 12pm 600.50 5 -80.68004314
17 1pm 7515.505 -181.48837079
18 2pm 9030.505 -962.224</pre>90964
3pm 45.5 -5.01802
4pm 60.5 -8.67140
5pm 75.5 -18.45100
6pm 90.5 +84.22483
</pre>
 
=={{header|Sather}}==
<langsyntaxhighlight lang="sather">class MAIN is
 
getvalue(s:STR):FLT is
Line 2,502 ⟶ 3,483:
end;
end;
end;</langsyntaxhighlight>
 
=={{header|Scala}}==
<syntaxhighlight lang="scala">import java.util.Scanner
 
import scala.math.{atan2, cos, sin, toDegrees, toRadians}
 
object Sundial extends App {
var lat, slat,lng, ref = .0
val sc = new Scanner(System.in)
print("Enter latitude: ")
lat = sc.nextDouble
print("Enter longitude: ")
lng = sc.nextDouble
print("Enter legal meridian: ")
ref = sc.nextDouble
println()
slat = Math.sin(Math.toRadians(lat))
println(f"sine of latitude: $slat%.3f")
println(f"diff longitude: ${lng - ref}%.3f\n")
println("Hour, sun hour angle, dial hour line angle from 06h00 to 18h00")
 
for (h <- -6 to 6) {
val hra = 15.0 * h - lng + ref
val hraRad = toRadians(hra)
val hla = toDegrees(atan2(Math.sin(hraRad) * sin(Math.toRadians(lat)), cos(hraRad)))
println(f"HR= $h%3d;\tHRA=$hra%7.3f;\tHLA= $hla%7.3f")
}
 
}</syntaxhighlight>
 
=={{header|Seed7}}==
<langsyntaxhighlight lang="seed7">$ include "seed7_05.s7i";
include "float.s7i";
include "math.s7i";
Line 2,541 ⟶ 3,551:
"; HLA= " <& hla digits 3 lpad 7);
end for;
end func;</langsyntaxhighlight>
{{out}}
<pre>Enter latitude: -4.95
<pre>
Enter latitude: -4.95
Enter longitude: -150.5
Enter legal meridian: -150
Line 2,564 ⟶ 3,573:
HR= 4; HRA= 60.500; HLA= -8.671
HR= 5; HRA= 75.500; HLA= -18.451
HR= 6; HRA= 90.500; HLA= 84.225</pre>
</pre>
 
=={{header|Sidef}}==
{{trans|Perl 6Raku}}
<langsyntaxhighlight lang="ruby">var latitude = read('Enter latitude => ', Number)
var longitude = read('Enter longitude => ', Number)
var meridian = read('Enter legal meridian => ', Number)
Line 2,591 ⟶ 3,599:
printf("%2d %s  %7.3f  %7.3f\n",
(hour + 12) % 12 || 12, (hour < 0 ? 'AM' : 'PM'), sun_deg, line_deg)
}</langsyntaxhighlight>
{{out}}
<pre>
Line 2,618 ⟶ 3,626:
=={{header|Smalltalk}}==
{{works with|GNU Smalltalk}}
<langsyntaxhighlight lang="smalltalk">|lat slat lng ref hra hla pi|
pi := 1 arcTan * 4.
'Enter latitude: ' display. lat := stdin nextLine asNumber.
Line 2,634 ⟶ 3,642:
hla := (hra degreesToRadians tan * slat) arcTan radiansToDegrees.
('HR= %1; %4 HRA=%2; %4 HLA= %3' % { h. hra. hla. $<9> }) displayNl.
]</langsyntaxhighlight>
 
=={{header|Tcl}}==
{{trans|ALGOL 68}}
<langsyntaxhighlight lang="tcl">set PI 3.1415927
fconfigure stdout -buffering none
puts -nonewline "Enter latitude => "; gets stdin lat
Line 2,656 ⟶ 3,664:
set hla [expr {atan($slat * tan($hra*$PI/180)) * 180/$PI}]
puts [format "HR=%+3d; HRA=%+8.3f; HLA=%+8.3f" $h $hra $hla]
}</langsyntaxhighlight>
{{out|Sample output}}
<pre>
Line 2,680 ⟶ 3,688:
HR= +5; HRA= +75.500; HLA= -18.451
HR= +6; HRA= +90.500; HLA= +84.225
</pre>
 
=={{header|Wren}}==
{{trans|Go}}
{{libheader|Wren-fmt}}
<syntaxhighlight lang="wren">import "io" for Stdin, Stdout
import "./fmt" for Fmt
 
var getNum = Fn.new { |prompt|
while (true) {
System.write(prompt)
Stdout.flush()
var input = Stdin.readLine()
var n = Num.fromString(input)
if (n) return n
System.print("Invalid number, try again.")
}
}
 
var lat = getNum.call("Enter latitude : ")
var lng = getNum.call("Enter longitude : ")
var ref = getNum.call("Enter legal meridian : ")
var slat = (lat * Num.pi / 180).sin
var diff = lng - ref
System.print("\n sine of latitude : %(slat)")
System.print(" diff longitude : %(diff)")
System.print("\nHour, sun hour angle, dial hour line angle from 6am to 6pm")
for (h in -6..6) {
var hra = 15*h - diff
var s = (hra * Num.pi /180).sin
var c = (hra * Num.pi /180).cos
var hla = (slat*s).atan(c) * 180 / Num.pi
Fmt.print("$2.0f $8.3f $8.3f", h, hra, hla)
}</syntaxhighlight>
 
{{out}}
<pre>
Enter latitude : -4.95
Enter longitude : -150.5
Enter legal meridian : -150
 
sine of latitude : -0.086286365797923
diff longitude : -0.5
 
Hour, sun hour angle, dial hour line angle from 6am to 6pm
-6 -89.500 84.225
-5 -74.500 17.283
-4 -59.500 8.334
-3 -44.500 4.847
-2 -29.500 2.795
-1 -14.500 1.278
0 0.500 -0.043
1 15.500 -1.371
2 30.500 -2.910
3 45.500 -5.018
4 60.500 -8.671
5 75.500 -18.451
6 90.500 -95.775
</pre>
 
Line 2,686 ⟶ 3,752:
{{libheader|libc}}
It must be linked with the C standard library and startup code.
<langsyntaxhighlight lang="asm"> global main
extern printf, scanf
 
Line 2,822 ⟶ 3,888:
 
o_ft:
db "HR= %3d; ",9," HRA=%7.3f; ",9," HLA= %7.3f", 10, 0</langsyntaxhighlight>
 
=={{header|XPL0}}==
<langsyntaxhighlight XPL0lang="xpl0">inc c:\cxpl\codes;
def Pi = 3.14159265358979323846,
Deg2Rad = Pi/180.0,
Line 2,850 ⟶ 3,916:
RlOut(0, HA); ChOut(0, Tab); RlOut(0, HLA); CrLf(0);
];
]</langsyntaxhighlight>
 
{{out}}
Line 2,876 ⟶ 3,942:
=={{header|zkl}}==
{{trans|F#}}
<langsyntaxhighlight lang="zkl">//(degree measure)*Degrees => Radian measure
//(radian measure)/Degrees => Degree measure
const pi=(0.0).pi, toDeg=(0.0).pi/180;
Line 2,898 ⟶ 3,964:
dhla :=(sineLatitude*(shr*toDeg).tan()).atan()/toDeg;
Console.writeln("%s\t\t%5.1f\t\t%+7.3f".fmt(clockHour,shr,dhla));
}</langsyntaxhighlight>
{{out}}
<pre>
Line 2,928 ⟶ 3,994:
<as above>
</pre>
 
=={{header|ZX Spectrum Basic}}==
{{trans|ERRE}}
<lang zxbasic>10 DEF FN r(x)=x*PI/180
20 DEF FN d(x)=x*180/PI
30 INPUT "Enter latitude (degrees): ";latitude
40 INPUT "Enter longitude (degrees): ";longitude
50 INPUT "Enter legal meridian (degrees): ";meridian
60 PRINT "Latitude: ";latitude
70 PRINT "Longitude:";longitude
80 PRINT "Legal meridian: ";meridian
90 PRINT '" Sun Dial"
100 PRINT "Time hour angle hour line ang."
110 PRINT "________________________________"
120 FOR h=6 TO 18
130 LET hra=15*h-longitude+meridian-180
140 LET hla=FN d(ATN (SIN (FN r(latitude))*TAN (FN r(hra))))
150 IF ABS (hra)>90 THEN LET hla=hla+180*SGN (hra*latitude)
160 PRINT h;" ";hra;" ";hla
170 NEXT h</lang>
9,476

edits