/// <summary> /// Negate a spectrum /// </summary> /// <param name="s">the spectrum to negate</param> /// <returns>the negated spectrum</returns> public static CoefficientSpectrum operator -(CoefficientSpectrum s) { var resultSpectrum = new CoefficientSpectrum(s._nsamples); for (var i = 0; i < s._nsamples; ++i) { resultSpectrum._samples[i] = -resultSpectrum._samples[i]; } return(resultSpectrum); }
/// <summary> /// Add a spectrum and a value /// </summary> /// <param name="s1">the left spectrum</param> /// <param name="value"></param> /// <returns>the new spectrum</returns> public static CoefficientSpectrum operator +(CoefficientSpectrum s1, float value) { var resultSpectrum = new CoefficientSpectrum(s1._nsamples); for (var i = 0; i < s1._nsamples; ++i) { resultSpectrum._samples[i] = s1._samples[i] + value; } return(resultSpectrum); }
/// <summary> /// Clamp a spectrum /// </summary> /// <param name="s">the spectrum to clamp</param> /// <param name="low">the minimum value</param> /// <param name="high">the maximum value</param> /// <returns>the clamped spectrum</returns> public static CoefficientSpectrum Clamp(CoefficientSpectrum s, float low = 0, float high = float.PositiveInfinity) { var result = new CoefficientSpectrum(s._nsamples); for (var i = 0; i < s._nsamples; ++i) { result._samples[i] = result._samples[i] < low ? low : (result._samples[i] > high ? high : low); } return(result); }
/// <summary> /// Multiply two spectrums together. /// </summary> /// <param name="s1">the left spectrum</param> /// <param name="s2">the right spectrum</param> /// <returns>the new spectrum</returns> public static CoefficientSpectrum operator *(CoefficientSpectrum s1, CoefficientSpectrum s2) { if (s1._nsamples != s2._nsamples) { throw new Exception("Spectrums do not have the same number of samples"); } var resultSpectrum = new CoefficientSpectrum(s1._nsamples); for (var i = 0; i < s1._nsamples; ++i) { resultSpectrum._samples[i] = s1._samples[i] * s2._samples[i]; } return(resultSpectrum); }
/// <summary> /// Perform linear interpolation on two spectrums /// </summary> /// <param name="s1">the first spectrum</param> /// <param name="s2">the second spectrum</param> /// <param name="t">the time value</param> /// <returns>the new spectrum</returns> public CoefficientSpectrum Lerp(CoefficientSpectrum s1, CoefficientSpectrum s2, float t) { return(s1 * (1f - t) + s2 * t); }