Numworks Epsilon  1.4.1
Graphing Calculator Operating System
function_graph_controller.cpp
Go to the documentation of this file.
3 #include <assert.h>
4 #include <cmath>
5 #include <float.h>
6 
7 using namespace Poincare;
8 
9 namespace Shared {
10 
11 FunctionGraphController::FunctionGraphController(Responder * parentResponder, ButtonRowController * header, InteractiveCurveViewRange * interactiveRange, CurveView * curveView, CurveViewCursor * cursor, int * indexFunctionSelectedByCursor, uint32_t * modelVersion, uint32_t * rangeVersion, Expression::AngleUnit * angleUnitVersion) :
12  InteractiveCurveViewController(parentResponder, header, interactiveRange, curveView, cursor, modelVersion, rangeVersion),
13  m_initialisationParameterController(this, interactiveRange),
14  m_angleUnitVersion(angleUnitVersion),
15  m_indexFunctionSelectedByCursor(indexFunctionSelectedByCursor)
16 {
17 }
18 
20  if (functionStore()->numberOfActiveFunctions() == 0) {
21  return true;
22  }
23  return false;
24 }
25 
27  return &m_initialisationParameterController;
28 }
29 
31  functionGraphView()->setCursorView(cursorView());
32  functionGraphView()->setBannerView(bannerView());
33  functionGraphView()->setAreaHighlight(NAN,NAN);
34 
35  if (functionGraphView()->context() == nullptr) {
37  functionGraphView()->setContext(myApp->localContext());
38  }
39  Expression::AngleUnit newAngleUnitVersion = Preferences::sharedPreferences()->angleUnit();
40  if (*m_angleUnitVersion != newAngleUnitVersion) {
41  *m_angleUnitVersion = newAngleUnitVersion;
43  }
45 }
46 
49  curveParameterController()->setFunction(f);
51  stack->push(curveParameterController());
52  return true;
53 }
54 
56  *m_indexFunctionSelectedByCursor = functionIndex;
57 }
58 
60  if (functionStore()->numberOfActiveFunctions() == 0) {
61  return;
62  }
64  reloadBannerViewForCursorOnFunction(m_cursor, f, functionStore()->symbol());
65 }
66 
67 InteractiveCurveViewRangeDelegate::Range FunctionGraphController::computeYRange(InteractiveCurveViewRange * interactiveCurveViewRange) {
69  float min = FLT_MAX;
70  float max = -FLT_MAX;
71  float xMin = interactiveCurveViewRange->xMin();
72  float xMax = interactiveCurveViewRange->xMax();
73  if (functionStore()->numberOfActiveFunctions() <= 0) {
75  range.min = xMin;
76  range.max = xMax;
77  return range;
78  }
79  for (int i=0; i<functionStore()->numberOfActiveFunctions(); i++) {
80  Function * f = functionStore()->activeFunctionAtIndex(i);
81  float y = 0.0f;
82  for (int j = 0; j <= curveView()->resolution(); j++) {
83  float x = xMin+(xMax-xMin)*j/curveView()->resolution();
84  y = f->evaluateAtAbscissa(x, myApp->localContext());
85  if (!std::isnan(y) && !std::isinf(y)) {
86  min = min < y ? min : y;
87  max = max > y ? max : y;
88  }
89  }
90  }
91  InteractiveCurveViewRangeDelegate::Range range;
92  range.min = min;
93  range.max = max;
94  return range;
95 }
96 
97 float FunctionGraphController::addMargin(float x, float range, bool isMin) {
98  float ratio = isMin ? -k_displayBottomMarginRatio : k_displayTopMarginRatio;
99  return x+ratio*range;
100 }
101 
102 void FunctionGraphController::initRangeParameters() {
106 }
107 
108 bool FunctionGraphController::moveCursorVertically(int direction) {
109  Function * actualFunction = functionStore()->activeFunctionAtIndex(indexFunctionSelectedByCursor());
110  TextFieldDelegateApp * myApp = (TextFieldDelegateApp *)app();
111  double y = actualFunction->evaluateAtAbscissa(m_cursor->x(), myApp->localContext());
112  Function * nextFunction = actualFunction;
113  double nextY = direction > 0 ? DBL_MAX : -DBL_MAX;
114  for (int i = 0; i < functionStore()->numberOfActiveFunctions(); i++) {
115  Function * f = functionStore()->activeFunctionAtIndex(i);
116  double newY = f->evaluateAtAbscissa(m_cursor->x(), myApp->localContext());
117  bool isNextFunction = direction > 0 ? (newY > y && newY < nextY) : (newY < y && newY > nextY);
118  if (isNextFunction) {
120  nextY = newY;
121  nextFunction = f;
122  }
123  }
124  if (nextFunction == actualFunction) {
125  return false;
126  }
127  m_cursor->moveTo(m_cursor->x(), nextY);
129  return true;
130 }
131 
132 CurveView * FunctionGraphController::curveView() {
133  return functionGraphView();
134 }
135 
136 uint32_t FunctionGraphController::modelVersion() {
137  return functionStore()->storeChecksum();
138 }
139 
140 uint32_t FunctionGraphController::rangeVersion() {
142 }
143 
144 bool FunctionGraphController::isCursorVisible() {
146 }
147 
148 }
virtual StackViewController * stackController() const
ViewController * initialisationParameterController() override
#define NAN
Definition: math.h:30
#define isinf(x)
Definition: math.h:44
void(* Function)(const char *input)
Definition: command.h:11
void push(ViewController *vc, KDColor textColor=Palette::SubTab, KDColor backgroundColor=KDColorWhite, KDColor separatorColor=Palette::GreyBright)
void setBannerView(View *bannerView)
Definition: curve_view.cpp:71
float resolution() const
Definition: curve_view.cpp:83
static constexpr float k_cursorBottomMarginRatio
virtual Poincare::Context * localContext()
#define DBL_MAX
Definition: float.h:9
void reloadBannerViewForCursorOnFunction(CurveViewCursor *cursor, Function *function, char symbol)
#define FLT_MAX
Definition: float.h:6
unsigned int uint32_t
Definition: stdint.h:6
void setAreaHighlight(float start, float end)
void moveTo(double x, double y)
#define isnan(x)
Definition: math.h:43
virtual uint32_t storeChecksum()=0
virtual BannerView * bannerView()=0
bool isCursorVisible(float topMarginRatio, float rightMarginRatio, float bottomMarginRation, float leftMarginRation)
void panToMakePointVisible(float x, float y, float topMarginRatio, float rightMarginRatio, float bottomMarginRation, float leftMarginRation)
virtual Function * activeFunctionAtIndex(int i)
virtual float evaluateAtAbscissa(float x, Poincare::Context *context) const
Definition: function.h:30
void setCursorView(View *cursorView)
Definition: curve_view.cpp:64
void setContext(Poincare::Context *context)
virtual InteractiveCurveViewRange * interactiveCurveViewRange()=0
App * app()
Definition: responder.cpp:77
virtual void selectFunctionWithCursor(int functionIndex)
static constexpr float k_cursorTopMarginRatio