RangeMapper.cpp

Go to the documentation of this file.
00001 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
00002 
00003 /*
00004     Sonic Visualiser
00005     An audio file viewer and annotation editor.
00006     Centre for Digital Music, Queen Mary, University of London.
00007     This file copyright 2006 QMUL.
00008     
00009     This program is free software; you can redistribute it and/or
00010     modify it under the terms of the GNU General Public License as
00011     published by the Free Software Foundation; either version 2 of the
00012     License, or (at your option) any later version.  See the file
00013     COPYING included with this distribution for more information.
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 //    std::cerr << "LinearRangeMapper::getPositionForValue: " << value << " -> "
00045 //              << position << " (minpos " << m_minpos << ", maxpos " << m_maxpos << ", minval " << m_minval << ", maxval " << m_maxval << ")" << std::endl;
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 //    std::cerr << "LinearRangeMapper::getValueForPosition: " << position << " -> "
00058 //              << value << " (minpos " << m_minpos << ", maxpos " << m_maxpos << ", minval " << m_minval << ", maxval " << m_maxval << ")" << std::endl;
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 

Generated on Wed Feb 20 15:45:27 2008 for SonicVisualiser by  doxygen 1.5.1