载入中...
搜索中...
未找到
SkySolarOrbit.cpp
浏览该文件的文档.
2#include <cmath>
3#include <numbers>
4
5namespace eve::daynight {
6namespace {
7Diagnostic invalidOrbit(const char* message) {
9}
10} // namespace
11SkySolarOrbit::SkySolarOrbit(double pitch, double yaw)
12 : sinPitch_(std::sin(pitch)), cosPitch_(std::cos(pitch)), sinYaw_(std::sin(yaw)), cosYaw_(std::cos(yaw)) {}
13
14Result<SkySolarOrbit> SkySolarOrbit::create(double pitchDegrees, double yawDegrees) {
15 if (!std::isfinite(pitchDegrees) || std::abs(pitchDegrees) > 90 || !std::isfinite(yawDegrees) ||
16 std::abs(yawDegrees) > 360)
17 return Result<SkySolarOrbit>::failure(invalidOrbit("Invalid solar orbit pitch or yaw"));
18 constexpr double radians = std::numbers::pi / 180;
19 return Result<SkySolarOrbit>::success(SkySolarOrbit(pitchDegrees * radians, yawDegrees * radians));
20}
21
22Result<std::array<double, 3>> SkySolarOrbit::direction(double hour) const {
23 using Direction = Result<std::array<double, 3>>;
24 if (!std::isfinite(hour) || hour < 0 || hour >= 24)
25 return Direction::failure(invalidOrbit("Solar hour must be finite and in [0,24)"));
26 const double phase = (hour - 12) * (std::numbers::pi / 12);
27 const double noon = std::cos(phase);
28 const double x = -sinPitch_ * noon;
29 const double z = -std::sin(phase);
30 return Direction::success({cosYaw_ * x - sinYaw_ * z, cosPitch_ * noon, sinYaw_ * x + cosYaw_ * z});
31}
32} // namespace eve::daynight
float x
Definition AnimClip.cpp:738
float z
Definition AnimClip.cpp:738
float phase
Definition CaveMesh.cpp:58
std::string message
static Diagnostic error(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct an error diagnostic with the standard error severity.
Definition Diagnostic.h:125
Move-only operation result carrying either a value or Status.
Definition Result.h:155
Non-astronomical daily solar orbit, matching the reference's manual pitch/yaw mode.
eve::Diagnostic Diagnostic