/*! \details No detailed. */ SampledWavelengths WavelengthSampler::sampleRandomly( Sampler& sampler, PathState& path_state) noexcept { using zisc::cast; constexpr uint sample_size = SampledWavelengths::size(); constexpr Float inverse_probability = cast<Float>(CoreConfig::spectraSize()) / cast<Float>(sample_size); std::array<uint16, sample_size> wavelengths; for (uint i = 0; i < sample_size; ++i) { const Float offset = sampler.draw1D(path_state); path_state.setDimension(path_state.dimension() + 1); const Float position = cast<Float>(CoreConfig::spectraSize()) * offset; const uint index = cast<uint>(position); const uint16 wavelength = getWavelength(index); wavelengths[i] = wavelength; } std::sort(wavelengths.begin(), wavelengths.end()); SampledWavelengths sampled_wavelengths; for (uint i = 0; i < sample_size; ++i) sampled_wavelengths.set(i, wavelengths[i], inverse_probability); sampled_wavelengths.selectPrimaryWavelength(sampler, path_state); return sampled_wavelengths; }
/*! */ SampledWavelengths WavelengthSampler::sampleRgb( Sampler& sampler, PathState& path_state) noexcept { constexpr uint sample_size = SampledWavelengths::size(); path_state.setDimension(path_state.dimension() + sample_size); SampledWavelengths sampled_wavelengths; sampled_wavelengths.set(0, CoreConfig::blueWavelength(), 1.0); sampled_wavelengths.set(1, CoreConfig::greenWavelength(), 1.0); sampled_wavelengths.set(2, CoreConfig::redWavelength(), 1.0); sampled_wavelengths.selectPrimaryWavelength(sampler, path_state); return sampled_wavelengths; }
/*! \details No detailed. */ SampledWavelengths WavelengthSampler::sampleRegularly( Sampler& sampler, PathState& path_state) noexcept { using zisc::cast; constexpr uint sample_size = SampledWavelengths::size(); constexpr Float interval = cast<Float>(CoreConfig::spectraSize()) / cast<Float>(sample_size); constexpr Float inverse_probability = interval; SampledWavelengths sampled_wavelengths; const Float offset = sampler.draw1D(path_state); for (uint i = 0; i < sample_size; ++i) { path_state.setDimension(path_state.dimension() + 1); const uint index = cast<uint>(interval * (cast<Float>(i) + offset)); const uint16 wavelength = getWavelength(index); sampled_wavelengths.set(i, wavelength, inverse_probability); } sampled_wavelengths.selectPrimaryWavelength(sampler, path_state); return sampled_wavelengths; }