Ich möchte eine Sonne in einer 3D-Szene zeichnen, also dachte ich, der einfachste Weg wäre, den Breiten- und Längengrad des Punktes senkrecht zur Sonnenposition zu berechnen und ihn dann einfach "nach oben" zu verschieben.
Als Ausgangspunkt möchte ich die äquatorialen Koordinaten berechnen: Deklination und Rektaszension.
Ich habe die Anweisungen von dieser Seite befolgt und auch Querverweise zu dieser Seite erstellt
Hier ist mein Code (in Swift):
import Foundation
class Astronomy {
static func julianDays(since: Date) -> Double {
return since.timeIntervalSince1970 / 86400 + 2440587.5
}
static func daysSinceJ2000(for date: Date) -> Double {
return julianDays(since: date) - 2451545
}
static func sunAxialTilt(for daysSinceJ200: Double) -> Double {
return 23.4393 - 3.563e-7 * daysSinceJ200
}
static func sunEquatorialPosition(on date: Date) -> (declination: Double, RA: Double, distance: Double) {
let daysSinceGreenwichNoon = daysSinceJ2000(for: date)
var meanLongitude = 280.460 + 0.9856474*daysSinceGreenwichNoon
var meanAnomaly = 357.528 + 0.9856003*daysSinceGreenwichNoon
meanLongitude = meanLongitude.rangedUpTo360
meanAnomaly = meanAnomaly.rangedUpTo360
let eclipticLongitude = meanLongitude + 1.915*sin(meanAnomaly.radians) + 0.020*sin(2*meanAnomaly.radians)
let distanceToEarth = 1.00014 - 0.01671*cos(meanAnomaly.radians) - 0.00014*cos(2*meanAnomaly.radians)
let axialTilt = sunAxialTilt(for: daysSinceGreenwichNoon)
let rightAscension = atan2(cos(axialTilt.radians)*sin(eclipticLongitude.radians), cos(eclipticLongitude.radians))
let declination = asin(sin(axialTilt.radians)*sin(eclipticLongitude.radians))
return (declination: declination.degrees, RA: rightAscension.degrees, distance: distanceToEarth)
}
}
extension Double {
var radians: Double {
return self * .pi / 180
}
var degrees: Double {
return self * 180 / .pi
}
var rangedUpTo360: Double {
let multiples = (self/360).rounded(.down)
return self - 360*multiples
}
}
Allerdings scheint es nicht richtig zu funktionieren. Als ich diesen Artikel schreibe, ist das Ergebnis declination -16.98772292697088, RA -44.80674952684117
. Verglichen mit https://theskylive.com/sun-info ist die Deklination ungefähr richtig (-17° 03' 38”), aber die Rektaszension ist weit entfernt: 20h 59m 43s, was laut dieser Seite 314,93 Grad entspricht
Was schief gelaufen ist?
Bearbeiten: Da sich herausstellte, dass nichts falsch war, kann ich zum zweiten Teil kommen: Berechnung des geografischen Punktes. (der Titel lässt es doch erahnen)
AFAIK für den Breitengrad kann ich die Deklination so verwenden, wie sie ist, und für den Längengrad muss ich den Greenwich Hour Angle (GHA) berechnen
Nachdem ich mehrere Artikel untersucht hatte, fand ich diese Gleichungen:
SHA[°] = 360 – 15 · RA[h]
GHAAries[°] = 15 · GST[h]
GHA = SHA + GHAAries
In meinem Fall nehme ich an, dass ich RA so verwenden kann, wie es ist, ohne seine Stundenkomponente mit 15 zu multiplizieren. Was mich ein bisschen verwirrt, ist die GST:
Wenn wir einen Kreis zeichnen und auf diesem Kreis einen Winkel von 315 Grad gegen den Uhrzeigersinn zeichnen, würden wir ungefähr den gleichen Punkt erhalten, als würden wir einen Winkel von 44,8 Grad in die entgegengesetzte Richtung zeichnen (das Äquivalent von -44,8 in der gleiche Richtung), weil 315+45=360. Es scheint also keinen Fehler in Ihren Ergebnissen zu geben ... Optisch sind die beiden Winkel gleich. Was die geringfügige Ungenauigkeit anbelangt, so kann sie auf Gleitkomma-Präzisionsfehler oder Messfehler zurückzuführen sein.
Wenn Sie eine positive Rektaszension wollen, müssen Sie nur 360 hinzufügen, wenn es negativ ist. Bevor Sie dies tun (dies ist ein allgemeiner Ratschlag, der für Ihren Code möglicherweise nicht wichtig ist), sollten Sie den Dezimalteil subtrahieren, den Rest beim Teilen durch 360 erhalten und den Dezimalteil erneut hinzufügen.
Bearbeiten: Der Unterschied zwischen GST und GMST wird als Zeitgleichung (für Grinich) bezeichnet und wächst nicht über 16 Minuten hinaus. Ich denke, Sie können ihn für Schätzungen verwenden, aber dann wäre es sinnlos, Ihre Ergebnisse zu runden die zehnte Dezimalstelle oder so. Ich weiß ehrlich gesagt nicht, ob es eine "GST für Dummies" gibt (normalerweise würde ich keine unvollständige Antwort posten, aber die Frage wurde bearbeitet), aber die Verwendung von GMST sollte ausreichen, wenn die Fehlerspanne von 16 Minuten akzeptabel ist.
Tosisch
Chappo hat Monica nicht vergessen
bitemybyte
bitemybyte
Astronaut
Astronaut
bitemybyte
Astronaut