Main MRPT website > C++ reference for MRPT 1.4.0
CDisplayWindowPlots.h
Go to the documentation of this file.
1 /* +---------------------------------------------------------------------------+
2  | Mobile Robot Programming Toolkit (MRPT) |
3  | http://www.mrpt.org/ |
4  | |
5  | Copyright (c) 2005-2016, Individual contributors, see AUTHORS file |
6  | See: http://www.mrpt.org/Authors - All rights reserved. |
7  | Released under BSD License. See details in http://www.mrpt.org/License |
8  +---------------------------------------------------------------------------+ */
9 #ifndef CDisplayWindowPlots_H
10 #define CDisplayWindowPlots_H
11 
15 #include <mrpt/utils/CImage.h>
16 #include <mrpt/gui/gui_frwds.h>
17 
18 /*---------------------------------------------------------------
19  Class
20  ---------------------------------------------------------------*/
21 namespace mrpt
22 {
23  namespace gui
24  {
26 
27  /** Create a GUI window and display plots with MATLAB-like interfaces and commands.
28  *
29  * For a list of supported events with the observer/observable pattern, see the discussion in mrpt::gui::CBaseGUIWindow.
30  *
31  * See CDisplayWindowPlots::plot
32  * \ingroup mrpt_gui_grp
33  */
35  {
36  // This must be added to any CObject derived class:
38 
39  public:
40  typedef void (* TCallbackMenu) (int menuID,float cursor_x, float cursor_y, void* userParam); //!< Type for the callback function used in setMenuCallback
41 
42  protected:
43  friend class CWindowDialogPlots;
44 
45  bool m_holdon; //!< Whether hold_on is enabled
46  bool m_holdon_just_disabled;
47  uint32_t m_holdon_cnt; //!< Counter for hold_on
48  TCallbackMenu m_callback;
49  void *m_callback_param;
50 
51  void internal_plot(mrpt::math::CVectorFloat &x,mrpt::math::CVectorFloat &y,const std::string &lineFormat,const std::string &plotName);
52  template <typename VECTOR1,typename VECTOR2>
53  void internal_plot_interface(const VECTOR1 &x,const VECTOR2 &y,const std::string &lineFormat,const std::string &plotName)
54  {
55  mrpt::math::CVectorFloat x1(x.size()), y1(y.size());
56  const size_t N1=size_t(x.size());
57  for (size_t i=0;i<N1;i++) x1[i]=x[i];
58  const size_t N2=size_t(y.size());
59  for (size_t i=0;i<N2;i++) y1[i]=y[i];
60  this->internal_plot(x1,y1,lineFormat,plotName);
61  }
62  template <typename VECTOR1>
63  void internal_plot_interface(const VECTOR1 &y,const std::string &lineFormat,const std::string &plotName)
64  {
65  const size_t N=size_t(y.size());
66  mrpt::math::CVectorFloat x1(N),y1(N);
67  for (size_t i=0;i<N;i++) { x1[i]=i; y1[i]=y[i]; }
68  this->internal_plot(x1,y1,lineFormat,plotName);
69  }
70 
71  public:
72 
73  /** Constructor
74  */
76  const std::string &windowCaption = std::string(),
77  unsigned int initialWidth = 350,
78  unsigned int initialHeight = 300 );
79 
80  /** Class factory returning a smart pointer */
81  static CDisplayWindowPlotsPtr Create(
82  const std::string &windowCaption,
83  unsigned int initialWindowWidth = 400,
84  unsigned int initialWindowHeight = 300 );
85 
86  /** Destructor
87  */
88  virtual ~CDisplayWindowPlots();
89 
90  /** Gets the last x,y pixel coordinates of the mouse. \return False if the window is closed. */
91  virtual bool getLastMousePosition(int &x, int &y) const MRPT_OVERRIDE;
92 
93  /** Set cursor style to default (cursorIsCross=false) or to a cross (cursorIsCross=true) */
94  virtual void setCursorCross(bool cursorIsCross) MRPT_OVERRIDE;
95 
96  /** Resizes the window, stretching the image to fit into the display area.
97  */
98  void resize( unsigned int width, unsigned int height ) MRPT_OVERRIDE;
99 
100  /** Changes the position of the window on the screen.
101  */
102  void setPos( int x, int y ) MRPT_OVERRIDE;
103 
104  /** Changes the window title text.
105  */
106  void setWindowTitle( const std::string &str ) MRPT_OVERRIDE;
107 
108  /** Enable/disable the feature of pan/zoom with the mouse (default=enabled)
109  */
110  void enableMousePanZoom( bool enabled );
111 
112  /** Adds a new layer with a 2D plot based on two vectors of X and Y points, using a MATLAB-like syntax.
113  * Each call to this function creates a new plot, unless the plot name coincides with an already existing plot: in this case the X & Y points are used to update this existing layer (this also applies to using the default plot name).
114  * If "hold_on" is enabled, then every call will always create a new plot, even if no "plotName" is provided.
115  *
116  * The lineFormat string is a combination of the following characters:
117  * - Line styles:
118  * - '.': One point for each data point
119  * - '-': A continuous line
120  * - ':': A dashed line
121  * - Colors:
122  * - k: black
123  * - r: red
124  * - g: green
125  * - b: blue
126  * - m: magenta
127  * - c: cyan
128  * - Line width:
129  * - '1' to '9': The line width (default=1)
130  *
131  * Examples:
132  * - 'r.' -> red points.
133  * - 'k3' or 'k-3' -> A black line with a line width of 3 pixels.
134  * \note The vectors x & y can be of types: float or double.
135  * \sa axis, axis_equal, axis_fit, clear, hold_on, hold_off
136  * \tparam VECTOR Can be std::vector<float/double> or mrpt::dynamicsize_vector<float/double> or a column/row Eigen::Matrix<>
137  */
138  template <typename T1,typename T2> inline void plot(const std::vector<T1> &x,const std::vector<T2> &y,const std::string &lineFormat = std::string("b-"),const std::string &plotName = std::string("plotXY") ) { this->internal_plot_interface(x,y,lineFormat,plotName); }
139  //! \overload
140  template <typename T1,typename Derived2> inline void plot(const std::vector<T1> &x,const Eigen::MatrixBase<Derived2> &y,const std::string &lineFormat = std::string("b-"),const std::string &plotName = std::string("plotXY") ) { this->internal_plot_interface(x,y,lineFormat,plotName); }
141  //! \overload
142  template <typename Derived1,typename T2> inline void plot(const Eigen::MatrixBase<Derived1> &x,const std::vector<T2> &y,const std::string &lineFormat = std::string("b-"),const std::string &plotName = std::string("plotXY") ) { this->internal_plot_interface(x,y,lineFormat,plotName); }
143  //! \overload
144  template <typename Derived1,typename Derived2> inline void plot(const Eigen::MatrixBase<Derived1> &x,const Eigen::MatrixBase<Derived2> &y,const std::string &lineFormat = std::string("b-"),const std::string &plotName = std::string("plotXY") ) { this->internal_plot_interface(x,y,lineFormat,plotName); }
145 
146  //! \overload
147  template <typename T> void plot(const std::vector<T> &y,const std::string &lineFormat = std::string("b-"),const std::string &plotName = std::string("plotXY") ) { this->internal_plot_interface(y,lineFormat,plotName); }
148  //! \overload
149  template <typename Derived> void plot(const Eigen::MatrixBase<Derived> &y,const std::string &lineFormat = std::string("b-"),const std::string &plotName = std::string("plotXY") ) { this->internal_plot_interface(y,lineFormat,plotName); }
150 
151  /** Set the view area according to the passed coordinated. */
152  void axis( float x_min, float x_max, float y_min, float y_max, bool aspectRatioFix = false );
153 
154  /** Enable/disable the fixed X/Y aspect ratio fix feature (default=disabled). */
155  void axis_equal(bool enable=true);
156 
157  /** Fix automatically the view area according to existing graphs. */
158  void axis_fit(bool aspectRatioFix=false);
159 
160  /** Plots a 2D ellipse given its mean, covariance matrix, and
161  * Each call to this function creates a new plot, unless the plot name coincides with an already existing plot: in this case the new values are used to update this existing layer (this also applies to using the default plot name).
162  * If "hold_on" is enabled, then every call will always create a new plot, even if no "plotName" is provided.
163  *
164  * For a description of lineFormat see CDisplayWindowPlots::plot.
165  * The "quantiles" value determines the confidence interval for the ellipse:
166  * - 1 : 68.27% confidence interval
167  * - 2 : 95.45%
168  * - 3 : 99.73%
169  * - 4 : 99.994%
170  * \note This method can be called with 2x2 fixed-sized or dynamic-size matrices of types: float or double.
171  * \sa axis, axis_equal, axis_fit, hold_on, hold_off
172  */
173  template <typename T>
174  void GUI_IMPEXP plotEllipse(
175  const T mean_x,
176  const T mean_y,
178  const float quantiles,
179  const std::string &lineFormat = std::string("b-"),
180  const std::string &plotName = std::string("plotEllipse"),
181  bool showName = false);
182 
183  //! \overload
184  template <typename T>
185  void GUI_IMPEXP plotEllipse(
186  const T mean_x,
187  const T mean_y,
189  const float quantiles,
190  const std::string &lineFormat = std::string("b-"),
191  const std::string &plotName = std::string("plotEllipse"),
192  bool showName = false);
193 
194  /** Adds a bitmap image layer.
195  * Each call to this function creates a new layer, unless the plot name coincides with an already existing plot: in this case the new values are used to update this existing layer (this also applies to using the default plot name).
196  *
197  * \sa axis, axis_equal, axis_fit, hold_on, hold_off
198  */
199  void image(
200  const utils::CImage &img,
201  const float &x_left,
202  const float &y_bottom,
203  const float &x_width,
204  const float &y_height,
205  const std::string &plotName = std::string("image") );
206 
207 
208  /** Remove all plot objects in the display.
209  * \sa plot
210  */
211  void clear();
212 
213  /** Remove all plot objects in the display (clear and clf do exactly the same).
214  * \sa plot, hold_on, hold_off
215  */
216  inline void clf() {
217  clear();
218  }
219 
220  /** Enables keeping all the graphs, instead of overwritting them.
221  * \sa hold_off, plot
222  */
223  void hold_on();
224 
225  /** Disables keeping all the graphs (this is the default behavior).
226  * \sa hold_on, plot
227  */
228  void hold_off();
229 
230  /** Disables keeping all the graphs (this is the default behavior).
231  * \param label The text that appears in the new popup menu item.
232  * \param menuID Any positive number (0,1,..). Used to tell which menu was selected in the user callback.
233  * \sa setMenuCallback
234  */
235  void addPopupMenuEntry( const std::string &label, int menuID );
236 
237 
238  /** Must be called to have a callback when the user selects one of the user-defined entries in the popup menu.
239  * \sa addPopupMenuEntry
240  */
241  void setMenuCallback(TCallbackMenu userFunction, void* userParam = NULL );
242 
243 
244  }; // End of class def.
246  }
247 
248 } // End of namespace
249 
250 #endif
Create a GUI window and display plots with MATLAB-like interfaces and commands.
#define MRPT_OVERRIDE
C++11 "override" for virtuals:
A class for storing images as grayscale or RGB bitmaps.
Definition: CImage.h:101
Column vector, like Eigen::MatrixX*, but automatically initialized to zeros since construction...
Definition: eigen_frwds.h:35
STL namespace.
void internal_plot_interface(const VECTOR1 &y, const std::string &lineFormat, const std::string &plotName)
dynamic_vector< float > CVectorFloat
Column vector, like Eigen::MatrixXf, but automatically initialized to zeros since construction...
Definition: eigen_frwds.h:35
void plot(const std::vector< T1 > &x, const Eigen::MatrixBase< Derived2 > &y, const std::string &lineFormat=std::string("b-"), const std::string &plotName=std::string("plotXY"))
A numeric matrix of compile-time fixed size.
#define DEFINE_MRPT_OBJECT(class_name)
This declaration must be inserted in all CObject classes definition, within the class declaration...
Definition: CObject.h:167
#define DEFINE_MRPT_OBJECT_POST_CUSTOM_BASE_LINKAGE(class_name, base_name, _LINKAGE_)
Definition: CObject.h:172
void plot(const Eigen::MatrixBase< Derived1 > &x, const Eigen::MatrixBase< Derived2 > &y, const std::string &lineFormat=std::string("b-"), const std::string &plotName=std::string("plotXY"))
void plot(const std::vector< T > &y, const std::string &lineFormat=std::string("b-"), const std::string &plotName=std::string("plotXY"))
void plot(const std::vector< T1 > &x, const std::vector< T2 > &y, const std::string &lineFormat=std::string("b-"), const std::string &plotName=std::string("plotXY"))
Adds a new layer with a 2D plot based on two vectors of X and Y points, using a MATLAB-like syntax...
#define DEFINE_MRPT_OBJECT_PRE_CUSTOM_BASE_LINKAGE(class_name, base_name, _LINKAGE_)
Definition: CObject.h:171
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
void clf()
Remove all plot objects in the display (clear and clf do exactly the same).
void plot(const Eigen::MatrixBase< Derived > &y, const std::string &lineFormat=std::string("b-"), const std::string &plotName=std::string("plotXY"))
void plot(const Eigen::MatrixBase< Derived1 > &x, const std::vector< T2 > &y, const std::string &lineFormat=std::string("b-"), const std::string &plotName=std::string("plotXY"))
The base class for GUI window classes.



Page generated by Doxygen 1.8.11 for MRPT 1.4.0 SVN: at Mon Aug 15 11:50:21 UTC 2016