diff --git a/apps/statistics/data.cpp b/apps/statistics/data.cpp index e362f2014..db1c5667b 100644 --- a/apps/statistics/data.cpp +++ b/apps/statistics/data.cpp @@ -1,4 +1,5 @@ #include "data.h" +#include namespace Statistics { @@ -45,4 +46,56 @@ void Data::deletePairAtIndex(int index) { m_sizes[m_numberOfPairs] = 1; } +int Data::sizeOfValuesBetweenBounds(float lowerBound, float upperBound) const { + int result = 0; + for (int k = 0; k < m_numberOfPairs; k++) { + if (m_values[k] < upperBound && lowerBound <= m_values[k]) { + result += m_sizes[k]; + } + } + return result; +} + +float Data::xMin() { + float valueMin = FLT_MAX; + for (int k = 0; k < m_numberOfPairs; k++) { + if (m_values[k] < valueMin) { + valueMin = m_values[k]; + } + } + return valueMin; +} + +float Data::xMax() { + float valueMax = -FLT_MAX; + for (int k = 0; k < m_numberOfPairs; k++) { + if (m_values[k] > valueMax) { + valueMax = m_values[k]; + } + } + float valueMin = xMin(); + if (valueMax - valueMin > k_maxRangeValue) { + valueMax = valueMin + 10.0f; + } + return valueMax; +} + +float Data::yMin() { + return 0.0f; +} + +float Data::yMax() { + float sizeMax = -FLT_MAX; + for (int k = 0; k < m_numberOfPairs; k++) { + if (m_sizes[k] > sizeMax) { + sizeMax = m_sizes[k]; + } + } + return sizeMax; +} + +float Data::xGridUnit() { + return computeGridUnit(Axis::X); +} + } diff --git a/apps/statistics/data.h b/apps/statistics/data.h index 1876e1e2b..61b6bdc40 100644 --- a/apps/statistics/data.h +++ b/apps/statistics/data.h @@ -1,9 +1,11 @@ #ifndef STATISTICS_DATA_H #define STATISTICS_DATA_H +#include "../curve_view_window.h" + namespace Statistics { -class Data { +class Data : public CurveViewWindow { public: Data(); // Delete the implicit copy constructor: the object is heavy @@ -14,9 +16,17 @@ public: void setValueAtIndex(float value, int index); void setSizeAtIndex(int size, int index); void deletePairAtIndex(int index); + int sizeOfValuesBetweenBounds(float lowerBound, float upperBound) const; + float xMin() override; + // if the range of value is to wide, value max returns valueMin + 10 + float xMax() override; + float yMin() override; + float yMax() override; + float xGridUnit() override; // TODO: decide the max number of elements after optimization constexpr static int k_maxNumberOfPairs = 500; private: + constexpr static int k_maxRangeValue = 320; int m_sizes[k_maxNumberOfPairs]; float m_values[k_maxNumberOfPairs]; int m_numberOfPairs;