[gelöst] Kennt jemand Mond/Sonnen-Komponenten?

Rund um die LCL und andere Komponenten
sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: [gelöst]Kennt jemand Mond/Sonnen-Komponenten?

Beitrag von sstvmaster »

Das (East, West, North, South) wird doch nur benötigt wenn mann es in Grad, Minuten und Sekunden angibt.
Das + und - nur wenn man von Azimuth und Elevation spricht.
Bei direkten "floats" nicht.
...click here to try the updated version of NOAA's Solar Calculator
https://www.esrl.noaa.gov/gmd/grad/solcalc/

Dann schau dir mal dein MapViewer an.
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: [gelöst]Kennt jemand Mond/Sonnen-Komponenten?

Beitrag von wp_xyz »

Keine Ahnung, da weißt du mehr als ich. Für mich sind das alles nur Zahlen, und Grad/Minuten/Sekunden sind nichts anderes als anders formatierte Float-Zahlen. Zahlen haben ein Vorzeichen, und man muss übereinkommen, welche Richtung die positive ist. In der Mathematik verläuft die y-Achse von unten nach oben, aber ausgerechnet die Informatiker haben sich für den Bildschirm für die andere Richtung von oben nach unten entschieden, wobei aber die OpenGL-Entwickler wieder die Richtung der Mathematik genommen haben.

So wird es auch bei den Längengraden sein. Ich habe gerade in DelphiMoon, dieser anderen Astronomie-Lib, nachgesehen, und da ist die geographische Länge auch nach Westen positiv. Zitat aus der Hilfe-Datei: "the longitude is positive for points west of Greenwich, negative for points east". Und anscheinend scheint es in diesem Zweig der Astronomie Gründe zu geben, die Längengrade in der anderen Richtung laufen zu lassen. Ich werde daher auch nichts an der solar-Unit ändern. Das ist zum einen nicht mein Code, und zum anderen sind mir die Rechnungen viel zu unübersichtlich als dass ich überblicken könnte, wo überall das Vorzeichen des longitude-Parameters zu ändern ist. Da setze ich lieber den negativen Wert in SolarStuff ein, und das war alles.

LazMapViewer hat nichts mit den Sunset-Programm zu tun. Das sind völlig unabhängige Aktivitäten.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: [gelöst]Kennt jemand Mond/Sonnen-Komponenten?

Beitrag von Winni »

Hi!

Vorzeichen Ost und West: Da haben die Amis so ihre eigenen Vorstellungen,
Als ich vor Jahren mein Wissem in spärischer Geometrie auffrischen wollte.
fand ich amerikanische Übungsaufgaben für Piloten. Aufgabe: berechnen sie
die Stecke von New York nach Los Angeles und die Zielkordinaten. Ich landete
leider vor den Kanarischen Inseln im Wasser. Lösung:
Die Amis hatten ihre westlichen Koordinaten mit positiven Vorzeichen angegeben.
Hoffentlich machen die US-Piloten das dann richtig, falls sie mal manuell rechnen
müssten.

Und es ist gut wenn eine unit für eine halbwegs genau Berechnung der Mondposition
gefunden ist. Der Mond "eiert"verglichen mit einer lineare Inerpolation bis zu einem viertel
Tag. Selbst für eine halbwegs genaue Amateur-Positiosbestimmung benötigt man
19 bis 22 verschiedene Formeln.

Winni

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: [gelöst]Kennt jemand Mond/Sonnen-Komponenten?

Beitrag von six1 »

Ich habe diesen Code gefunden, welcher auf Windows und Linux 1a funktioniert und Sun_set und Sun_rise berechnet:
(Code stammt im Original von http://williams.best.vwh.net/sunrise_su ... orithm.htm )

Code: Alles auswählen

unit sunRiseSetUnit;

{$mode objfpc}{$H+}{$R+}{$I+}

//-----------------------------------------------------------------------------
//
//  Sunrise/Sunset Time module
//
// 1.0 Apr 2015:
//      Original Version:
// 1.1  2021-01
//      Six1  https://www.lazarusforum.de/viewtopic.php?p=119263#p119263
// ----------------------------------------------------------------------------

interface

uses
    classes,
    dateUtils;

function sunRiseSet(
    sunMode                     : integer;
    date                        : TDateTime;
    latitude                    : double;
    longitude                   : double;
    var Err                     : string;
    zenithMode                  : integer = 0;
    localOffset                 : real = 0
    )                           : TDateTime;

// ----------------------------------------------------------------------------

implementation

uses
    math,
    sysUtils;

function sunRiseSet(
    sunMode                     : integer;
    date                        : TDateTime;
    latitude                    : double;
    longitude                   : double;
    var Err                     : string;
    zenithMode                  : integer = 0;
    localOffset                 : real = 0
    )                           : TDateTime;

const
    sunrising                   = 0;
    sunsetting                  = 1;

    zenithOfficial              = 0;
    zenithCivil                 = 1;
    zenithNautical              = 2;
    zenithAstronomical          = 3;

    zenithDeg                   : array [0 .. 3] of double = (
                                    90.833333,
                                    96.0,
                                    102.0,
                                    108.0
                                    );

var
    cosDec                      : double;
    cosH                        : double;
    day                         : integer;
    h                           : double;
    l                           : double;
    lQuadrant                   : double;
    lngHour                     : double;
    m                           : double;
    month                       : integer;
    n                           : integer;
    n1                          : integer;
    n2                          : integer;
    n3                          : integer;
    oldDateSeparator            : char;
    oldShortDateFormat          : string;
    ra                          : double;
    raQuadrant                  : double;
    sinDec                      : double;
    t                           : double;
    tLocal                      : double;
    tLocalMean                  : double;
    tUTC                        : double;
    year                        : integer;
    hour, minute:integer;
    // the algorith requires degrees NOT radians. These functions are
    // wrappers for the various trig functions which convert degrees to radians
    function degACOS(
            n                   : double
            )                   : double;
    begin
    degACOS := (180/pi)*arccos(n);
    end; // degACOS
    function degASIN(
            n                   : double
            )                   : double;
    begin
    degASIN := (180/pi)*arcsin(n);
    end; // degASIN
    function degATAN(
            n                   : double
            )                   : double;
    begin
    degATAN := (180/pi)*arctan(n);
    end; // degATAN
    function degCOS(
            angle               : double
            )                   : double;
    begin
    degCOS := cos((pi/180)*angle);
    end; // degCOS
    function degSIN(
            angle               : double
            )                   : double;
    begin
    degSin := sin((pi/180)*angle);
    end; // degSIN
    function degTAN(
            angle               : double
            )                   : double;
    begin
    degTAN := tan((pi/180)*angle);
    end; //degTAN

begin
Err:='';
if (not(sunMode in [0,1])) then
begin
    Err:='sunMode must be 0-1.';
    result:=0;
    exit;
end;
if (latitude < -90) or (latitude > 90) then
begin
    Err:='latitude outside of -90-90 range.';
    result:=0;
    exit;
end;
if (longitude < -180) or (longitude > 180) then
begin
    Err:='longitude outside of -180-180 range.';
    result:=0;
    exit;
end;
if (not(zenithMode in [0..4])) then
begin
    Err:='zenithMode must be 0..3.';
    result:=0;
    exit;
end;

month   := monthof(date);
day     := dayof(date);
year    := yearof(date);

// Calc day of year
n1  := floor(275 * month / 9);
n2  := floor((month + 9) / 12);
n3  := (1 + floor((year - 4 * floor(year / 4) + 2) / 3));
n   := n1 - (n2 * n3) + day - 30;

// Convert longitude to hour and calc approximate time
lngHour := longitude / 15;

if sunMode = sunRising then
    t := n + ((6 - lngHour) / 24)
else
    t := n + ((18 - lngHour) / 24);

// Calc the Sun's Mean anomaly
m := (0.9856 * t) - 3.289;

// Calc Sun's true longitude
l := m + (1.916 * degSIN(m)) + (0.020 * degSIN(2*M)) + 282.634;
if (l < 0) then
    l := l + 360
else if (l > 360) then
    l := l - 360;

// Calc the sun's right ascension
ra := degATAN(0.91764 * degTAN(L));
if (ra < 0) then
    ra := ra + 360
else if (ra > 360) then
    ra := ra - 360;

// Right ascension needs to be in the same quadrant as L
lQuadrant := (floor(l / 90)) * 90;
raQuadrant := (floor(ra / 90)) * 90;
ra := ra + (lQuadrant - raQuadrant);

// Convert Right ascension into hours
ra := ra / 15;

// Calc the Sun's declination
sinDec := 0.39782 * degSIN(l);
cosDec := degCOS(degASIN(sinDec));

// Calc the Sun's local hour angle
cosH := (degCOS(zenithDeg[zenithMode]) - (sinDec * degSIN(latitude))) /
            (cosDec * degCOS(latitude));
if (cosH > 1) or (cosH < -1) then
begin
    // Sun doesn't rise at this location on this date. We will just
    // set it to 12:00
    Result := EncodeDate(Year, Month, Day) + EncodeTime(12, 0,0,0);
end;

// Finish calculating H and convert into hours
if sunMode = sunRising then
    h := 360 - degACOS(cosH)
else
    h := degACOS(cosH);
h := h / 15;

// Calculate local mean time of rising/setting
tLocalMean := h + ra - (0.06571 * t) - 6.622;

// adjust back to UTC
tUTC   := tLocalMean - lngHour;

// adjust back to local time
tLocal := tUTC + localOffset;
if (tLocal < 0) then
    tLocal := tLocal + 24
else if (tLocal > 24) then
    tLocal := tLocal - 24;

// if minutes would round up to 60, go to next hour:
if (round((tLocal-floor(tLocal))*60) = 60) then
    tLocal := floor(tLocal) + 1;

hour:=floor(tLocal);
minute:=round((tLocal-floor(tLocal))*60);
Result := EncodeDate(Year, Month, Day) + EncodeTime(hour, minute,0,0);

end; //sunRiseSet

end.
 
Aufruf:

Code: Alles auswählen

uses
...
  , sunRiseSetUnit
  , DateUtils
...

procedure GetSun;
const
  zenithOfficial              = 0;
  zenithCivil                 = 1;
  zenithNautical              = 2;
  zenithAstronomical          = 3;
var
  offset:integer;
  Err:string;
begin
    offset := trunc((GetLocalTimeOffset * -1)/60);
    _sun_rise := sunRiseSet(0, akt_time, Latitude.Value, Longitude.value, Err, zenithOfficial, offset);
    if (_sun_rise=0) then
      Showmessage( Err);
    _sun_set  := sunRiseSet(1, akt_time, Latitude.Value, Longitude.value, Err, zenithOfficial, offset);
    if (_sun_set=0) then
      Showmessage( Err);
end;
Zuletzt geändert von six1 am So 31. Jan 2021, 11:06, insgesamt 5-mal geändert.
Gruß, Michael

catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

Kennt jemand Mond/Sonnen-Komponenten?

Beitrag von catweasel »

six1 hat geschrieben:
Di 26. Jan 2021, 07:01
Ich habe diesen Code gefunden, welcher auf Windows und Linux 1a funktioniert und Sun_set und Sun_rise berechnet:
(Code stammt im Original von http://williams.best.vwh.net/sunrise_su ... orithm.htm )
Hallo

Ich habe versucht den Code von six1 in mein Programm einzubinden, bin aber auf ein seltsames Problem gestoßen:
Immer wenn ich die Sonnenaufgang-/ und Untergangszeiten vom 1.-9. eines Monats berechnen will, bekomme ich eine Fehlermeldung vom Typ:

Code: Alles auswählen

"9/2021 7:56" is not a valid time
Ab dem 10. bis zum Ende des Monats gibt es keinen Fehler. Das gilt für jeden Monat.
Ich habe es auch mit und ohne führender Null versucht, aber ohne Erfolg.
Mache ich noch was falsch, oder ist der Code noch Fehlerhaft?

Code: Alles auswählen

     lat:=50.66057;
     lon:=6.78722;

     // Fehler:
     Date := EncodeDate(2021, 02, 09);
     
     // OK
     //Date := EncodeDate(2021, 02, 10);    
     
     showmessage('Date: '+datetimetostr(date));

     offset    := trunc((GetLocalTimeOffset * -1)/60);
     _sun_rise := sunRiseSet(0, Date, Lat, Lon, zenithOfficial, offset);
     _sun_set  := sunRiseSet(1, Date, Lat, Lon, zenithOfficial, offset);

     showmessage('Rise: '+datetimetostr(_sun_rise)+chr(13)+
                 'Set:  '+datetimetostr(_sun_set)); 

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: Kennt jemand Mond/Sonnen-Komponenten?

Beitrag von six1 »

Zeile 234 in SunRiseSetUnit.pas
ersetze mit:

Code: Alles auswählen

result              := strToDateTime(format('%0.2D/%0.2D/%4D',[month, day, year]) + ' ' +
                        inttostr(floor(tLocal)) + ':' +
                        inttostr(round((tLocal-floor(tLocal))*60)));
Habe es in obigem Quellcode bereits geändert.
Gruß, Michael

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Kennt jemand Mond/Sonnen-Komponenten?

Beitrag von wp_xyz »

StrToDateTime bei einem String, der bei uns in der Reihenfolge Monat-Tag-Jahr aufgebaut ist? Ich kann mir nicht vorstellen, dass das funktioniert, ohne etwas an den FormatSettings zu ändern.

Und warum wird da überhaupt ein TDateTime-Wert auf dem Umweg über einen String erzeugt, wenn Monat, Tag und Jahr als Zahlenwerte schon bekannt sind? Nimm doch EncodeDate().

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: Kennt jemand Mond/Sonnen-Komponenten?

Beitrag von six1 »

@wp_xyz
zwei Beiträge oben drüber ist der Quellcode...

Code: Alles auswählen

oldShortDateFormat  := shortDateFormat;
oldDateSeparator    := dateSeparator;
shortDateFormat     := 'm/d/y';
dateSeparator       := '/';
result              := strToDateTime(format('%0.2D/%0.2D/%4D',[month, day, year]) + ' ' +
                        inttostr(floor(tLocal)) + ':' +
                        inttostr(round((tLocal-floor(tLocal))*60)));
shortDateFormat     := oldShortDateFormat;
dateSeparator       := oldDateSeparator;
Das Problem war, dass mit %D der Tag und der Monat gewandelt wurden. Bei einstelligen Zahlenwerten kam dann " 9" raus.
Als Datumstring sah das so aus " 2. 9.2021". Die Leerzechen machen dann natürlich Probleme bei strtodatetime.
Ich habe einfach das %D durch %0.2D ersetzt, wodurch führende Nullen ergänzt werden.
Gruß, Michael

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Kennt jemand Mond/Sonnen-Komponenten?

Beitrag von wp_xyz »

Ach so, das habe ich nicht gesehen. Allerdings sollte dir bewusst sein, dass die separate Verwendung der Bestandteile des TFormatSettings Record schon sein langem deprecated ist, also mit jeder neuen FPC-Version nicht mehr möglich sein kann.
Besser wäre, den vollen TFormatSettings-Record zu verwenden:

Code: Alles auswählen

var
  oldFormatSettings: TFormatSettings;
...
  oldFormatSettings := DefaultFormatSettings;
  DefaultFormatSettings.ShortDateFormat := 'm/d/y';
  DefaultFormatSettings.DateSeparator := '/';
  ... hier die Rechnung ...
  DefaultFormatSettings := oldFormatSettings; 
Aber warum so kompliziert? Es sind doch Monat, tag und jahr schon einzeln bekannt, da kann man doch mit EncodeDate einen TDate-Wert zusammenbauen, ohne den Umweg über einen String und die Umwägbarkeiten der FormatSettings nehmen zu müssen, und die lokale Zeit tLocal wird einfach dazuaddiert:

Code: Alles auswählen

  Result := EncodeDate(Year, Month, Day) + tLocal;

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: Kennt jemand Mond/Sonnen-Komponenten?

Beitrag von six1 »

:D ja, kann man machen. Ich habe diesen verwaisten Code im Netz gefunden und es lief soweit, bis auf diesen kleinen Fauxpas mit %0.2D.

Edit: Habe den obigen Quellcode geändert auf EncodeDate und EncodeTime
viewtopic.php?p=119263#p119263
Gruß, Michael

catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

Re: Kennt jemand Mond/Sonnen-Komponenten?

Beitrag von catweasel »

Hallo zusammen

Jetzt funktioniert es super. :D
Danke an alle für die Unterstützung!

Gruß und noch einen schönen Sonntag
Michael

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Kennt jemand Mond/Sonnen-Komponenten?

Beitrag von wp_xyz »

six1 hat geschrieben:
Sa 30. Jan 2021, 17:51
Edit: Habe den obigen Quellcode geändert auf EncodeDate und EncodeTime
Dasselbe kommt aber an ein paar Zeilen höher immer noch vor.

Außerdem findet man am Anfang einige Zeilen mit WriteLn, was ein standardmäßiges GUI-Programm auf Windows abstürzen lässt. Und in der folgenden Anweisung steht ein Halt, was die User an sich zweifeln lässt, weil sich das Programm plötzlich verabschiedet (naja, eigentlich nicht, denn vorher stürzt das Windows-Programm schon wegen des WriteLn ab).

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: [gelöst] Kennt jemand Mond/Sonnen-Komponenten?

Beitrag von six1 »

:D Ok, auch dieses habe ich noch geändert....

viewtopic.php?p=119263#p119263
Gruß, Michael

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: [gelöst] Kennt jemand Mond/Sonnen-Komponenten?

Beitrag von Winni »

Hi!

Bei DelphiPraxis gibt es eine Unit mit Astro-Daten einschließlich Mond & Sonne

https://www.delphipraxis.net/145690-astro-daten.html

Winni

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: [gelöst] Kennt jemand Mond/Sonnen-Komponenten?

Beitrag von six1 »

ja, hatte ich gesehen, aber Win only
Gruß, Michael

Antworten