00001 #ifndef _RESPONSE_CURVE_H_
00002 #define _RESPONSE_CURVE_H_
00003
00004 #include "AbstractFunction.h"
00005
00006 namespace luma
00007 {
00008 namespace numbers
00009 {
00010
00023 template <class T, unsigned int n>
00024 class ResponseCurve : public AbstractFunction<T>
00025 {
00026 public:
00037 ResponseCurve(T inputMin, T inputMax, T outputSamples[n]);
00038
00052 T operator()(const T input) const;
00053
00054 inline public T getInputMin() const;
00055 inline public T getInputMax() const;
00056
00057 private:
00058 T mInputMin;
00059 T mInputMax;
00060 T mOutputSamples[n];
00061
00066 T mPeriod;
00067 };
00068
00069 template <class T, unsigned int n>
00070 ResponseCurve<T, n>::ResponseCurve(T inputMin, T inputMax, T outputSamples[n]):
00071 mInputMin(inputMin),
00072 mInputMax(inputMax),
00073 mPeriod((inputMax - inputMin) / (n - 1))
00074 {
00075 for(unsigned int i = 0; i < n; i++)
00076 {
00077 mOutputSamples[i] = outputSamples[i];
00078 }
00079 }
00080
00081 template <class T, unsigned int n>
00082 T ResponseCurve<T, n>::operator()(const T input) const
00083 {
00084 if(input <= mInputMin)
00085 {
00086 return mOutputSamples[0];
00087 }
00088
00089 if(input >= mInputMax)
00090 {
00091 return mOutputSamples[n - 1];
00092 }
00093
00094 unsigned int index = (int) ((input - mInputMin)/(mPeriod));
00095 T inputSampleMin = mInputMin + mPeriod*index;
00096
00097 return lerp(input, inputSampleMin, inputSampleMin + mPeriod, mOutputSamples[index], mOutputSamples[index + 1]);
00098 }
00099
00100 template <class T, unsigned int n>
00101 T ResponseCurve<T, n>::getInputMin() const
00102 {
00103 return mInputMin;
00104 }
00105
00106 template <class T, unsigned int n>
00107 T ResponseCurve<T, n>::getInputMax() const
00108 {
00109 return mInputMax;
00110 }
00111
00112 }}
00113
00114 #endif //_RESPONSE_CURVE_H_