annotate base/RangeMapper.cpp @ 319:3ff8f571da09

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