Numworks Epsilon  1.4.1
Graphing Calculator Operating System
curve_view.h
Go to the documentation of this file.
1 #ifndef SHARED_CURVE_VIEW_H
2 #define SHARED_CURVE_VIEW_H
3 
4 #include <escher.h>
5 #include <poincare.h>
6 #include <cmath>
7 #include "curve_view_range.h"
8 #include "curve_view_cursor.h"
9 #include "banner_view.h"
10 
11 namespace Shared {
12 
13 class CurveView : public View {
14 public:
15  typedef float (*EvaluateModelWithParameter)(float t, void * model, void * context);
16  enum class Axis {
17  Horizontal = 0,
18  Vertical = 1
19  };
20  CurveView(CurveViewRange * curveViewRange = nullptr, CurveViewCursor * curveViewCursor = nullptr,
21  BannerView * bannerView = nullptr, View * cursorView = nullptr, View * okView = nullptr);
22  virtual void reload();
23  // When the main view is selected, the banner view is visible
24  bool isMainViewSelected() const;
25  void selectMainView(bool mainViewSelected);
26  void setCursorView(View * cursorView);
27  void setBannerView(View * bannerView);
28  void setOkView(View * okView);
29  float resolution() const;
30 protected:
31  void setCurveViewRange(CurveViewRange * curveViewRange);
32  // Drawing methods
33  virtual float samplingRatio() const;
34  constexpr static KDCoordinate k_labelMargin = 4;
35  constexpr static KDCoordinate k_okMargin = 10;
36  constexpr static KDCoordinate k_labelGraduationLength = 6;
39  constexpr static int k_externRectMargin = 2;
40  float pixelToFloat(Axis axis, KDCoordinate p) const;
41  float floatToPixel(Axis axis, float f) const;
42  void drawLine(KDContext * ctx, KDRect rect, Axis axis,
43  float coordinate, KDColor color, KDCoordinate thickness = 1) const;
44  void drawSegment(KDContext * ctx, KDRect rect, Axis axis,
45  float coordinate, float lowerBound, float upperBound,
46  KDColor color, KDCoordinate thickness = 1) const;
47  void drawDot(KDContext * ctx, KDRect rect, float x, float y, KDColor color, bool oversize = false) const;
48  void drawGridLines(KDContext * ctx, KDRect rect, Axis axis, float step, KDColor color) const;
49  void drawGrid(KDContext * ctx, KDRect rect) const;
50  void drawAxes(KDContext * ctx, KDRect rect, Axis axis) const;
51  void drawCurve(KDContext * ctx, KDRect rect, EvaluateModelWithParameter evaluation, void * model, void * context, KDColor color, bool colorUnderCurve = false, float colorLowerBound = 0.0f, float colorUpperBound = 0.0f, bool continuously = false) const;
52  void drawHistogram(KDContext * ctx, KDRect rect, EvaluateModelWithParameter evaluation, void * model, void * context, float firstBarAbscissa, float barWidth,
53  bool fillBar, KDColor defaultColor, KDColor highlightColor, float highlightLowerBound = INFINITY, float highlightUpperBound = -INFINITY) const;
54  void computeLabels(Axis axis);
55  void drawLabels(KDContext * ctx, KDRect rect, Axis axis, bool shiftOrigin) const;
58 private:
59  /* The window bounds are deduced from the model bounds but also take into
60  account a margin (computed with k_marginFactor) */
61  float min(Axis axis) const;
62  float max(Axis axis) const;
63  float gridUnit(Axis axis) const;
64  KDCoordinate pixelLength(Axis axis) const;
65  virtual char * label(Axis axis, int index) const = 0;
66  int numberOfLabels(Axis axis) const;
67  /* Recursively join two dots (dichotomy). The method stops when the
68  * maxNumberOfRecursion in reached. */
69  void jointDots(KDContext * ctx, KDRect rect, EvaluateModelWithParameter evaluation, void * model, void * context, float x, float y, float u, float v, KDColor color, int maxNumberOfRecursion) const;
70  /* Join two dots with a straight line. */
71  void straightJoinDots(KDContext * ctx, KDRect rect, float pxf, float pyf, float puf, float pvf, KDColor color) const;
72  /* Stamp centered around (pxf, pyf). If pxf and pyf are not round number, the
73  * function shifts the stamp (by blending adjacent pixel colors) to draw with
74  * anti alising. */
75  void stampAtLocation(KDContext * ctx, KDRect rect, float pxf, float pyf, KDColor color) const;
76  void layoutSubviews() override;
77  KDRect cursorFrame();
78  KDRect bannerFrame();
79  KDRect okFrame();
80  int numberOfSubviews() const override;
81  View * subviewAtIndex(int index) override;
82  /* m_curveViewRange has to be non null but the cursor model, the banner and
83  * cursor views may be nullptr if not needed. */
84  CurveViewRange * m_curveViewRange;
85  View * m_cursorView;
86  View * m_okView;
87  bool m_mainViewSelected;
88  uint32_t m_drawnRangeVersion;
89 };
90 
91 }
92 
93 #endif
float(* EvaluateModelWithParameter)(float t, void *model, void *context)
Definition: curve_view.h:15
bool isMainViewSelected() const
Definition: curve_view.cpp:42
View * m_bannerView
Definition: curve_view.h:56
void drawGridLines(KDContext *ctx, KDRect rect, Axis axis, float step, KDColor color) const
Definition: curve_view.cpp:256
const SettingsMessageTree model
int16_t KDCoordinate
Definition: coordinate.h:6
void setBannerView(View *bannerView)
Definition: curve_view.cpp:71
void drawSegment(KDContext *ctx, KDRect rect, Axis axis, float coordinate, float lowerBound, float upperBound, KDColor color, KDCoordinate thickness=1) const
Definition: curve_view.cpp:196
void drawGrid(KDContext *ctx, KDRect rect) const
Definition: curve_view.cpp:277
void drawAxes(KDContext *ctx, KDRect rect, Axis axis) const
Definition: curve_view.cpp:282
void setOkView(View *okView)
Definition: curve_view.cpp:77
void drawCurve(KDContext *ctx, KDRect rect, EvaluateModelWithParameter evaluation, void *model, void *context, KDColor color, bool colorUnderCurve=false, float colorLowerBound=0.0f, float colorUpperBound=0.0f, bool continuously=false) const
Definition: curve_view.cpp:339
float resolution() const
Definition: curve_view.cpp:83
static constexpr KDCoordinate k_labelMargin
Definition: curve_view.h:34
void drawLine(KDContext *ctx, KDRect rect, Axis axis, float coordinate, KDColor color, KDCoordinate thickness=1) const
Definition: curve_view.cpp:175
CurveViewCursor * m_curveViewCursor
Definition: curve_view.h:57
virtual float samplingRatio() const
Definition: curve_view.cpp:87
void drawLabels(KDContext *ctx, KDRect rect, Axis axis, bool shiftOrigin) const
Definition: curve_view.cpp:146
static constexpr float k_maxNumberOfYGridUnits
unsigned int uint32_t
Definition: stdint.h:6
static constexpr KDCoordinate k_okMargin
Definition: curve_view.h:35
static constexpr int k_externRectMargin
Definition: curve_view.h:39
void setCurveViewRange(CurveViewRange *curveViewRange)
Definition: curve_view.cpp:53
#define INFINITY
Definition: math.h:29
static constexpr int k_maxNumberOfXLabels
Definition: curve_view.h:37
void drawHistogram(KDContext *ctx, KDRect rect, EvaluateModelWithParameter evaluation, void *model, void *context, float firstBarAbscissa, float barWidth, bool fillBar, KDColor defaultColor, KDColor highlightColor, float highlightLowerBound=INFINITY, float highlightUpperBound=-INFINITY) const
Definition: curve_view.cpp:382
Definition: rect.h:26
Definition: color.h:6
void setCursorView(View *cursorView)
Definition: curve_view.cpp:64
float floatToPixel(Axis axis, float f) const
Definition: curve_view.cpp:115
Definition: view.h:23
virtual void reload()
Definition: curve_view.cpp:25
void computeLabels(Axis axis)
Definition: curve_view.cpp:130
void selectMainView(bool mainViewSelected)
Definition: curve_view.cpp:46
static constexpr float k_maxNumberOfXGridUnits
CurveView(CurveViewRange *curveViewRange=nullptr, CurveViewCursor *curveViewCursor=nullptr, BannerView *bannerView=nullptr, View *cursorView=nullptr, View *okView=nullptr)
Definition: curve_view.cpp:12
void drawDot(KDContext *ctx, KDRect rect, float x, float y, KDColor color, bool oversize=false) const
Definition: curve_view.cpp:241
float pixelToFloat(Axis axis, KDCoordinate p) const
Definition: curve_view.cpp:110
static constexpr KDCoordinate k_labelGraduationLength
Definition: curve_view.h:36
static constexpr int k_maxNumberOfYLabels
Definition: curve_view.h:38