28 return a < 0 ?
TwoPi + a : a;
41 return std::asin(fo) +
M_PI_2;
58 const D64 E_DEG = M_DEG + ECC_DEG * std::sin(g) * (1.0 + ECC_RAD * std::cos(g));
60 D64 x = std::cos(E_RAD) - ECC_RAD;
67 const D64 lonsun = v + W_DEG;
71 x = r * std::cos(lonsun_rad);
72 y = r * std::sin(lonsun_rad);
73 const D64 yequat = y * std::cos(obliq);
74 const D64 zequat = y * std::sin(obliq);
93 const I32 year = dateTime.tm_year + 1900;
94 const I32 m = dateTime.tm_mon + 1;
95 const I32 day = dateTime.tm_mday;
97 const auto h = dateTime.tm_hour + dateTime.tm_min / 60.0;
98 const auto tzone = std::chrono::current_zone()->get_info( std::chrono::system_clock::now() ).offset.count() / 3600.0;
101 const auto UT = h - tzone;
106 const D64 jd = [year, h, m, day]()
noexcept {
107 const I32 luku = -7 * (year + (m + 9) / 12) / 4 + 275 * m / 9 + day;
109 return to_D64(luku + year * 367) - 730530.0 + h / 24.0;
113 D64 RA = 0.0, delta = 0.0, L = 0.0;
114 const D64 lambda = FNsun(jd, RA, delta, L);
115 const D64 cos_delta = std::cos(delta);
119 const D64 obliq = Oblique_A - Oblique_B * jd;
123 const D64 SIDTIME = GMST0 + UT + longit / 15.0;
128 const D64 x = std::cos(ha) * cos_delta;
129 const D64 y = std::sin(ha) * cos_delta;
130 const D64 z = std::sin(delta);
131 const D64 xhor = x * std::sin(latit_rad) - z * std::cos(latit_rad);
133 const D64 zhor = x * std::cos(latit_rad) + z * std::sin(latit_rad);
134 const D64 azim = FNrange(std::atan2(yhor, xhor) +
M_PI);
135 const D64 altit = std::asin(zhor);
138 const D64 alpha = std::atan2(std::cos(obliq) * std::sin(lambda), std::cos(lambda));
143 ha = f0(latit, delta);
147 D64 riset = 12.0 - 12.0 * ha /
M_PI + tzone - longit / 15.0 + equation / 60.0;
148 D64 settm = 12.0 + 12.0 * ha /
M_PI + tzone - longit / 15.0 + equation / 60.0;
149 D64 noont = riset + 12.0 * ha /
M_PI;
150 D64 altmax = 90.0 + delta_deg - latit;
152 altmax = 180.0 - altmax;
155 noont -= 24 * (noont > 24 ? 1 : 0);
156 riset -= 24 * (riset > 24 ? 1 : 0);
157 settm -= 24 * (settm > 24 ? 1 : 0);
159 const auto calcTime = [](
const D64 dhr)
noexcept
170 .sunsetTime = calcTime(settm),
171 .noonTime = calcTime(noont),
172 .altitude =
to_F32(altit),
174 .altitudeMax =
to_F32(altmax),
175 .declination =
to_F32(delta_deg)
180 if (angleInRadians < 0) {
181 return TwoPi - std::fmod(std::abs(angleInRadians), TwoPi);
183 if (angleInRadians > TwoPi) {
184 return std::fmod(angleInRadians, TwoPi);
187 return angleInRadians;
191 if (!
COMPARE(_longitude, longitude)) {
192 _longitude = longitude;
195 if (!
COMPARE(_latitude, latitude)) {
196 _latitude = latitude;
203 const time_t t2 = mktime(&dateTime);
204 const D64 diffSecs = std::abs(difftime(t1, t2));
205 if (t1 == -1 || diffSecs > g_numSecondsUpdateInterval) {
239 const F32 sinPhiRadius = std::sin(phi) * radius;
242 sinPhiRadius * std::sin(theta),
243 std::cos(phi) * radius,
244 sinPhiRadius * std::cos(theta)
constexpr T DegreesToRadians(T angleDegrees) noexcept
Return the radian equivalent of the given degree value.
constexpr T RadiansToDegrees(T angleRadians) noexcept
Return the degree equivalent of the given radian value.
constexpr D64 FNrange(const D64 x) noexcept
D64 FNsun(const D64 d, D64 &RA, D64 &delta, D64 &L) noexcept
constexpr D64 Eccentricity_B
D64 f0(const D64 lat, const D64 declin) noexcept
constexpr D64 Longitude_A
constexpr D64 g_numSecondsUpdateInterval
constexpr D64 Eccentricity_A
constexpr D64 Longitude_B
Handle console commands that start with a forward slash.
constexpr T SQUARED(T input) noexcept
constexpr F32 to_F32(const T value)
constexpr D64 to_D64(const T value)
constexpr U8 to_U8(const T value)
bool COMPARE(T X, U Y) noexcept
constexpr I32 to_I32(const T value)
vec3< F32 > GetSunPosition(F32 radius=1.f) const
void SetLocation(F32 longitude, F32 latitude) noexcept
const SunInfo & GetDetails() const
SimpleLocation GetGeographicLocation() const noexcept
void SetDate(struct tm &dateTime) noexcept
SimpleTime GetTimeOfDay() const noexcept
Angle::RADIANS< F32 > azimuth
Angle::RADIANS< F32 > altitude
static D64 CorrectAngle(D64 angleInRadians) noexcept
static SunInfo CalculateSunPosition(const struct tm &dateTime, F32 latitude, F32 longitude)