![]() |
Astro-Daten
Liste der Anhänge anzeigen (Anzahl: 4)
Hallo,
im Laufe der Zeit haben sich bei mir einige Funktionen zur Berechnung astronomischer Daten gesammelt, die ich nun in eine Unit gepackt habe : Tag im Jahr, Woche im jahr, Schaltjahr(boolean), Sommerzeit(boolean), Jahreszeit, Feiertage (in Abhängigkeit vom Bundesland), Sternzeichen ... Für Mond und Sonne : -Aufgang, Untergang, Höchststand, Mondphase, Mondalter, nächste und vorige Mondphase ... Funktionen :
Delphi-Quellcode:
im Anhang :
function GetDayOfYear(CDate:TDateTime):Integer;
function GetDaysPerYear(CDate:TDateTime):Integer; function IsLeapYear(CDate:TDateTime):boolean; function GetWeekOfYear(CDate:TDateTime):Integer; function GetWeeksPerYear(CDate:TDateTime):Integer; function GetDaysPerMonth(CDate:TDateTime):Integer; function GetFirstDayOfWeek(CDate:TDateTime; DayIndex:Integer):TDateTime; function IsSummertime(CDate:TDateTime):boolean; function GetHolidayIndex(CDate:TDateTime; Land:TdeState):integer; function last_phase(date:TDateTime; phase:TMoonPhase):TDateTime; function next_phase(date:TDateTime; phase:TMoonPhase):TDateTime; function age_of_moon(date: TDateTime):extended; function current_phase(date:TDateTime):extended; function moon_distance(date: TDateTime): extended; function lunation(date:TDateTime):integer; function sun_distance(date: TDateTime): extended; function nextperigee(date:TDateTime):TDateTime; function nextapogee(date:TDateTime):TDateTime; function StartSeason(year: integer; season:TSeason):TDateTime; function Eclipse(var date:TDateTime; sun:boolean):TEclipse; function NextEclipse(var date:TDateTime; sun:boolean):TEclipse; function Sun_Rise(date:TDateTime; latitude, longitude:extended):TDateTime; function Sun_Set(date:TDateTime; latitude, longitude:extended):TDateTime; function Sun_Transit(date:TDateTime; latitude, longitude:extended):TDateTime; function Moon_Rise(date:TDateTime; latitude, longitude:extended):TDateTime; function Moon_Set(date:TDateTime; latitude, longitude:extended):TDateTime; function Moon_Transit(date:TDateTime; latitude, longitude:extended):TDateTime; function GetSternzeichen(const CDat:TDateTime):Integer; function GetSeason(CDat:TDate):String; function StartDateSeason(CDat:TDate; Season:TSeason): TDate; function GetMoonPhase(const Dat:TDateTime): String; function GetMoonPhaseNum(Age : extended):Integer; function GetMoonPhaseConst(Age : extended):TMoonPhase8; function DateTimeReal(DtTm : TDateTime; Long : extended):TDateTime; function DateTimeTZ(DtTm : TDateTime; Hour : ShortInt):TDateTime; - die Unit : AstroUnit - ein Demo zur Übersicht - ein Screenshot vom Demo falls Ihr noch Funktionen vermisst >>> lässt sich ja noch einfügen --> 21.12.2013 : Version 4 angefügt (Astro4.rar) : hinzugekommen sind Berechnungen zum "Blue Moon": function BlueMoon . . . - hier wird auf vier Vollmonde in einer Jahreszeit geprüft, der dritte Vollmond ist dann der Blue Moon. Im Aufruf der Funktion kann dann noch festgelegt werden, ob der vergangene Winter oder der kommende Winter berücksichtigt wird, geprüft wird über vier Jahreszeiten. function Double Moon . . . - hier wird auf zwei Vollmonde in einem Monat geprüft, je nach Definition (es gibt mehrere) ist dann der zweite Vollmond (30. od. 31. eines Monats) der Blue Moon. -- allg. Überarbeitung -- in Kürze : Auswahl der Berechnungen zu Sonnenstand, Auf-Untergang nach realer (-0,83333°), bürgerlicher(-6°), nautischer(-12°), astronomischer(-18°) Dämmerung --> erledigt. die Funktionen Sun_Rise ... und Sun_Set... erhalten nun einen weiteren Parameter vom Typ TCalcType (ctNull, ctGeneral, ctZivil, ctNautic, ctAstronomical) Diese Parameter berechnen den Sonnen-Auf- bzw. Untergang nach einer Winkelabweichung von (0°, -0,8333°, -6°, -12°, -18°) 0° --> theor. Werte -0,8333° allg. gültige Berechnung zu Soonen-Auf und Untergang -6° bürgerliche Dämmerung -12° nautische Dämmerung -18° astronomische Dämmerung
Delphi-Quellcode:
function Jul_Date(Year, Month, Day, Houre, Minute, Second : Word) : Extended; // Julianisches Datum [JD]
function Jul_Day(JulianDate : Extended) : Extended; // Julianische Tageszahl [n] function TimeZoneBias:longint; // TimeZone function TransformDate(Datum: TDatetime): TDateTime; // Umwandlung TDateTIME function Julian_Date(Date : TDateTime): Extended; // Julianisches Datum [JD, nach 15.10.1582] function Delphi_Date(J_Date : Extended): TDateTime; // Delphi Datum function Star_Time(Date : TDateTime): Extended; // Sternenzeit function DayOfYear(Date : TDateTime): Integer; // Tag im Jahr function DaysPerYear(Date : TDateTime): Integer; // Schaltjahr (?) function IsLeapYear(Date : TDateTime): Boolean; // Woche im Jahr function WeekOfYear(Date : TDateTime): Integer; // akt. Woche im jahr (KW) function WeeksPerYear(Date : TDateTime): Integer; // Anzahl der Wochen im Jahr function DaysPerMonth(Date : TDateTime): Integer; // Anzahl Tage im Monat function FirstDayOfWeek(Date : TDateTime; DayIndex : Integer): TDateTime; // Erster Tag in der Woche function DayFromDate(Date : TDate): Integer; // Tag aus Datum function IsSummertime(Date : TDateTime): Boolean; // Sommerzeit (?) function GetHolidayIndex(Date : TDateTime; Land : TdeState): Integer; // Feiertage (--> Index) procedure calc_geocentric(var coord : t_coord; Date : TDateTime); // Rektaszension, Deklination function sun_coordinate(Date : TDateTime): t_coord; // Koordinaten der Sonne function moon_coordinate(Date : TDateTime): t_coord; // Koordinaten des Mondes procedure calc_phase_data(Date : TDateTime; phase : TMoonPhase; var jde, kk, m, ms, f, o, e: Extended); // Daten für Mondphase function nextphase(Date : TDateTime; phase : TMoonPhase): TDateTime; // nächste MondPhase, Berechnung function last_phase(Date : TDateTime; phase : TMoonPhase): TDateTime; // vorige Mondphase, Ausgabe function next_phase(Date : TDateTime; phase : TMoonPhase): TDateTime; // nächste Mondphase, Ausgabe function moon_phase_angle(Date: TDateTime): Extended; // Mondphase, Winkel function age_of_moon(Date: TDateTime): Extended; // Mondalter in Tagen function current_phase(Date : TDateTime): Extended; // aktuelle Mondphase function moon_distance(Date: TDateTime): Extended; // Entfernung zum Mond function lunation(Date: TDateTime): Integer; // Mondwechsel, synodische Umlaufzeit (29,530589 d), Bezug 16.01.1923 function sun_distance(Date : TDateTime): Extended; // Entfernung zur Sonne function sun_diameter(Date : TDateTime): Extended; // rel. Sonnen-Durchmesser function moon_diameter(Date : TDateTime): Extended; // rel. Mond-Durchmesser function nextXXXgee(Date : TDateTime; apo: Boolean): TDateTime; // Berechnung Apogee, Perigee function nextperigee(Date : TDateTime): TDateTime; // Perigee, Ausgabe function nextapogee(Date : TDateTime): TDateTime; // Apogee, Ausgabe function StartSeason(year : Integer; season : TSeason): TDateTime; // Anfang d. Jahreszeiten function Eclipse(var Date : TDateTime; sun : Boolean) : TEclipse; // Finsternis function NextEclipse(var Date : TDateTime; sun : Boolean): TEclipse; // nächste Finsternis procedure correct_position(var position :t_coord; Date : TDateTime; Latitude, Longitude, Height: Extended); // Positionsberechnungen function Calc_Set_Rise(Date : TDateTime; Latitude, Longitude : Extended; sun: Boolean; kind: T_RiseSet): TDateTime; // Auf- Untergang, Berechnungen function Sun_Rise(Date : TDateTime; Latitude, Longitude : Extended; CalcType : TCalcType): TDateTime; // Sonnenaufgang function Sun_Set(Date : TDateTime; Latitude, Longitude : Extended; CalcType : TCalcType): TDateTime; // Sonnenuntergang function Sun_Transit(Date : TDateTime; Latitude, Longitude : Extended): TDateTime; // Sonnenhöchststand function Moon_Rise(Date : TDateTime; Latitude, Longitude : Extended): TDateTime; // Mondaufgang function Moon_Set(Date : TDateTime; Latitude, Longitude : Extended): TDateTime; // Monduntergang function Moon_Transit(Date : TDateTime; Latitude, Longitude : Extended): TDateTime; // Mondhöchststand function GetSternzeichen(const Date : TDateTime): Integer; // Sternzeichen --> uTable - Sternzeichen : array[1..12] of String function GetSeason(Date : TDate): String; // Jahreszeit function StartDateSeason(Date : TDate; Season : TSeason): TDate; // Anfangsdatum für Jahreszeiten function GetMoonPhase(const Date : TDateTime): String; // Mondphase (String) function GetFullMoonPhase(const Date : TDateTime): Boolean; // Vollmond ? function GetMoonPhaseNum(Age : Extended): Integer; // Mondphase (Integer, 1 .. 8) function DateTimeReal(DtTm : TDateTime; Long : Extended): TDateTime; // TDateTime an der aktuellen Position function DateTimeTZ(DtTm : TDateTime; Hour : ShortInt): TDateTime; // TDateTime in der Zeitzone procedure InitLocale; // lokale Einstellungen TDateTime function BlueMoon(Year : Word; WinterBefore : Boolean): TDateTime; // Datum BlueMoon --> 4 Vollmonde in einer Jahreszeit function DoubleMoon(Year, Month : Word): TDateTime; // Datum zweiter Vollmond in einem Monat |
Re: Astro-Daten
Als kleine Anmerkung:
Delphi-Quellcode:
Was hältst du davon die Abhängigkeiten so weit wie möglich zu reduzieren? Ich denke nicht, dass Units wie Forms, ExtCtrls und Co. hier was verloren haben. Mit Free Pascal für Windows genügt zum Beispiel folgender Uses Abschnitt (müsste in Delphi genauso genügen):
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ShellAPI, Registry, ShlObj, ComCtrls, DateUtils, ExtCtrls;
Delphi-Quellcode:
Ich musste zwar noch den Typ TDate definieren, der bei Delphi (zumindest laut Online Hilfe) in der System Unit rumkurvt, bei Free Pascal allerdings nur von Lazarus in der Controls Unit definiert wird, aber danach kompilierts. Unter nicht Windows Systemen müsste man größere Anpassungen vornehmen, aber für Windows kompiliert sie ;)
uses
SysUtils, Classes, DateUtils, Windows; Gruß, Sven |
Re: Astro-Daten
Hallo,
@JamesTKirk : Abhängigkeiten sind reduziert, hatte ich vergessen, da ich (zur besseren Kontrolle) das ganze erst mal visuell gemacht habe (DEMO). :zwinker: |
Re: Astro-Daten
Nicht schlecht. So wa shabe ich schon lange mal gesucht, insbesondere wegen der Mondphasen usw.
|
Re: Astro-Daten
Michael hat geschrieben:
Zitat:
Ich habe lange nach den Berechnungen der Jahreszeiten gesucht. Gibt es da noch Quellen zum Nachlesen? Gruß Wolfgang |
Re: Astro-Daten
Hallo
@Wolfgang : die Berechnungen basieren auf MEEUS (einfach mal googeln). Viel der Berechnungen und Konstanten hab' ich mal bruchstückweise bekommen und immer mal wieder (wenn ich mal Lust und Zeit hatte ...) vervollständigt. Derzeit arbeite ich noch an einer Funktion zur Rückgabe von Positionswerten, um Sonnen und Mondstand graphisch anzuzeigen (Kreisbahn, stimmt zwar nicht genau, ist aber am einfachsten umzusetzen und soll ja auch nur eine ungefähre Position angeben). .. ach ja : bei Wikipedia gibt's auch einiges, teilweise mit Tutorial-Charakter. ... ja, und dann mal sehen, was mir noch so einfällt ... p.s. schönen Gruß an meine Heimatstadt (Marzipan .... :-D |
Re: Astro-Daten
@markus5766h;
Danke für den Tipp, werde ich mir gerne 'mal antun :) [OT] Audio-Highend und Analogfilter gehören auch zu meinen Hobbies [/OT] Gruß nach Hamburg Wolfgang |
Re: Astro-Daten
Noch ein Tipp - definiere zuerst die Typen und dann lass die Konstanten folgen:
Delphi-Quellcode:
So kannst du die Deklaration für EclipseName verbessern.
type
... TEclipse=(ecNone, ecPartial, ecNoncentral, ecCircular, ecCirculartotal, ecTotal, ecHalfshadow); ... const EclipseName : array [TEclipse] of string = // vorher: array[0..6] ('', 'Teilfinsternis', 'Teilfinsternis', 'Randfinsternis', 'Teilfinsternis mit Rand', 'Totale Finsternis', 'Halbschatten'); Dies vereinfacht deinen Code und erhöht die Sicherheit weil der Compiler sicherstellt, dass die Anzahl der Strings genau auf den Typ TEclipse passt. Das Gleiche gilt auch für "Bundesland", "Jahreszeit",... Ausserdem würde ich empfehlen einen eigenen Datentyp für die Längen- und Breitenangaben zu deklarieren:
Delphi-Quellcode:
Damit wird der Code besser lesbar denn man sieht, dass die Funktion Sun_Rise() zwei Winkelangaben erwartet.
type
TGeoAngle = Extended; function Sun_Rise(date:TDateTime; latitude, longitude:TGeoAngle):TDateTime; Der Code enthält EXTREM viele hartcodierte Zahlen; man kann das bei astronomischen Berechnungen nicht ganz vermeiden. Manche Werte können aber leicht durch Konstanten ersetzt werden. HOURS_PER_DAY=24; EARTH_DIAMETER=...; AVERAGE_MOON_DISTANCE=... Mit den Konstanten versteht man besser was da eigentlich gerechnet wird. |
Re: Astro-Daten
@sx2008
danke für die Tipps, werd' ich bei der nächsten Bearbeitung umsetzen |
Re: Astro-Daten
Hallo,
Die Attachments wurden aktualisiert. Einige Vorschläge wurden umgesetzt. neue Funktionen :
Delphi-Quellcode:
GetMoonPhaseNum liefert die Phase (1 .. 8) so dass Mondphasenbilder
function GetMoonPhaseNum(Age : extended):Integer;
function DateTimeReal(DtTm : TDateTime; Long : extended):TDateTime; function DateTimeTZ(DtTm : TDateTime; Hour : ShortInt):TDateTime; entsprechend den Nummern angezeigt werden können (ist im Demo aktualisiert). Die Verteilung ist : 1 : Neumond 1,00 Tage 2 : zunehmender Mond 4,5833 Tage 3 : zunehmender Halbmond, erstes Viertel 4,5833 Tage 4 : zunehmender Mond 4,5833 Tage 5 : Vollmond 1,00 Tage 6 : abnehmender Mond 4,5833 Tage 7 : abnehmender Mond, letztes Viertel 4,5833 Tage 8 : abnehmender Mond 4,5833 Tage Die Verteilung und / oder Anzahl kann leicht in der entsprechenden Case - - Of - Anweisung geändert werden DateTimeReal liefert den TDateTime-Wert an Hand des Längengrad DateTimeTZ liefert den TDateTimeWert zur Zeitzone (der Vollständigkeit halber) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz