00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "RangeMapper.h"
00017
00018 #include <cassert>
00019 #include <cmath>
00020
00021 #include <iostream>
00022
00023 LinearRangeMapper::LinearRangeMapper(int minpos, int maxpos,
00024 float minval, float maxval,
00025 QString unit) :
00026 m_minpos(minpos),
00027 m_maxpos(maxpos),
00028 m_minval(minval),
00029 m_maxval(maxval),
00030 m_unit(unit)
00031 {
00032 assert(m_maxval != m_minval);
00033 assert(m_maxpos != m_minpos);
00034 }
00035
00036 int
00037 LinearRangeMapper::getPositionForValue(float value) const
00038 {
00039 int position = m_minpos +
00040 lrintf(((value - m_minval) / (m_maxval - m_minval))
00041 * (m_maxpos - m_minpos));
00042 if (position < m_minpos) position = m_minpos;
00043 if (position > m_maxpos) position = m_maxpos;
00044
00045
00046 return position;
00047 }
00048
00049 float
00050 LinearRangeMapper::getValueForPosition(int position) const
00051 {
00052 float value = m_minval +
00053 ((float(position - m_minpos) / float(m_maxpos - m_minpos))
00054 * (m_maxval - m_minval));
00055 if (value < m_minval) value = m_minval;
00056 if (value > m_maxval) value = m_maxval;
00057
00058
00059 return value;
00060 }
00061
00062 LogRangeMapper::LogRangeMapper(int minpos, int maxpos,
00063 float minval, float maxval,
00064 QString unit) :
00065 m_minpos(minpos),
00066 m_maxpos(maxpos),
00067 m_unit(unit)
00068 {
00069 convertMinMax(minpos, maxpos, minval, maxval, m_minlog, m_ratio);
00070
00071 std::cerr << "LogRangeMapper: minpos " << minpos << ", maxpos "
00072 << maxpos << ", minval " << minval << ", maxval "
00073 << maxval << ", minlog " << m_minlog << ", ratio " << m_ratio
00074 << ", unit " << unit.toStdString() << std::endl;
00075
00076 assert(m_maxpos != m_minpos);
00077
00078 m_maxlog = (m_maxpos - m_minpos) / m_ratio + m_minlog;
00079 }
00080
00081 void
00082 LogRangeMapper::convertMinMax(int minpos, int maxpos,
00083 float minval, float maxval,
00084 float &minlog, float &ratio)
00085 {
00086 static float thresh = powf(10, -10);
00087 if (minval < thresh) minval = thresh;
00088 minlog = log10f(minval);
00089 ratio = (maxpos - minpos) / (log10f(maxval) - minlog);
00090 }
00091
00092 void
00093 LogRangeMapper::convertRatioMinLog(float ratio, float minlog,
00094 int minpos, int maxpos,
00095 float &minval, float &maxval)
00096 {
00097 minval = powf(10, minlog);
00098 maxval = powf(10, (maxpos - minpos) / ratio + minlog);
00099 }
00100
00101 int
00102 LogRangeMapper::getPositionForValue(float value) const
00103 {
00104 int position = (log10(value) - m_minlog) * m_ratio + m_minpos;
00105 if (position < m_minpos) position = m_minpos;
00106 if (position > m_maxpos) position = m_maxpos;
00107 std::cerr << "LogRangeMapper::getPositionForValue: " << value << " -> "
00108 << position << " (minpos " << m_minpos << ", maxpos " << m_maxpos << ", ratio " << m_ratio << ", minlog " << m_minlog << ")" << std::endl;
00109 return position;
00110 }
00111
00112 float
00113 LogRangeMapper::getValueForPosition(int position) const
00114 {
00115 float value = powf(10, (position - m_minpos) / m_ratio + m_minlog);
00116 std::cerr << "LogRangeMapper::getValueForPosition: " << position << " -> "
00117 << value << " (minpos " << m_minpos << ", maxpos " << m_maxpos << ", ratio " << m_ratio << ", minlog " << m_minlog << ")" << std::endl;
00118 return value;
00119 }
00120