Ignore:
Timestamp:
11/28/05 11:15:09 (19 years ago)
Author:
tbretz
Message:
*** empty log message ***
Location:
trunk/MagicSoft/Mars/mastro
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/MagicSoft/Mars/mastro/MAstro.cc

    r7227 r7432  
    623623    return TMath::ACos(d)*TMath::RadToDeg();
    624624}
     625
     626// --------------------------------------------------------------------------
     627//
     628// Returned is the offset (number of days) which must be added to
     629// March 1st of the given year, eg:
     630//
     631//    Int_t offset = GetDayOfEaster(2004);
     632//
     633//    MTime t;
     634//    t.Set(year, 3, 1);
     635//    t.SetMjd(t.GetMjd()+offset);
     636//
     637//    cout << t << endl;
     638//
     639//  If the date coudn't be calculated -1 is returned.
     640//
     641//  The minimum value returned is 21 corresponding to March 22.
     642//  The maximum value returned is 55 corresponding to April 25.
     643//
     644// --------------------------------------------------------------------------
     645//
     646// Gauss'sche Formel zur Berechnung des Osterdatums
     647// Wann wird Ostern gefeiert? Wie erfährt man das Osterdatum für ein
     648// bestimmtes Jahr, ohne in einen Kalender zu schauen?
     649//
     650// Ostern ist ein "bewegliches" Fest. Es wird am ersten Sonntag nach dem
     651// ersten Frühlingsvollmond gefeiert. Damit ist der 22. März der früheste
     652// Termin, der 25. April der letzte, auf den Ostern fallen kann. Von
     653// diesem Termin hängen auch die Feste Christi Himmelfahrt, das 40 Tage
     654// nach Ostern, und Pfingsten, das 50 Tage nach Ostern gefeiert wird, ab.
     655//
     656// Von Carl Friedrich Gauß (Mathematiker, Astronom und Physiker;
     657// 1777-1855) stammt ein Algorithmus, der es erlaubt ohne Kenntnis des
     658// Mondkalenders die Daten der Osterfeste für die Jahre 1700 bis 2199 zu
     659// bestimmen.
     660//
     661// Gib eine Jahreszahl zwischen 1700 und 2199 ein:
     662//
     663// Und so funktioniert der Algorithmus:
     664//
     665// Es sei:
     666//
     667// J    die Jahreszahl
     668// a    der Divisionsrest von   J/19
     669// b    der Divisionsrest von   J/4
     670// c    der Divisionsrest von   J/7
     671// d    der Divisionsrest von   (19*a + M)/30
     672// e    der Divisionsrest von   (2*b + 4*c + 6*d + N)/7
     673//
     674// wobei M und N folgende Werte annehmen:
     675//
     676// für die Jahre        M       N
     677// 1700-1799    23      3
     678// 1800-1899    23      4
     679// 1900-2099    24      5
     680// 2100-2199    24      6
     681//
     682// Dann fällt Ostern auf den
     683// (22 + d + e)ten März
     684//
     685// oder den
     686// (d + e - 9)ten April
     687//
     688// Beachte:
     689// Anstelle des 26. Aprils ist immer der 19. April zu setzen,
     690// anstelle des 25. Aprils immer dann der 18. April, wenn d=28 und a>10.
     691//
     692// Literatur:
     693// Schüler-Rechenduden
     694// Bibliographisches Institut
     695// Mannheim, 1966
     696//
     697// --------------------------------------------------------------------------
     698//
     699// Der Ostersonntag ist ein sog. unregelmäßiger Feiertag. Alle anderen
     700// unregelmäßigen Feiertage eines Jahres leiten sich von diesem Tag ab:
     701//
     702//    * Aschermittwoch ist 46 Tage vor Ostern.
     703//    * Pfingsten ist 49 Tage nach Ostern.
     704//    * Christi Himmelfahrt ist 10 Tage vor Pfingsten.
     705//    * Fronleichnam ist 11 Tage nach Pfingsten.
     706//
     707// Man muß also nur den Ostersonntag ermitteln, um alle anderen
     708// unregelmäßigen Feiertage zu berechnen. Doch wie geht das?
     709//
     710// Dazu etwas Geschichte:
     711//
     712// Das 1. Kirchenkonzil im Jahre 325 hat festgelegt:
     713//
     714//    * Ostern ist stets am ersten Sonntag nach dem ersten Vollmond des
     715//      Frühlings.
     716//    * Stichtag ist der 21. März, die "Frühlings-Tagundnachtgleiche".
     717//
     718// Am 15.10.1582 wurde von Papst Gregor XIII. der bis dahin gültige
     719// Julianische Kalender reformiert. Der noch heute gültige Gregorianische
     720// Kalender legt dabei folgendes fest:
     721//
     722// Ein Jahr hat 365 Tage und ein Schaltjahr wird eingefügt, wenn das Jahr
     723// durch 4 oder durch 400, aber nicht durch 100 teilbar ist. Hieraus
     724// ergeben sich die zwei notwendigen Konstanten, um den Ostersonntag zu
     725// berechnen:
     726//
     727//   1. Die Jahreslänge von und bis zum Zeitpunkt der
     728//      Frühlings-Tagundnachtgleiche: 365,2422 mittlere Sonnentage
     729//   2. Ein Mondmonat: 29,5306 mittlere Sonnentage
     730//
     731// Mit der "Osterformel", von Carl Friedrich Gauß (1777-1855) im Jahre 1800
     732// entwickelt, läßt sich der Ostersonntag für jedes Jahr von 1583 bis 8202
     733// berechnen.
     734//
     735// Der früheste mögliche Ostertermin ist der 22. März. (Wenn der Vollmond
     736// auf den 21. März fällt und der 22. März ein Sonntag ist.)
     737//
     738// Der späteste mögliche Ostertermin ist der 25. April. (Wenn der Vollmond
     739// auf den 21. März fällt und der 21. März ein Sonntag ist.)
     740//
     741Int_t MAstro::GetEasterOffset(UShort_t year)
     742{
     743    if (year<1700 || year>2199)
     744    {
     745        cout << "MAstro::GetDayOfEaster - Year " << year << " not between 1700 and 2199" << endl;
     746        return -1;
     747    }
     748
     749    const Int_t M = (year+2900)/200;
     750
     751    Int_t N=0;
     752    switch (year/100)
     753    {
     754    case 17: N=3; break;
     755    case 18: N=4; break;
     756    case 19:
     757    case 20: N=5; break;
     758    case 21: N=6; break;
     759    }
     760
     761    const Int_t a = year%19;
     762    const Int_t b = year%4;
     763    const Int_t c = year%7;
     764    const Int_t d = (19*a + M)%30;
     765    const Int_t e = (2*b + 4*c + 6*d + N)%7;
     766
     767    if (e==6 && d==28 && a>10)
     768        return 48;
     769
     770    if (d+e==35)
     771        return 49;
     772
     773    return d + e + 21;
     774}
  • trunk/MagicSoft/Mars/mastro/MAstro.h

    r7202 r7432  
    1010
    1111class TVector3;
     12class MTime;
    1213
    1314class MAstro
     
    7677    static Double_t GetDevAbs(Double_t nomzd, Double_t devzd, Double_t devaz);
    7778
     79    static Int_t GetEasterOffset(UShort_t year);
     80
    7881    ClassDef(MAstro, 0)
    7982};
Note: See TracChangeset for help on using the changeset viewer.