From 30f327b2fd25104916bffe6fe76823f0dbe35a72 Mon Sep 17 00:00:00 2001 From: Samuel Fadel Date: Tue, 29 Sep 2015 14:59:59 -0300 Subject: 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 --- scale.h | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 scale.h (limited to 'scale.h') 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 + +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 -- cgit v1.2.3