Mercurial > hg > svcore
comparison base/RangeMapper.cpp @ 879:eb6b6a88faed
Unit-test RangeMapper, fix a couple of bugs
author | Chris Cannam |
---|---|
date | Fri, 31 Jan 2014 13:39:37 +0000 |
parents | e802e550a1f2 |
children | b4787b595db3 |
comparison
equal
deleted
inserted
replaced
862:786ee8d1f30e | 879:eb6b6a88faed |
---|---|
41 int position = m_minpos + | 41 int position = m_minpos + |
42 lrintf(((value - m_minval) / (m_maxval - m_minval)) | 42 lrintf(((value - m_minval) / (m_maxval - m_minval)) |
43 * (m_maxpos - m_minpos)); | 43 * (m_maxpos - m_minpos)); |
44 if (position < m_minpos) position = m_minpos; | 44 if (position < m_minpos) position = m_minpos; |
45 if (position > m_maxpos) position = m_maxpos; | 45 if (position > m_maxpos) position = m_maxpos; |
46 // SVDEBUG << "LinearRangeMapper::getPositionForValue: " << value << " -> " | 46 if (m_inverted) return m_maxpos - (position - m_minpos); |
47 // << position << " (minpos " << m_minpos << ", maxpos " << m_maxpos << ", minval " << m_minval << ", maxval " << m_maxval << ")" << endl; | |
48 if (m_inverted) return m_maxpos - position; | |
49 else return position; | 47 else return position; |
50 } | 48 } |
51 | 49 |
52 float | 50 float |
53 LinearRangeMapper::getValueForPosition(int position) const | 51 LinearRangeMapper::getValueForPosition(int position) const |
54 { | 52 { |
55 if (m_inverted) position = m_maxpos - position; | 53 if (m_inverted) position = m_maxpos - (position - m_minpos); |
54 if (position < m_minpos) position = m_minpos; | |
55 if (position > m_maxpos) position = m_maxpos; | |
56 float value = m_minval + | 56 float value = m_minval + |
57 ((float(position - m_minpos) / float(m_maxpos - m_minpos)) | 57 ((float(position - m_minpos) / float(m_maxpos - m_minpos)) |
58 * (m_maxval - m_minval)); | 58 * (m_maxval - m_minval)); |
59 if (value < m_minval) value = m_minval; | |
60 if (value > m_maxval) value = m_maxval; | |
61 // SVDEBUG << "LinearRangeMapper::getValueForPosition: " << position << " -> " | |
62 // << value << " (minpos " << m_minpos << ", maxpos " << m_maxpos << ", minval " << m_minval << ", maxval " << m_maxval << ")" << endl; | |
63 return value; | 59 return value; |
64 } | 60 } |
65 | 61 |
66 LogRangeMapper::LogRangeMapper(int minpos, int maxpos, | 62 LogRangeMapper::LogRangeMapper(int minpos, int maxpos, |
67 float minval, float maxval, | 63 float minval, float maxval, |
71 m_unit(unit), | 67 m_unit(unit), |
72 m_inverted(inverted) | 68 m_inverted(inverted) |
73 { | 69 { |
74 convertMinMax(minpos, maxpos, minval, maxval, m_minlog, m_ratio); | 70 convertMinMax(minpos, maxpos, minval, maxval, m_minlog, m_ratio); |
75 | 71 |
76 cerr << "LogRangeMapper: minpos " << minpos << ", maxpos " | 72 // cerr << "LogRangeMapper: minpos " << minpos << ", maxpos " |
77 << maxpos << ", minval " << minval << ", maxval " | 73 // << maxpos << ", minval " << minval << ", maxval " |
78 << maxval << ", minlog " << m_minlog << ", ratio " << m_ratio | 74 // << maxval << ", minlog " << m_minlog << ", ratio " << m_ratio |
79 << ", unit " << unit << endl; | 75 // << ", unit " << unit << endl; |
80 | 76 |
81 assert(m_maxpos != m_minpos); | 77 assert(m_maxpos != m_minpos); |
82 | 78 |
83 m_maxlog = (m_maxpos - m_minpos) / m_ratio + m_minlog; | 79 m_maxlog = (m_maxpos - m_minpos) / m_ratio + m_minlog; |
80 | |
81 // cerr << "LogRangeMapper: maxlog = " << m_maxlog << endl; | |
84 } | 82 } |
85 | 83 |
86 void | 84 void |
87 LogRangeMapper::convertMinMax(int minpos, int maxpos, | 85 LogRangeMapper::convertMinMax(int minpos, int maxpos, |
88 float minval, float maxval, | 86 float minval, float maxval, |
104 } | 102 } |
105 | 103 |
106 int | 104 int |
107 LogRangeMapper::getPositionForValue(float value) const | 105 LogRangeMapper::getPositionForValue(float value) const |
108 { | 106 { |
109 int position = (log10(value) - m_minlog) * m_ratio + m_minpos; | 107 int position = lrintf((log10(value) - m_minlog) * m_ratio) + m_minpos; |
110 if (position < m_minpos) position = m_minpos; | 108 if (position < m_minpos) position = m_minpos; |
111 if (position > m_maxpos) position = m_maxpos; | 109 if (position > m_maxpos) position = m_maxpos; |
112 // SVDEBUG << "LogRangeMapper::getPositionForValue: " << value << " -> " | 110 // cerr << "LogRangeMapper::getPositionForValue: " << value << " -> " |
113 // << position << " (minpos " << m_minpos << ", maxpos " << m_maxpos << ", ratio " << m_ratio << ", minlog " << m_minlog << ")" << endl; | 111 // << position << " (minpos " << m_minpos << ", maxpos " << m_maxpos << ", ratio " << m_ratio << ", minlog " << m_minlog << ")" << endl; |
114 if (m_inverted) return m_maxpos - position; | 112 if (m_inverted) return m_maxpos - (position - m_minpos); |
115 else return position; | 113 else return position; |
116 } | 114 } |
117 | 115 |
118 float | 116 float |
119 LogRangeMapper::getValueForPosition(int position) const | 117 LogRangeMapper::getValueForPosition(int position) const |
120 { | 118 { |
121 if (m_inverted) position = m_maxpos - position; | 119 if (m_inverted) position = m_maxpos - (position - m_minpos); |
120 if (position < m_minpos) position = m_minpos; | |
121 if (position > m_maxpos) position = m_maxpos; | |
122 float value = powf(10, (position - m_minpos) / m_ratio + m_minlog); | 122 float value = powf(10, (position - m_minpos) / m_ratio + m_minlog); |
123 // SVDEBUG << "LogRangeMapper::getValueForPosition: " << position << " -> " | 123 // cerr << "LogRangeMapper::getValueForPosition: " << position << " -> " |
124 // << value << " (minpos " << m_minpos << ", maxpos " << m_maxpos << ", ratio " << m_ratio << ", minlog " << m_minlog << ")" << endl; | 124 // << value << " (minpos " << m_minpos << ", maxpos " << m_maxpos << ", ratio " << m_ratio << ", minlog " << m_minlog << ")" << endl; |
125 return value; | 125 return value; |
126 } | 126 } |
127 | 127 |