Horizontal sundial calculations: Difference between revisions

Added Perl example
m (→‎{{header|Ring}}: Remove vanity tags)
(Added Perl example)
Line 1,778:
end
end.</lang>
 
=={{header|Perl}}==
{{trans|Perl 6}}
<lang perl>use utf8;
binmode STDOUT, ":utf8";
 
use constant π => 3.14159265;
 
sub d2r { $_[0] * π / 180 } # degrees to radians
sub r2d { $_[0] * 180 / π } # radians to degrees
 
print 'Enter latitude => '; $latitude = <>;
print 'Enter longitude => '; $longitude = <>;
print 'Enter legal meridian => '; $meridian = <>;
 
$lat_sin = sin( d2r($latitude) );
$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 %8.3f %8.3f\n",
($hour + 12) % 12 || 12, ($hour < 0 ? 'AM' : 'PM'), $sun_deg, $line_deg;
}</lang>
{{out}}
<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>
 
=={{header|Perl 6}}==
2,392

edits