aboutsummaryrefslogtreecommitdiff
path: root/scale.h
diff options
context:
space:
mode:
Diffstat (limited to 'scale.h')
-rw-r--r--scale.h81
1 files changed, 81 insertions, 0 deletions
diff --git a/scale.h b/scale.h
new file mode 100644
index 0000000..bfe18ae
--- /dev/null
+++ b/scale.h
@@ -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