107 helios_runtime_error(
"ERROR (PragueSkyModelInterface::getSkyRadiance): Model not initialized. Call initialize() first.");
111 double solar_elevation_deg, solar_azimuth_deg;
112 sunDirectionToAngles(sun_direction, solar_elevation_deg, solar_azimuth_deg);
129 params = model->computeParameters(view_point, prague_view_dir,
130 solar_elevation_deg *
M_PI / 180.0,
131 solar_azimuth_deg *
M_PI / 180.0, visibility_km, albedo);
133 helios_runtime_error(
"ERROR (PragueSkyModelInterface::getSkyRadiance): Prague model not initialized.");
134 }
catch (
const std::exception &e) {
135 std::ostringstream oss;
136 oss <<
"ERROR (PragueSkyModelInterface::getSkyRadiance): Error computing Prague parameters: " << e.what();
141 double radiance_Wm2_sr_nm = 0.0;
143 radiance_Wm2_sr_nm = model->skyRadiance(params, wavelength_nm);
145 helios_runtime_error(
"ERROR (PragueSkyModelInterface::getSkyRadiance): Prague model not initialized.");
146 }
catch (
const std::exception &e) {
147 std::ostringstream oss;
148 oss <<
"ERROR (PragueSkyModelInterface::getSkyRadiance): Error querying sky radiance: " << e.what();
152 return static_cast<float>(radiance_Wm2_sr_nm);
158 helios_runtime_error(
"ERROR (PragueSkyModelInterface::computeIntegratedSkyRadiance): Model not initialized.");
161 if (camera_response.empty()) {
162 helios_runtime_error(
"ERROR (PragueSkyModelInterface::computeIntegratedSkyRadiance): Empty camera response.");
166 float lambda_min = camera_response.front().x;
167 float lambda_max = camera_response.back().x;
169 if (lambda_min >= lambda_max) {
170 helios_runtime_error(
"ERROR (PragueSkyModelInterface::computeIntegratedSkyRadiance): Invalid wavelength range.");
175 float wavelength_span = lambda_max - lambda_min;
176 int n_samples = std::max(10, std::min(50,
static_cast<int>(wavelength_span / 20.0f)));
178 float dlambda = wavelength_span /
static_cast<float>(n_samples);
182 double integrated_radiance = 0.0;
184 for (
int i = 0; i < n_samples; ++i) {
186 float lambda = lambda_min + (i + 0.5f) * dlambda;
189 float response =
interp1(camera_response, lambda);
191 if (response <= 0.0f) {
196 float sky_rad =
getSkyRadiance(view_direction, sun_direction, lambda, visibility_km, albedo);
201 integrated_radiance += sky_rad * response * dlambda;
204 return static_cast<float>(integrated_radiance);
229 helios_runtime_error(
"ERROR (PragueSkyModelInterface::getAvailableRanges): Model not initialized.");
236 min_wavelength_nm =
static_cast<float>(available.channelStart);
237 max_wavelength_nm =
static_cast<float>(available.channelStart + available.channelWidth * (available.channels - 1));
240 min_visibility_km =
static_cast<float>(available.visibilityMin);
241 max_visibility_km =
static_cast<float>(available.visibilityMax);
244 min_elevation_deg =
static_cast<float>(available.elevationMin * 180.0 /
M_PI);
245 max_elevation_deg =
static_cast<float>(available.elevationMax * 180.0 /
M_PI);
248 helios_runtime_error(
"ERROR (PragueSkyModelInterface::getAvailableRanges): Prague model not initialized.");
249 }
catch (
const std::exception &e) {
250 std::ostringstream oss;
251 oss <<
"ERROR (PragueSkyModelInterface::getAvailableRanges): Error querying available data: " << e.what();