Altitude windows, crossings, and culminations for Sun, Moon, and stars.
Altitude windows, crossings, and culminations for Sun, Moon, and stars.Usage: cmake –build build-make –target altitude_events_example ./build-make/altitude_events_example
#include <cstdio>
#include <vector>
using namespace qtty::literals;
return (d == CrossingDirection::Rising) ? "rising" : "setting";
}
return (k == CulminationKind::Max) ? "max" : "min";
}
std::printf("%04d-%02u-%02u %02u:%02u:%02u", utc.year, utc.month, utc.day,
utc.hour, utc.minute, utc.second);
}
static void print_periods(
const char* title,
const std::vector<Period>& periods,
std::size_t max_items = 4) {
std::printf("%s: %zu period(s)\n", title, periods.size());
const std::size_t n =
(periods.size() < max_items) ? periods.size() : max_items;
for (std::size_t i = 0; i < n; ++i) {
const auto s = periods[i].start().to_utc();
const auto e = periods[i].end().to_utc();
std::printf(" %zu) ", i + 1);
std::printf(" -> ");
std::printf(" (%.2f h)\n", periods[i].duration_days() * 24.0);
}
if (periods.size() > n) {
std::printf(" ... (%zu more)\n", periods.size() - n);
}
}
const std::vector<CrossingEvent>& events,
std::size_t max_items = 6) {
std::printf("%s: %zu event(s)\n", title, events.size());
const std::size_t n = (events.size() < max_items) ? events.size() : max_items;
for (std::size_t i = 0; i < n; ++i) {
const auto t = events[i].time.to_utc();
std::printf(" %zu) ", i + 1);
}
if (events.size() > n) {
std::printf(" ... (%zu more)\n", events.size() - n);
}
}
const std::vector<CulminationEvent>& events,
std::size_t max_items = 6) {
std::printf("%s: %zu event(s)\n", title, events.size());
const std::size_t n = (events.size() < max_items) ? events.size() : max_items;
for (std::size_t i = 0; i < n; ++i) {
const auto t = events[i].time.to_utc();
std::printf(" %zu) ", i + 1);
std::printf(" alt=%.3f deg kind=%s\n", events[i].altitude.value(),
}
if (events.size() > n) {
std::printf(" ... (%zu more)\n", events.size() - n);
}
}
std::printf("=== Altitude Events Example ===\n\n");
const auto start = MJD::from_utc({2026, 7, 15, 0, 0, 0});
const auto end = start + 2.0;
const Period window(start, end);
std::printf("Observer: Mauna Kea (lon=%.4f lat=%.4f h=%.0f m)\n",
obs.lon.value(), obs.lat.value(), obs.height.value());
std::printf("Window MJD: %.6f -> %.6f\n\n", start.value(), end.value());
const auto sun_night = sun::below_threshold(obs, window, -18.0_deg, opts);
const auto sun_cross = sun::crossings(obs, window, -0.833_deg, opts);
const auto sun_culm = sun::culminations(obs, window, opts);
print_periods(
"Sun below -18 deg (astronomical night)", sun_night);
std::printf("\n");
const auto moon_above = moon::above_threshold(obs, window, 20.0_deg, opts);
const auto moon_cross = moon::crossings(obs, window, 0.0_deg, opts);
const auto moon_culm = moon::culminations(obs, window, opts);
std::printf("\n");
const auto vega_above =
star_altitude::above_threshold(vega, obs, window, 25.0_deg, opts);
const auto vega_cross =
star_altitude::crossings(vega, obs, window, 0.0_deg, opts);
const auto vega_culm = star_altitude::culminations(vega, obs, window, opts);
std::printf("\n");
const auto dir_above =
icrs_altitude::above_threshold(dir_icrs, obs, window, 30.0_deg, opts);
const auto dir_below =
icrs_altitude::below_threshold(dir_icrs, obs, window, 0.0_deg, opts);
return 0;
}
static void print_crossings(const char *title, const std::vector< CrossingEvent > &events, std::size_t max_items=6)
static const char * crossing_direction_name(CrossingDirection d)
static void print_periods(const char *title, const std::vector< Period > &periods, std::size_t max_items=4)
static const char * culmination_kind_name(CulminationKind k)
static void print_utc(const UTC &utc)
static void print_culminations(const char *title, const std::vector< CulminationEvent > &events, std::size_t max_items=6)
const Geodetic MAUNA_KEA
Mauna Kea Observatory (Hawaii, USA).
Umbrella header for the siderust C++ wrapper library.
Options for altitude search algorithms.
SearchOptions & with_scan_step(double step)
Set a custom scan step.
SearchOptions & with_tolerance(double tol)
Set time tolerance.
A direction on the celestial sphere, compile-time tagged by frame.