Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte » 

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi Astro-Daten (https://www.delphipraxis.net/145690-astro-daten.html)

markus5766h 6. Jan 2010 16:01


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:
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;
im Anhang :
- 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

JamesTKirk 6. Jan 2010 16:43

Re: Astro-Daten
 
Als kleine Anmerkung:

Delphi-Quellcode:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ShellAPI, Registry, ShlObj, ComCtrls, DateUtils,
  ExtCtrls;
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):

Delphi-Quellcode:
uses
  SysUtils, Classes, DateUtils, Windows;
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 ;)

Gruß,
Sven

markus5766h 6. Jan 2010 17:10

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:

Luckie 6. Jan 2010 17:12

Re: Astro-Daten
 
Nicht schlecht. So wa shabe ich schon lange mal gesucht, insbesondere wegen der Mondphasen usw.

Wolfgang Mix 6. Jan 2010 18:29

Re: Astro-Daten
 
Michael hat geschrieben:
Zitat:

Nicht schlecht. So wa shabe ich schon lange mal gesucht, insbesondere wegen der Mondphasen usw.
Gute Arbeit!
Ich habe lange nach den Berechnungen der Jahreszeiten gesucht.
Gibt es da noch Quellen zum Nachlesen?

Gruß

Wolfgang

markus5766h 6. Jan 2010 19:26

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

Wolfgang Mix 6. Jan 2010 19:37

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

sx2008 7. Jan 2010 13:48

Re: Astro-Daten
 
Noch ein Tipp - definiere zuerst die Typen und dann lass die Konstanten folgen:
Delphi-Quellcode:
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');
So kannst du die Deklaration für EclipseName verbessern.
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:
type
TGeoAngle = Extended;

function Sun_Rise(date:TDateTime; latitude, longitude:TGeoAngle):TDateTime;
Damit wird der Code besser lesbar denn man sieht, dass die Funktion Sun_Rise() zwei Winkelangaben erwartet.

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.

markus5766h 7. Jan 2010 13:59

Re: Astro-Daten
 
@sx2008

danke für die Tipps, werd' ich bei der nächsten Bearbeitung umsetzen

markus5766h 12. Jan 2010 16:11

Re: Astro-Daten
 
Hallo,

Die Attachments wurden aktualisiert. Einige Vorschläge wurden umgesetzt.

neue Funktionen :
Delphi-Quellcode:
function GetMoonPhaseNum(Age : extended):Integer;
function DateTimeReal(DtTm : TDateTime; Long : extended):TDateTime;
function DateTimeTZ(DtTm : TDateTime; Hour : ShortInt):TDateTime;
GetMoonPhaseNum liefert die Phase (1 .. 8) so dass Mondphasenbilder
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 16:24 Uhr.
Seite 1 von 4  1 23     Letzte » 

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf