/* Zeitrechnung - a class library to determine calendar events Copyright (c) 1984-2023 Ulrich Hilger, http://uhilger.de This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package de.uhilger.zeitrechnung.ereignis; import de.uhilger.zeitrechnung.Datum; import de.uhilger.zeitrechnung.Definition; import de.uhilger.zeitrechnung.Ort; import de.uhilger.zeitrechnung.kalender.ISOKalender; import java.util.ArrayList; import java.util.List; /** * Sommer- und Wintersonnenwende sowie -tagundnachtgleiche ermitteln. * *

* Die Ereignis-Definition lautet (Beispiel):
* JahreszeitEreignis.getDefinition.setp1(JahreszeitEreignis.SOMMER_SONNENWENDE);
*

* *

* Die Position muss mit setPos angegeben sein, wenn sie * auf der suedlichen Hemisphaere liegt, anderenfalls werden standardmaessig * die Jahreszeiten der noerdlichen Hemisphaere berechnet. *

* * @author Ulrich Hilger * @author http://uhilger.de * * @version 2, 16.3.2023, (Version 1 war vom 04.09.2005) */ public class JahreszeitEreignis extends EreignisBasis { /** * Ort fuer JahreszeitEreignisse, * standardmaessig Frankurt am Main, Deutschland ohne Sommerzeit (UT+1) */ protected Ort ort; /** * default position */ public static final Ort POS_FRANKFURT_MAIN = new Ort("Frankfurt am Main", 50.11, 8.68, 0, 1); public static final int SOMMER_SONNENWENDE = 1; public static final int WINTER_SONNENWENDE = 2; public static final int FRUEHLINGS_TAGUNDNACHTGLEICHE = 3; public static final int HERBST_TAGUNDNACHTGLEICHE = 4; /** * Ein Objekt der Klasse JahreszeitEreignis erzeugen */ public JahreszeitEreignis() { super(); } /** * Die Tage eines Jahres im gregorianischen Kalendersystem * ermitteln, an denen das Ereignis stattfindet. * * @param isoJahr das Jahr im gregorianischen Kalender, * fuer das ermittelt werden soll, an welchen Tagen das Ereignis stattfindet * @return die Liste aus Datum-Objekten, die die Tage im gregorianischen * Kalender bezeichnet, an denen das Ereignis stattfindet */ @Override public List getZeitpunkte(long isoJahr) { ISOKalender w = new ISOKalender(); Definition def = getDefinition(); double result = w.standardVonUniversal(w.solareLaengeNach( w.zuTagen(isoJahr, Definition.JANUAR, 1), getModifier(def)), ort); Datum d = w.vonTagen((long) result); ArrayList list = new ArrayList(); list.add(d); return list; } private double getModifier(Definition def) { double modifier = Definition.SOMMER; Ort pos = getPosition(); if(pos.getBreite() < 0) { switch ((int) def.getp1()) { case SOMMER_SONNENWENDE: modifier = Definition.WINTER; break; case WINTER_SONNENWENDE: modifier = Definition.SOMMER; break; case FRUEHLINGS_TAGUNDNACHTGLEICHE: modifier = Definition.HERBST; break; case HERBST_TAGUNDNACHTGLEICHE: modifier = Definition.FRUEHLING; break; } } else { switch ((int) def.getp1()) { case SOMMER_SONNENWENDE: modifier = Definition.SOMMER; break; case WINTER_SONNENWENDE: modifier = Definition.WINTER; break; case FRUEHLINGS_TAGUNDNACHTGLEICHE: modifier = Definition.FRUEHLING; break; case HERBST_TAGUNDNACHTGLEICHE: modifier = Definition.HERBST; break; } } return modifier; } /** * Den Ort angeben, fuer den die Jahreszeiten berechnet werden sollen * * @param ort der Ort, fuer den die Berechnung erfolgen soll */ public void setPosition(Ort ort) { this.ort = ort; } /** * Den Ort ermitteln, fuer den die Jahreszeiten berechnet werden sollen * * @return der Ort, fuer den die Berechnung erfolgen soll */ public Ort getPosition() { if (ort == null) { //Logger.getLogger(SolarEreignis.class.getName()).log(Level.INFO, // "Ort Breite: {0}", POS_FRANKFURT_MAIN.getLatitude()); return POS_FRANKFURT_MAIN; } else { //Logger.getLogger(SolarEreignis.class.getName()).log(Level.INFO, // "Ort Breite: {0}", pos.getLatitude()); return ort; } } /** * Den Typ des Ereignisses ermitteln * * @return Ereignis.TYP_JAHRESZEIT */ @Override public int getTyp() { return Ereignis.TYP_JAHRESZEIT; } }