AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Astro-Daten

Ein Thema von markus5766h · begonnen am 6. Jan 2010 · letzter Beitrag vom 29. Mai 2021
Antwort Antwort
Seite 1 von 4  1 23     Letzte » 
Benutzerbild von markus5766h
markus5766h

Registriert seit: 5. Mär 2009
Ort: Hamburg
569 Beiträge
 
Delphi XE8 Professional
 
#1

Astro-Daten

  Alt 6. Jan 2010, 16:01
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
Miniaturansicht angehängter Grafiken
_bersicht_826.jpg  
Angehängte Dateien
Dateityp: rar astro_demo_859.rar (329,8 KB, 243x aufgerufen)
Dateityp: rar astrounit_300.rar (13,5 KB, 234x aufgerufen)
Dateityp: rar ASTRO4.rar (16,0 KB, 170x aufgerufen)
Markus H.

Geändert von markus5766h (21. Dez 2013 um 19:46 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von JamesTKirk
JamesTKirk

Registriert seit: 9. Sep 2004
Ort: München
604 Beiträge
 
FreePascal / Lazarus
 
#2

Re: Astro-Daten

  Alt 6. Jan 2010, 16:43
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
Sven
[Free Pascal Compiler Entwickler]
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat
Benutzerbild von markus5766h
markus5766h

Registriert seit: 5. Mär 2009
Ort: Hamburg
569 Beiträge
 
Delphi XE8 Professional
 
#3

Re: Astro-Daten

  Alt 6. Jan 2010, 17:10
Hallo,
@JamesTKirk : Abhängigkeiten sind reduziert, hatte ich vergessen, da ich
(zur besseren Kontrolle) das ganze erst mal visuell gemacht habe (DEMO).

Markus H.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Astro-Daten

  Alt 6. Jan 2010, 17:12
Nicht schlecht. So wa shabe ich schon lange mal gesucht, insbesondere wegen der Mondphasen usw.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Wolfgang Mix
Wolfgang Mix

Registriert seit: 13. Mai 2009
Ort: Lübeck
1.222 Beiträge
 
Delphi 2005 Personal
 
#5

Re: Astro-Daten

  Alt 6. Jan 2010, 18:29
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
Wolfgang Mix
if you can't explain it simply you don't understand it well enough - A. Einstein
Mein Baby:http://www.epubli.de/shop/buch/Grund...41818516/52824
  Mit Zitat antworten Zitat
Benutzerbild von markus5766h
markus5766h

Registriert seit: 5. Mär 2009
Ort: Hamburg
569 Beiträge
 
Delphi XE8 Professional
 
#6

Re: Astro-Daten

  Alt 6. Jan 2010, 19:26
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 ....
Markus H.
  Mit Zitat antworten Zitat
Benutzerbild von Wolfgang Mix
Wolfgang Mix

Registriert seit: 13. Mai 2009
Ort: Lübeck
1.222 Beiträge
 
Delphi 2005 Personal
 
#7

Re: Astro-Daten

  Alt 6. Jan 2010, 19:37
@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
Wolfgang Mix
if you can't explain it simply you don't understand it well enough - A. Einstein
Mein Baby:http://www.epubli.de/shop/buch/Grund...41818516/52824
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Astro-Daten

  Alt 7. Jan 2010, 13:48
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.
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von markus5766h
markus5766h

Registriert seit: 5. Mär 2009
Ort: Hamburg
569 Beiträge
 
Delphi XE8 Professional
 
#9

Re: Astro-Daten

  Alt 7. Jan 2010, 13:59
@sx2008

danke für die Tipps, werd' ich bei der nächsten Bearbeitung umsetzen
Markus H.
  Mit Zitat antworten Zitat
Benutzerbild von markus5766h
markus5766h

Registriert seit: 5. Mär 2009
Ort: Hamburg
569 Beiträge
 
Delphi XE8 Professional
 
#10

Re: Astro-Daten

  Alt 12. Jan 2010, 16:11
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)
Markus H.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz