PROG0422 - Sundial

no tags 

Preparation

The math module of the Python Standard Library provides some goniometric functions that might be very useful for this exercise. Note that these functions work with angles expressed in radians. To convert degrees to radians and vice versa, the math module provides the functions math.radians and math.degrees. The following interactive session shows how these functions can be applied.

>>> from math import pi, sin, degrees, radians
>>> radians(180)
3.141592653589793
>>> degrees(pi)
180.0
>>> sin(degrees(180))
0.5715301650260188

Exercise

A sundial is a device that tells the time of day by the position of the Sun. In common designs such as the horizontal sundial, the sun casts a shadow from its style onto a surface marked with lines indicating the hours of the day. As the sun moves across the sky, the shadow edge aligns with different hour lines. All sundials must be aligned with their styles parallel to the axis of the Earth's rotation to tell the correct time throughout the year. If the shadow points to the North (in the southern hemisphere to the South) it is exactly noon. The sun is in the South (on the southern hemisphere in the North) and at its highest position, exactly on top of the meridian. It is then 12 pm (noon) local time. From this, a distribution is made and hour lines are added, allowing to read the hour. The oldest known sundial is found in Egypt and dates back to 1500 before Christ.

horizontale zonnewijzer
Horizontal sundial (Museum of Hasselt)

As the surface of a horizontal sundial is horizontal, the shadow doesn't rotate uniformly across the surface. Moreover, the passing of the sun over the meridian does not always occur exactly at 12 pm (noon). As the earth is subdivided in time zones, this only applies to the central meridian of the timezone. Therefore, the distribution of the hour lines on the sundial is done by the following rule $$\tan(\theta) = \sin(\lambda) \times \tan(\alpha)$$ with $\lambda$ depicting the longitude of the sundial, and $\theta$ the angle on the surface between a given hour line and the hour line at noon (which always points to the North). The parameter $\alpha$ depicts the hour angle of the sun, and is computed at hour $t$ (relative to noon) as ${15}^{\circ} \times t - \Delta$, with $\Delta$ the difference between the latitude $\phi_z$ of the sundial and the latitude $\phi_c$ of the central meridian of the local time zone. On the central meridian of the local time zone, the angle $\theta$ of the hour line for 3 pm is equal to the arctangent of $\sin(\lambda)$, as $\tan({45}^{\circ}) = 1$.

Input

Three lines containing respectively the longitude $\lambda \in \mathbb{R}$ ($-180 \le \lambda \leq 180$) and latitude $\phi_z \in \mathbb{R}$ ($-90 \leq \phi_z \leq 90$) of the sundial, and the latitude $\phi_c \in \mathbb{R}$ ($-90 \leq \phi_c \leq 90$) of the central meridian of the local time zone. Latitude and longitude are given in decimal degrees.

Output

One line containing the hour, the hour angle of the sun (in degrees), and the angle of the hour line on a horizontal sundial (in degrees), and this for every hour of the day, from 6 am up to 6 pm. After all, after dark a sundial becomes quite useless. Check the example below to derive the format in which the output must be printed.

Example

Input:

-4.95
-150.5
-150.0

Output:

hour: -6; hour angle (sun): -89.5; angle (hour line): 84.22483260136025
hour: -5; hour angle (sun): -74.5; angle (hour line): 17.2829335027853
hour: -4; hour angle (sun): -59.5; angle (hour line): 8.333711921468085
hour: -3; hour angle (sun): -44.5; angle (hour line): 4.846708924373172
hour: -2; hour angle (sun): -29.5; angle (hour line): 2.794873809318643
hour: -1; hour angle (sun): -14.5; angle (hour line): 1.2783529809190628
hour: 0; hour angle (sun): 0.5; angle (hour line): -0.04314426995813971
hour: 1; hour angle (sun): 15.5; angle (hour line): -1.3707878431870524
hour: 2; hour angle (sun): 30.5; angle (hour line): -2.909643210076617
hour: 3; hour angle (sun): 45.5; angle (hour line): -5.018023174356127
hour: 4; hour angle (sun): 60.5; angle (hour line): -8.671396957302383
hour: 5; hour angle (sun): 75.5; angle (hour line): -18.450999222565326
hour: 6; hour angle (sun): 90.5; angle (hour line): 84.22483260136018

Voorbereiding

De math module uit de Python Standard Library bevat tal van goniometrische functies die je voor deze opgave goed zult kunnen gebruiken. Let er ook op dat deze functies werken met hoeken die uitgedrukt zijn in radialen. Voor de conversie van graden naar radialen en omgekeerd, ondersteunt de math module dan ook de functies math.radians en math.degrees. Hieronder alvast een voorproefje

>>> from math import pi, sin, degrees, radians
>>> radians(180)
3.141592653589793
>>> degrees(pi)
180.0
>>> sin(degrees(180))
0.5715301650260188

Opgave

Een zonnewijzer is een instrument om de tijd aan te wijzen op basis van de stand van de zon. Bij een horizontale zonnewijzer werpt de zon de schaduw van de stijl van de zonnewijzer op een horizontaal oppervlak waarop verschillende lijnen de uren van de dag aangeven. De aarde draait immers om haar as en daardoor verandert de schaduw van de stijl voortdurend van richting. Als de schaduw naar het noorden wijst (op het zuidelijk halfrond naar het zuiden) is het precies middag. De zon staat dan in het zuiden (op het zuidelijk halfrond in het noorden) en in haar hoogste stand, precies boven de meridiaan. Het is dan 12 uur in lokale zonnetijd. Van daaruit kan men een verdeling maken en uurlijnen aanbrengen waarop de schaduw het uur aanduidt. De oudste zonnewijzer die we kennen werd in Egypte gevonden en dateert van omstreeks 1500 voor Christus.

horizontale zonnewijzer
Horizontale zonnewijzer (Stadsmuseum Hasselt)

Omdat het oppervlak van een horizontale zonnewijzer horizontaal ligt, roteert de schaduw niet op een uniforme manier over het oppervlak. Het is overigens niet zo dat het passeren van de zon over de meridiaan altijd precies om 12 uur gebeurt. Omdat de aarde wordt ingedeeld in tijdszones, geldt dit enkel op de centrale meridiaan van de tijdzone. Daarom gebeurt de verdeling van de uurlijnen op de zonnewijzer op basis van de regel $$\tan(\theta) = \sin(\lambda) \times \tan(\alpha)$$ waarbij $\lambda$ staat voor de lengtegraad van de zonnewijzer, en $\theta$ de hoek op het oppervlak aangeeft tussen een gegeven uurlijn en de uurlijn voor het middaguur (die altijd naar het ware Noorden wijst). De parameter $\alpha$ staat voor de uurhoek van de zon, en wordt op uur $t$ (relatief ten opzichte van het middaguur) berekend als ${15}^{\circ} \times t - \Delta$, waarbij $\Delta$ het verschil is tussen de breedtegraad $\phi_z$ van de zonnewijzer en de breedtegraad $\phi_c$ van de centrale meridiaan van de lokale tijdszone. Op de centrale meridiaan van de lokale tijdszone is de hoek $\theta$ van de lijn voor drie uur in de namiddag bijvoorbeeld gelijk aan de boogtangens van $\sin(\lambda)$, omdat $\tan({45}^{\circ}) = 1$.

Invoer

Drie regels met daarop respectievelijk de lengtegraad $\lambda \in \mathbb{R}$ ($-180 \le \lambda \leq 180$) en breedtegraad $\phi_z \in \mathbb{R}$ ($-90 \leq \phi_z \leq 90$) van de zonnewijzer, en de breedtegraad $\phi_c \in \mathbb{R}$ ($-90 \leq \phi_c \leq 90$) van de centrale meridiaan van de lokale tijdszone. Lengte- en breedtegraden worden hierbij aangeduid als decimale graden.

Uitvoer

Een regel met daarop het uur, de uurhoek van de zon (in graden), en de hoek van de uurlijn op een horizontale zonnewijzer (in graden), en dit voor elk uur van de dag, gaande van zes uur in de voormiddag tot zes uur in de namiddag. Als de zon ondergaat wordt een zonnewijzer immers een hoogst onnuttig instrument om de tijd aan te geven. Bekijk onderstaand voorbeeld om het formaat af te leiden waarmee deze informatie moet uitgeschreven worden.

Voorbeeld

Invoer:

-4.95
-150.5
-150.0

Uitvoer:

uur: -6; uurhoek (zon): -89.5; hoek (uurlijn): 84.22483260136025
uur: -5; uurhoek (zon): -74.5; hoek (uurlijn): 17.2829335027853
uur: -4; uurhoek (zon): -59.5; hoek (uurlijn): 8.333711921468085
uur: -3; uurhoek (zon): -44.5; hoek (uurlijn): 4.846708924373172
uur: -2; uurhoek (zon): -29.5; hoek (uurlijn): 2.7948738093186436
uur: -1; uurhoek (zon): -14.5; hoek (uurlijn): 1.2783529809190628
uur: 0; uurhoek (zon): 0.5; hoek (uurlijn): -0.04314426995813971
uur: 1; uurhoek (zon): 15.5; hoek (uurlijn): -1.3707878431870526
uur: 2; uurhoek (zon): 30.5; hoek (uurlijn): -2.909643210076617
uur: 3; uurhoek (zon): 45.5; hoek (uurlijn): -5.018023174356127
uur: 4; uurhoek (zon): 60.5; hoek (uurlijn): -8.671396957302383
uur: 5; uurhoek (zon): 75.5; hoek (uurlijn): -18.450999222565326
uur: 6; uurhoek (zon): 90.5; hoek (uurlijn): 84.22483260136018


Added by:Peter Dawyndt
Date:2013-09-11
Time limit:10s
Source limit:50000B
Memory limit:1536MB
Cluster: Cube (Intel G860)
Languages:PY_NBC
Resource:None