Bestimmung der Zeitpunkte von Ereignissen
ulrich
2023-03-23 d20d989f5495492f1258c8313db7c19b429111a3
commit | author | age
66d68b 1 /*
U 2   Zeitrechnung - a class library to determine calendar events
3   Copyright (c) 1984-2023 Ulrich Hilger, http://uhilger.de
4
5   This program is free software: you can redistribute it and/or modify
6   it under the terms of the GNU Affero General Public License as published by
7   the Free Software Foundation, either version 3 of the License, or
8   (at your option) any later version.
9
10   This program is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   GNU Affero General Public License for more details.
14
15   You should have received a copy of the GNU Affero General Public License
16   along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18 package de.uhilger.zeitrechnung.ereignis;
19
20 import de.uhilger.zeitrechnung.Datum;
21 import de.uhilger.zeitrechnung.Definition;
22 import de.uhilger.zeitrechnung.Ort;
23 import de.uhilger.zeitrechnung.kalender.ISOKalender;
24 import java.util.ArrayList;
25 import java.util.List;
26
27 /**
28  * Sommer- und Wintersonnenwende sowie -tagundnachtgleiche ermitteln.
29  *
30  * <p>
31  * Die Ereignis-Definition lautet (Beispiel):<br>
32  * JahreszeitEreignis.getDefinition.setp1(JahreszeitEreignis.SOMMER_SONNENWENDE);<br>
33  * </p>
34  * 
35  * <p>
36  * Die Position muss mit <code>setPos</code> angegeben sein, wenn sie 
37  * auf der suedlichen Hemisphaere liegt, anderenfalls werden standardmaessig 
38  * die Jahreszeiten der noerdlichen Hemisphaere berechnet.
39  * </p>
40  * 
41  * @author Ulrich Hilger
42  * @author <a href="http://uhilger.de">http://uhilger.de</a>
43  *
44  * @version 2, 16.3.2023, (Version 1 war vom 04.09.2005)
45  */
46 public class JahreszeitEreignis extends EreignisBasis {
47
48   /**
49    * Ort fuer JahreszeitEreignisse, 
50    * standardmaessig Frankurt am Main, Deutschland ohne Sommerzeit (UT+1)
51    */
52   protected Ort ort;
53
54   /**
55    * default position
56    */
57   public static final Ort POS_FRANKFURT_MAIN
58           = new Ort("Frankfurt am Main", 50.11, 8.68, 0, 1);
59
60   public static final int SOMMER_SONNENWENDE = 1;
61   public static final int WINTER_SONNENWENDE = 2;
62   public static final int FRUEHLINGS_TAGUNDNACHTGLEICHE = 3;
63   public static final int HERBST_TAGUNDNACHTGLEICHE = 4;
64
65   /**
66    * Ein Objekt der Klasse JahreszeitEreignis erzeugen
67    */
68   public JahreszeitEreignis() {
69     super();
70   }
71
72   /**
73    * Die Tage eines Jahres im gregorianischen Kalendersystem 
74    * ermitteln, an denen das Ereignis stattfindet.
75    * 
76    * @param isoJahr das Jahr im gregorianischen Kalender, 
77    * fuer das ermittelt werden soll, an welchen Tagen das Ereignis stattfindet
78    * @return die Liste aus Datum-Objekten, die die Tage im gregorianischen 
79    * Kalender bezeichnet, an denen das Ereignis stattfindet
80    */
81   @Override
82   public List<Datum> getZeitpunkte(long isoJahr) {
83     ISOKalender w = new ISOKalender();
84     Definition def = getDefinition();
85     double result = w.standardVonUniversal(w.solareLaengeNach(
86             w.zuTagen(isoJahr, Definition.JANUAR, 1), getModifier(def)), ort);
87
88     Datum d = w.vonTagen((long) result);
89     ArrayList list = new ArrayList();
90     list.add(d);
91     return list;
92   }
93   
94   private double getModifier(Definition def) {
95     double modifier = Definition.SOMMER;
96     Ort pos = getPosition();
97     if(pos.getBreite() < 0) {
98       switch ((int) def.getp1()) {
99         case SOMMER_SONNENWENDE:
100           modifier = Definition.WINTER;
101           break;
102         case WINTER_SONNENWENDE:
103           modifier = Definition.SOMMER;
104           break;
105         case FRUEHLINGS_TAGUNDNACHTGLEICHE:
106           modifier = Definition.HERBST;
107           break;
108         case HERBST_TAGUNDNACHTGLEICHE:
109           modifier = Definition.FRUEHLING;
110           break;
111       }
112     } else {
113       switch ((int) def.getp1()) {
114         case SOMMER_SONNENWENDE:
115           modifier = Definition.SOMMER;
116           break;
117         case WINTER_SONNENWENDE:
118           modifier = Definition.WINTER;
119           break;
120         case FRUEHLINGS_TAGUNDNACHTGLEICHE:
121           modifier = Definition.FRUEHLING;
122           break;
123         case HERBST_TAGUNDNACHTGLEICHE:
124           modifier = Definition.HERBST;
125           break;
126       }
127     }
128     return modifier;
129   }
130   
131   /**
132    * Den Ort angeben, fuer den die Jahreszeiten berechnet werden sollen
133    *
134    * @param ort der Ort, fuer den die Berechnung erfolgen soll
135    */
136   public void setPosition(Ort ort) {
137     this.ort = ort;
138   }
139
140   /**
141    * Den Ort ermitteln, fuer den die Jahreszeiten berechnet werden sollen
142    *
143    * @return der Ort, fuer den die Berechnung erfolgen soll
144    */
145   public Ort getPosition() {
146     if (ort == null) {
147       //Logger.getLogger(SolarEreignis.class.getName()).log(Level.INFO, 
148         //        "Ort Breite: {0}", POS_FRANKFURT_MAIN.getLatitude());
149       return POS_FRANKFURT_MAIN;
150     } else {
151       //Logger.getLogger(SolarEreignis.class.getName()).log(Level.INFO, 
152         //        "Ort Breite: {0}", pos.getLatitude());
153       return ort;
154     }
155   }
156
157   /**
158    * Den Typ des Ereignisses ermitteln
159    * 
160    * @return Ereignis.TYP_JAHRESZEIT
161    */
162   @Override
163   public int getTyp() {
164     return Ereignis.TYP_JAHRESZEIT;
165   }
166
167 }