diff options
author | Samuel Fadel <samuelfadel@gmail.com> | 2015-09-29 14:59:59 -0300 |
---|---|---|
committer | Samuel Fadel <samuelfadel@gmail.com> | 2015-09-29 14:59:59 -0300 |
commit | 30f327b2fd25104916bffe6fe76823f0dbe35a72 (patch) | |
tree | 3ceb449cbd3b6e8965e891efe3ea6b36183a6b10 /scale.h | |
parent | 56c9ebb2e41bd0487199ed95838cd9e1c1d9dd8d (diff) |
Inital history graph implementation and using linear scales where applicable.
- geometry.h for geometry calculation functions
- scale.h for implementations of scales (currently only the linear scale)
- updated main_view.qml for the new HistoryGraph component
- HistoryGraph displays each subsample used as a mini scatterplot (no colors
currently)
- Scatterplot now uses scale.h for transformations
- Code cleanup and some bug fixes
Diffstat (limited to 'scale.h')
-rw-r--r-- | scale.h | 81 |
1 files changed, 81 insertions, 0 deletions
@@ -0,0 +1,81 @@ +#ifndef SCALE_H +#define SCALE_H + +#include <algorithm> + +class Scale +{ +public: + Scale(float domainMin, float domainMax, float rangeMin, float rangeMax) + : m_domainMin(domainMin) + , m_domainMax(domainMax) + , m_rangeMin(rangeMin) + , m_rangeMax(rangeMax) + { + valuesUpdated(); + } + + virtual ~Scale() {} + + void setRangeMin(float rangeMin) { m_rangeMin = rangeMin; valuesUpdated(); } + void setRangeMax(float rangeMax) { m_rangeMax = rangeMax; valuesUpdated(); } + void setDomainMin(float domainMin) { m_domainMin = domainMin; valuesUpdated(); } + void setDomainMax(float domainMax) { m_domainMax = domainMax; valuesUpdated(); } + + void setRange(float rangeMin, float rangeMax) + { + m_rangeMin = rangeMin; + m_rangeMax = rangeMax; + valuesUpdated(); + } + + void setDomain(float domainMin, float domainMax) + { + m_domainMin = domainMin; + m_domainMax = domainMax; + valuesUpdated(); + } + + void reverse() + { + std::swap(m_rangeMin, m_domainMin); + std::swap(m_rangeMax, m_domainMax); + valuesUpdated(); + } + + virtual float operator()(float value) const = 0; + +protected: + // Called when internal values change + virtual void valuesUpdated() {} + + float m_domainMin, m_domainMax; + float m_rangeMin, m_rangeMax; +}; + +class LinearScale + : public Scale +{ +public: + LinearScale(float domainMin, float domainMax, float rangeMin, float rangeMax) + : Scale(domainMin, domainMax, rangeMin, rangeMax) + { + valuesUpdated(); + } + + virtual float operator()(float value) const + { + return (value - m_domainMin) * m_transformSlope + m_rangeMin; + } + +protected: + virtual void valuesUpdated() + { + m_transformSlope = (m_rangeMax - m_rangeMin) / (m_domainMax - m_domainMin); + } + +private: + float m_transformSlope; +}; + +#endif // SCALE_H |