#include #include #include "zeit.h" #include "zeitgleichung.h" #include "sonnenverlauf.h" Sonnenverlauf_t BerechneSonnenverlauf( int8_t Tag, int8_t Monat, int16_t Jahr, double Zeitzone, double GeographischeBreite, double GeographischeLaenge ) { double Deklination; double Zeitgleichung; double Zeitdifferenz; double AufgangOrtszeit; double UntergangOrtszeit; double AufgangWeltzeit; double UntergangWeltzeit; double Aufgang; double Untergang; JDatum_t JDatum; double h = -50.0 / 60.0; // Sonnenaufgang beginnt sobald der Rand der Sonne über dem Horizont ist, nicht der Mittelpunkt! Sonnenverlauf_t Sonnenverlauf; Sonnenverlauf.Tag = Tag; Sonnenverlauf.Monat = Monat; Sonnenverlauf.Jahr = Jahr; JDatum = JulianischesDatum( Jahr, Monat, Tag, 12, 0, 0 ); Zeitgleichung = BerechneZeitgleichung( &Deklination, JDatum.T_J2000 ); Zeitdifferenz = 12.0 * acos( ( sin( h * M_PI / 180 ) - sin( GeographischeBreite * M_PI / 180 ) * sin( Deklination ) ) / ( cos( GeographischeBreite * M_PI / 180 ) * cos( Deklination ) ) ) / M_PI; AufgangOrtszeit = 12.0 - Zeitdifferenz - Zeitgleichung; AufgangWeltzeit = AufgangOrtszeit - GeographischeLaenge / 15.0; Aufgang = AufgangWeltzeit + Zeitzone; if ( Aufgang < 0.0 ) Aufgang += 24.0; else if ( Aufgang >= 24.0 ) Aufgang -= 24.0; Sonnenverlauf.AufgangMinuten = (int) ( 60.0 * ( Aufgang - (int) Aufgang ) + 0.5 ); Sonnenverlauf.AufgangStunden = (int) Aufgang; if ( Sonnenverlauf.AufgangMinuten >= 60 ) { Sonnenverlauf.AufgangMinuten -= 60; Sonnenverlauf.AufgangStunden += 1; } else if ( Sonnenverlauf.AufgangMinuten < 0 ) { Sonnenverlauf.AufgangMinuten += 60; Sonnenverlauf.AufgangStunden -= 1; if ( Sonnenverlauf.AufgangStunden < 0 ) Sonnenverlauf.AufgangStunden += 24; } UntergangOrtszeit = 12.0 + Zeitdifferenz - Zeitgleichung; UntergangWeltzeit = UntergangOrtszeit - GeographischeLaenge / 15.0; Untergang = UntergangWeltzeit + Zeitzone; if ( Untergang < 0.0 ) Untergang += 24.0; else if ( Untergang >= 24.0 ) Untergang -= 24.0; Sonnenverlauf.UntergangMinuten = (int) ( 60.0 * ( Untergang - (int) Untergang ) + 0.5 ); Sonnenverlauf.UntergangStunden = (int) Untergang; if ( Sonnenverlauf.UntergangMinuten >= 60.0 ) { Sonnenverlauf.UntergangMinuten -= 60.0; Sonnenverlauf.UntergangStunden++; } else if ( Sonnenverlauf.UntergangMinuten < 0 ) { Sonnenverlauf.UntergangMinuten += 60.0; Sonnenverlauf.UntergangStunden--; if ( Sonnenverlauf.UntergangStunden < 0.0 ) Sonnenverlauf.UntergangStunden += 24.0; } return Sonnenverlauf; }