From 44aab6700744e2a84e0fbab8ce63b1bdb31990bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Mon, 17 Oct 2016 15:59:54 +0200 Subject: [PATCH] [apps/graph/values] Change interval model Change-Id: Iae085abd6bc975559b3204ef19bc25fe4eb4aba0 --- apps/graph/app.cpp | 2 +- apps/graph/values/interval.cpp | 44 +++++++++++++++++++------ apps/graph/values/interval.h | 13 ++++++-- apps/graph/values/values_controller.cpp | 4 ++- 4 files changed, 48 insertions(+), 15 deletions(-) diff --git a/apps/graph/app.cpp b/apps/graph/app.cpp index d18fea4bb..709e9f5ee 100644 --- a/apps/graph/app.cpp +++ b/apps/graph/app.cpp @@ -11,7 +11,7 @@ App::App(::Context * context) : m_listController(ListController(nullptr, &m_functionStore)), m_listStackViewController(StackViewController(&m_tabViewController, &m_listController)), m_graphController(GraphController(nullptr, &m_functionStore, &m_evaluateContext)), - m_valuesController(ValuesController(nullptr, &m_functionStore, &m_evaluateContext)), + m_valuesController(nullptr, &m_functionStore, &m_evaluateContext), m_valuesStackViewController(StackViewController(&m_tabViewController, &m_valuesController)), m_tabViewController(&m_inputViewController, &m_listStackViewController, &m_graphController, &m_valuesStackViewController), m_inputViewController(this, &m_tabViewController) diff --git a/apps/graph/values/interval.cpp b/apps/graph/values/interval.cpp index 46da19820..0583f1986 100644 --- a/apps/graph/values/interval.cpp +++ b/apps/graph/values/interval.cpp @@ -3,24 +3,23 @@ namespace Graph { -Interval::Interval(float start, float end, float step) : - m_start(start), - m_end(end), - m_step(step) +Interval::Interval() : + m_start(0), + m_end(0), + m_step(0), + m_needCompute(false) { } int Interval::numberOfElements() { - if (m_start > m_end) { - return 0; - } else { - return 1 + (m_end - m_start)/m_step; - } + computeElements(); + return m_numberOfElements; } float Interval::element(int i) { assert(i >= 0 && i < numberOfElements()); - return m_start + i*m_step; + computeElements(); + return m_intervalBuffer[i]; } float Interval::start() { @@ -37,14 +36,39 @@ float Interval::step() { void Interval::setStart(float f) { m_start = f; + m_needCompute = true; } void Interval::setEnd(float f) { m_end = f; + m_needCompute = true; } void Interval::setStep(float f) { m_step = f; + m_needCompute = true; +} + +void Interval::setElement(int i, float f) { + assert(i < numberOfElements()); + computeElements(); + m_intervalBuffer[i] = f; +} + +void Interval::computeElements() { + if (!m_needCompute) { + return; + } + if ( m_start > m_end) { + m_numberOfElements = 0; + } else { + m_numberOfElements = m_step > 0 ? 1 + (m_end - m_start)/m_step : k_maxNumberOfElements; + m_numberOfElements = m_numberOfElements > k_maxNumberOfElements ? k_maxNumberOfElements : m_numberOfElements; + } + for (int i = 0; i < m_numberOfElements; i += 1) { + m_intervalBuffer[i] = m_start + i * m_step; + } + m_needCompute = false; } } diff --git a/apps/graph/values/interval.h b/apps/graph/values/interval.h index 7bc7f84b3..d0097a70d 100644 --- a/apps/graph/values/interval.h +++ b/apps/graph/values/interval.h @@ -5,8 +5,9 @@ namespace Graph { class Interval { public: - Interval(float start, float end, float step); - + Interval(); + // Delete the implicit copy constructor: the object is heavy + Interval(const Interval&) = delete; int numberOfElements(); float element(int i); float start(); @@ -15,11 +16,17 @@ public: void setStart(float f); void setEnd(float f); void setStep(float f); - + void setElement(int i, float f); private: + // TODO: decide the max number of elements after optimization + constexpr static int k_maxNumberOfElements = 500; + void computeElements(); + int m_numberOfElements; + float m_intervalBuffer[k_maxNumberOfElements]; float m_start; float m_end; float m_step; + bool m_needCompute; }; } diff --git a/apps/graph/values/values_controller.cpp b/apps/graph/values/values_controller.cpp index 0e2ccb2ad..e1b5a75ec 100644 --- a/apps/graph/values/values_controller.cpp +++ b/apps/graph/values/values_controller.cpp @@ -10,7 +10,6 @@ ValuesController::ValuesController(Responder * parentResponder, FunctionStore * m_activeCellY(-1), m_functionStore(functionStore), m_evaluateContext(evaluateContext), - m_interval(Interval(-1.0f, 1.0f, 0.25f)), m_parameterController(ValuesParameterController(this, &m_interval)), m_setIntervalButton(Button(this, "Regler l'intervalle",Invocation([](void * context, void * sender) { ValuesController * valuesController = (ValuesController *) context; @@ -18,6 +17,9 @@ ValuesController::ValuesController(Responder * parentResponder, FunctionStore * stack->push(valuesController->parameterController()); }, this))) { + m_interval.setStart(0); + m_interval.setEnd(10); + m_interval.setStep(1); } const char * ValuesController::title() const {