Main MRPT website > C++ reference for MRPT 1.9.9
CVectorField2D.cpp
Go to the documentation of this file.
1 /* +------------------------------------------------------------------------+
2  | Mobile Robot Programming Toolkit (MRPT) |
3  | http://www.mrpt.org/ |
4  | |
5  | Copyright (c) 2005-2017, 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 
10 #include "opengl-precomp.h" // Precompiled header
11 
13 #include <mrpt/utils/CStream.h>
14 
15 #include "opengl_internals.h"
16 
17 using namespace mrpt;
18 using namespace mrpt::opengl;
19 using namespace mrpt::utils;
20 using namespace mrpt::math;
21 using namespace std;
22 
24 
25 /** Constructor */
27  : xcomp(0, 0),
28  ycomp(0, 0),
29  xMin(-1.0),
30  xMax(1.0),
31  yMin(-1.0),
32  yMax(1.0),
33  m_LineWidth(1.0),
34  m_pointSize(1.0),
35  m_antiAliasing(true)
36 {
37  m_point_color = m_color;
38  m_field_color = m_color;
39 }
40 
41 /** Constructor with a initial set of lines. */
43  CMatrixFloat Matrix_x, CMatrixFloat Matrix_y, float xmin, float xmax,
44  float ymin, float ymax)
45  : m_LineWidth(1.0), m_pointSize(1.0), m_antiAliasing(true)
46 {
47  MRPT_UNUSED_PARAM(Matrix_x);
48  MRPT_UNUSED_PARAM(Matrix_y);
49  MRPT_UNUSED_PARAM(xmin);
50  MRPT_UNUSED_PARAM(xmax);
51  MRPT_UNUSED_PARAM(ymin);
52  MRPT_UNUSED_PARAM(ymax);
55 }
56 
57 /*---------------------------------------------------------------
58  render
59  ---------------------------------------------------------------*/
61 {
62 #if MRPT_HAS_OPENGL_GLUT
63 
64  // Enable antialiasing:
66  if (m_antiAliasing || m_color.A != 255)
67  {
70  }
71  if (m_antiAliasing)
72  {
75  }
76 
79 
81 
82  glDisable(GL_LIGHTING); // Disable lights when drawing lines
84  glColor4ub(
86 
87  const float x_cell_size = (xMax - xMin) / (xcomp.getColCount() - 1);
88  const float y_cell_size = (yMax - yMin) / (ycomp.getRowCount() - 1);
89 
90  for (unsigned int i = 0; i < xcomp.getColCount(); i++)
91  for (unsigned int j = 0; j < xcomp.getRowCount(); j++)
92  {
93  glVertex3f(xMin + i * x_cell_size, yMin + j * y_cell_size, 0);
94  }
95 
96  glEnd();
97 
99  glColor4ub(
101  for (unsigned int i = 0; i < xcomp.getColCount(); i++)
102  for (unsigned int j = 0; j < xcomp.getRowCount(); j++)
103  {
104  glVertex3f(xMin + i * x_cell_size, yMin + j * y_cell_size, 0);
105  glVertex3f(
106  xMin + i * x_cell_size + xcomp(j, i),
107  yMin + j * y_cell_size + ycomp(j, i), 0);
108  }
109  glEnd();
110 
112  glColor4ub(
114  for (unsigned int i = 0; i < xcomp.getColCount(); i++)
115  for (unsigned int j = 0; j < xcomp.getRowCount(); j++)
116  {
117  const float tri_side =
118  0.25 *
119  sqrt(xcomp(j, i) * xcomp(j, i) + ycomp(j, i) * ycomp(j, i));
120  const float ang = ::atan2(ycomp(j, i), xcomp(j, i)) - 1.5708;
121  glVertex3f(
122  -sin(ang) * 0.866 * tri_side + xMin + i * x_cell_size +
123  xcomp(j, i),
124  cos(ang) * 0.866 * tri_side + yMin + j * y_cell_size +
125  ycomp(j, i),
126  0);
127  glVertex3f(
128  cos(ang) * 0.5 * tri_side + xMin + i * x_cell_size +
129  xcomp(j, i),
130  sin(ang) * 0.5 * tri_side + yMin + j * y_cell_size +
131  ycomp(j, i),
132  0);
133  glVertex3f(
134  -cos(ang) * 0.5 * tri_side + xMin + i * x_cell_size +
135  xcomp(j, i),
136  -sin(ang) * 0.5 * tri_side + yMin + j * y_cell_size +
137  ycomp(j, i),
138  0);
139  }
140  glEnd();
141 
143  glEnable(GL_LIGHTING); // Disable lights when drawing lines
144 
145  // End of antialiasing:
146  glPopAttrib();
147 
148 #endif
149 }
150 
151 /*---------------------------------------------------------------
152  Implements the writing to a CStream capability of
153  CSerializable objects
154  ---------------------------------------------------------------*/
156  mrpt::utils::CStream& out, int* version) const
157 {
158  if (version)
159  *version = 0;
160  else
161  {
162  writeToStreamRender(out);
163 
164  out << xcomp << ycomp;
165  out << xMin << xMax << yMin << yMax;
166  out << m_LineWidth;
167  out << m_pointSize;
168  out << m_antiAliasing;
169  out << m_point_color;
170  out << m_field_color;
171  }
172 }
173 
174 /*---------------------------------------------------------------
175  Implements the reading from a CStream capability of
176  CSerializable objects
177  ---------------------------------------------------------------*/
179 {
180  switch (version)
181  {
182  case 0:
184 
185  in >> xcomp >> ycomp;
186  in >> xMin >> xMax >> yMin >> yMax;
187  in >> m_LineWidth;
188  in >> m_pointSize;
189  in >> m_antiAliasing;
190  in >> m_point_color;
191  in >> m_field_color;
192  break;
193 
194  default:
196  break;
197  };
199 }
200 
202  mrpt::math::TPoint3D& bb_min, mrpt::math::TPoint3D& bb_max) const
203 {
204  bb_min.x = xMin;
205  bb_min.y = yMin;
206  bb_min.z = 0;
207 
208  bb_max.x = xMax;
209  bb_max.y = yMax;
210  bb_max.z = 0;
211 
212  const float x_cell_size = (xMax - xMin) / (xcomp.getColCount() - 1);
213  const float y_cell_size = (yMax - yMin) / (ycomp.getRowCount() - 1);
214 
215  for (unsigned int i = 0; i < xcomp.getColCount(); i++)
216  for (unsigned int j = 0; j < xcomp.getRowCount(); j++)
217  {
218  const float tri_side =
219  0.25 *
220  sqrt(xcomp(j, i) * xcomp(j, i) + ycomp(j, i) * ycomp(j, i));
221  const float ang = ::atan2(ycomp(j, i), xcomp(j, i)) - 1.5708;
222 
223  if (-sin(ang) * 0.866 * tri_side + xMin + i * x_cell_size +
224  xcomp(j, i) <
225  bb_min.x)
226  bb_min.x = -sin(ang) * 0.866 * tri_side + xMin +
227  i * x_cell_size + xcomp(j, i);
228 
229  if (cos(ang) * 0.866 * tri_side + yMin + j * y_cell_size +
230  ycomp(j, i) <
231  bb_min.y)
232  bb_min.y = cos(ang) * 0.866 * tri_side + yMin +
233  j * y_cell_size + ycomp(j, i);
234 
235  if (-sin(ang) * 0.866 * tri_side + xMin + i * x_cell_size +
236  xcomp(j, i) >
237  bb_max.x)
238  bb_max.x = -sin(ang) * 0.866 * tri_side + xMin +
239  i * x_cell_size + xcomp(j, i);
240 
241  if (cos(ang) * 0.866 * tri_side + yMin + j * y_cell_size +
242  ycomp(j, i) >
243  bb_max.y)
244  bb_max.y = cos(ang) * 0.866 * tri_side + yMin +
245  j * y_cell_size + ycomp(j, i);
246  }
247 
248  // Convert to coordinates of my parent:
249  m_pose.composePoint(bb_min, bb_min);
250  m_pose.composePoint(bb_max, bb_max);
251 }
252 
254 {
255  ASSERT_(xcomp.size() > 0)
256 
257  const float ratio_xp =
258  xcomp.maxCoeff() * (xcomp.getColCount() - 1) / (xMax - xMin);
259  const float ratio_xn =
260  xcomp.minCoeff() * (xcomp.getColCount() - 1) / (xMax - xMin);
261  const float ratio_yp =
262  ycomp.maxCoeff() * (ycomp.getRowCount() - 1) / (yMax - yMin);
263  const float ratio_yn =
264  ycomp.minCoeff() * (ycomp.getRowCount() - 1) / (yMax - yMin);
265  const float norm_factor =
266  0.85 / max(max(ratio_xp, abs(ratio_xn)), max(ratio_yp, abs(ratio_yn)));
267 
268  xcomp *= norm_factor;
269  ycomp *= norm_factor;
271 }
void writeToStreamRender(utils::CStream &out) const
Classes for serialization, sockets, ini-file manipulation, streams, list of properties-values, timewatch, extensions to STL.
GLAPI void GLAPIENTRY glEnable(GLenum cap)
GLAPI void GLAPIENTRY glPointSize(GLfloat size)
#define IMPLEMENTS_SERIALIZABLE(class_name, base, NameSpace)
This must be inserted in all CSerializable classes implementation files.
mrpt::math::CMatrix ycomp
Y component of the vector field.
#define GL_TRIANGLES
Definition: glew.h:276
EIGEN_STRONG_INLINE void notifyChange() const
Must be called to notify that the object has changed (so, the display list must be updated) ...
STL namespace.
#define GL_ONE_MINUS_SRC_ALPHA
Definition: glew.h:287
mrpt::math::CMatrix xcomp
X component of the vector field.
GLAPI void GLAPIENTRY glPopAttrib(void)
#define GL_LIGHTING
Definition: glew.h:385
GLAPI void GLAPIENTRY glLineWidth(GLfloat width)
mrpt::poses::CPose3D m_pose
6D pose wrt the parent coordinate reference.
Definition: CRenderizable.h:57
GLAPI void GLAPIENTRY glBlendFunc(GLenum sfactor, GLenum dfactor)
mrpt::utils::TColor m_point_color
A renderizable object suitable for rendering with OpenGL&#39;s display lists.
#define GL_COLOR_BUFFER_BIT
Definition: glew.h:265
This base class is used to provide a unified interface to files,memory buffers,..Please see the deriv...
Definition: CStream.h:41
This base provides a set of functions for maths stuff.
Definition: CArrayNumeric.h:19
void writeToStream(mrpt::utils::CStream &out, int *getVersion) const override
Introduces a pure virtual method responsible for writing to a CStream.
#define GL_LINE_SMOOTH
Definition: glew.h:367
#define MRPT_UNUSED_PARAM(a)
Can be used to avoid "not used parameters" warnings from the compiler.
mrpt::utils::TColor m_field_color
#define MRPT_THROW_UNKNOWN_SERIALIZATION_VERSION(__V)
For use in CSerializable implementations.
void readFromStreamRender(mrpt::utils::CStream &in)
mrpt::utils::TColor m_color
Color components in the range [0,255].
Definition: CRenderizable.h:54
double x
X,Y,Z coordinates.
#define GL_POINT_SMOOTH
Definition: glew.h:363
GLAPI void GLAPIENTRY glBegin(GLenum mode)
#define GL_BLEND
Definition: glew.h:432
#define GL_POINTS
Definition: glew.h:272
A 2D vector field representation, consisting of points and arrows drawn on a plane (invisible grid)...
GLAPI void GLAPIENTRY glVertex3f(GLfloat x, GLfloat y, GLfloat z)
GLAPI void GLAPIENTRY glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
void getBoundingBox(mrpt::math::TPoint3D &bb_min, mrpt::math::TPoint3D &bb_max) const override
Evaluates the bounding box of this object (including possible children) in the coordinate frame of th...
#define GL_SRC_ALPHA
Definition: glew.h:286
static void checkOpenGLError()
Checks glGetError and throws an exception if an error situation is found.
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
bool m_antiAliasing
By default is true.
GLAPI void GLAPIENTRY glPushAttrib(GLbitfield mask)
void composePoint(double lx, double ly, double lz, double &gx, double &gy, double &gz, mrpt::math::CMatrixFixedNumeric< double, 3, 3 > *out_jacobian_df_dpoint=nullptr, mrpt::math::CMatrixFixedNumeric< double, 3, 6 > *out_jacobian_df_dpose=nullptr, mrpt::math::CMatrixFixedNumeric< double, 3, 6 > *out_jacobian_df_dse3=nullptr, bool use_small_rot_approx=false) const
An alternative, slightly more efficient way of doing with G and L being 3D points and P this 6D pose...
Definition: CPose3D.cpp:453
GLuint in
Definition: glext.h:7274
The namespace for 3D scene representation and rendering.
Definition: CGlCanvasBase.h:15
#define ASSERT_(f)
void adjustVectorFieldToGrid()
Adjust the vector field in the scene (vectors magnitude) according to the grid size.
GLAPI void GLAPIENTRY glEnd(void)
float m_pointSize
By default is 1.0.
void render_dl() const override
Render.
#define GL_LINES
Definition: glew.h:273
Lightweight 3D point.
GLAPI void GLAPIENTRY glDisable(GLenum cap)
void readFromStream(mrpt::utils::CStream &in, int version) override
Introduces a pure virtual method responsible for loading from a CStream This can not be used directly...
float m_LineWidth
By default is 1.0.
#define GL_LINE_BIT
Definition: glew.h:253



Page generated by Doxygen 1.8.14 for MRPT 1.9.9 Git: ae4571287 Thu Nov 23 00:06:53 2017 +0100 at dom oct 27 23:51:55 CET 2019