annotate base/RangeMapper.cpp @ 71:a1ce307bab17

update data.pro
author lbajardsilogic
date Wed, 13 Jun 2007 13:44:59 +0000
parents fc9323a41f5a
children be6f263fa0ab
rev   line source
lbajardsilogic@0 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
lbajardsilogic@0 2
lbajardsilogic@0 3 /*
lbajardsilogic@0 4 Sonic Visualiser
lbajardsilogic@0 5 An audio file viewer and annotation editor.
lbajardsilogic@0 6 Centre for Digital Music, Queen Mary, University of London.
lbajardsilogic@0 7 This file copyright 2006 QMUL.
lbajardsilogic@0 8
lbajardsilogic@0 9 This program is free software; you can redistribute it and/or
lbajardsilogic@0 10 modify it under the terms of the GNU General Public License as
lbajardsilogic@0 11 published by the Free Software Foundation; either version 2 of the
lbajardsilogic@0 12 License, or (at your option) any later version. See the file
lbajardsilogic@0 13 COPYING included with this distribution for more information.
lbajardsilogic@0 14 */
lbajardsilogic@0 15
lbajardsilogic@0 16 #include "system/System.h"
lbajardsilogic@0 17 #include "RangeMapper.h"
lbajardsilogic@0 18
lbajardsilogic@0 19 #include <cassert>
lbajardsilogic@0 20 #include <cmath>
lbajardsilogic@0 21
lbajardsilogic@0 22 #include <iostream>
lbajardsilogic@0 23
lbajardsilogic@0 24 LinearRangeMapper::LinearRangeMapper(int minpos, int maxpos,
lbajardsilogic@0 25 float minval, float maxval,
lbajardsilogic@0 26 QString unit) :
lbajardsilogic@0 27 m_minpos(minpos),
lbajardsilogic@0 28 m_maxpos(maxpos),
lbajardsilogic@0 29 m_minval(minval),
lbajardsilogic@0 30 m_maxval(maxval),
lbajardsilogic@0 31 m_unit(unit)
lbajardsilogic@0 32 {
lbajardsilogic@0 33 assert(m_maxval != m_minval);
lbajardsilogic@0 34 assert(m_maxpos != m_minpos);
lbajardsilogic@0 35 }
lbajardsilogic@0 36
lbajardsilogic@0 37 int
lbajardsilogic@0 38 LinearRangeMapper::getPositionForValue(float value) const
lbajardsilogic@0 39 {
lbajardsilogic@0 40 int position = m_minpos +
lbajardsilogic@0 41 lrintf(((value - m_minval) / (m_maxval - m_minval))
lbajardsilogic@0 42 * (m_maxpos - m_minpos));
lbajardsilogic@0 43 if (position < m_minpos) position = m_minpos;
lbajardsilogic@0 44 if (position > m_maxpos) position = m_maxpos;
lbajardsilogic@0 45 // std::cerr << "LinearRangeMapper::getPositionForValue: " << value << " -> "
lbajardsilogic@0 46 // << position << " (minpos " << m_minpos << ", maxpos " << m_maxpos << ", minval " << m_minval << ", maxval " << m_maxval << ")" << std::endl;
lbajardsilogic@0 47 return position;
lbajardsilogic@0 48 }
lbajardsilogic@0 49
lbajardsilogic@0 50 float
lbajardsilogic@0 51 LinearRangeMapper::getValueForPosition(int position) const
lbajardsilogic@0 52 {
lbajardsilogic@0 53 float value = m_minval +
lbajardsilogic@0 54 ((float(position - m_minpos) / float(m_maxpos - m_minpos))
lbajardsilogic@0 55 * (m_maxval - m_minval));
lbajardsilogic@0 56 if (value < m_minval) value = m_minval;
lbajardsilogic@0 57 if (value > m_maxval) value = m_maxval;
lbajardsilogic@0 58 // std::cerr << "LinearRangeMapper::getValueForPosition: " << position << " -> "
lbajardsilogic@0 59 // << value << " (minpos " << m_minpos << ", maxpos " << m_maxpos << ", minval " << m_minval << ", maxval " << m_maxval << ")" << std::endl;
lbajardsilogic@0 60 return value;
lbajardsilogic@0 61 }
lbajardsilogic@0 62
lbajardsilogic@0 63 LogRangeMapper::LogRangeMapper(int minpos, int maxpos,
lbajardsilogic@0 64 float ratio, float minlog,
lbajardsilogic@0 65 QString unit) :
lbajardsilogic@0 66 m_minpos(minpos),
lbajardsilogic@0 67 m_maxpos(maxpos),
lbajardsilogic@0 68 m_ratio(ratio),
lbajardsilogic@0 69 m_minlog(minlog),
lbajardsilogic@0 70 m_unit(unit)
lbajardsilogic@0 71 {
lbajardsilogic@0 72 assert(m_maxpos != m_minpos);
lbajardsilogic@0 73
lbajardsilogic@0 74 m_maxlog = (m_maxpos - m_minpos) / m_ratio + m_minlog;
lbajardsilogic@0 75 }
lbajardsilogic@0 76
lbajardsilogic@0 77 int
lbajardsilogic@0 78 LogRangeMapper::getPositionForValue(float value) const
lbajardsilogic@0 79 {
lbajardsilogic@0 80 float mapped = m_ratio * log10(value);
lbajardsilogic@0 81 int position = lrintf(((mapped - m_minlog) / (m_maxlog - m_minlog))
lbajardsilogic@0 82 * (m_maxpos - m_minpos));
lbajardsilogic@0 83 if (position < m_minpos) position = m_minpos;
lbajardsilogic@0 84 if (position > m_maxpos) position = m_maxpos;
lbajardsilogic@0 85 // std::cerr << "LogRangeMapper::getPositionForValue: " << value << " -> "
lbajardsilogic@0 86 // << position << " (minpos " << m_minpos << ", maxpos " << m_maxpos << ", ratio " << m_ratio << ", minlog " << m_minlog << ")" << std::endl;
lbajardsilogic@0 87 return position;
lbajardsilogic@0 88 }
lbajardsilogic@0 89
lbajardsilogic@0 90 float
lbajardsilogic@0 91 LogRangeMapper::getValueForPosition(int position) const
lbajardsilogic@0 92 {
lbajardsilogic@0 93 float value = powf(10, (position - m_minpos) / m_ratio + m_minlog);
lbajardsilogic@0 94 // std::cerr << "LogRangeMapper::getValueForPosition: " << position << " -> "
lbajardsilogic@0 95 // << value << " (minpos " << m_minpos << ", maxpos " << m_maxpos << ", ratio " << m_ratio << ", minlog " << m_minlog << ")" << std::endl;
lbajardsilogic@0 96 return value;
lbajardsilogic@0 97 }
lbajardsilogic@0 98