33 void CGeneralizedCylinder::TQuadrilateral::calculateNormal() {
40 normal[0]=az*
by-ay*
bz;
41 normal[1]=ax*
bz-az*bx;
42 normal[2]=ay*bx-ax*
by;
44 for (
size_t i=0;i<3;i++)
s+=normal[i]*normal[i];
46 for (
size_t i=0;i<3;i++) normal[i]/=
s;
49 #if MRPT_HAS_OPENGL_GLUT 50 class FQuadrilateralRenderer {
56 for (
int i=0;i<4;i++)
glVertex3d(
t.points[i].x,
t.points[i].y,
t.points[i].z);
59 ~FQuadrilateralRenderer() {}
68 size_t qps=m.size()/getNumberOfSections();
69 begin=m.begin()+qps*firstSection;
70 end=m.begin()+qps*lastSection;
74 void CGeneralizedCylinder::render_dl()
const {
75 #if MRPT_HAS_OPENGL_GLUT 76 if (!meshUpToDate) updateMesh();
82 glColor4ub(m_color.R,m_color.G,m_color.B,m_color.A);
85 for_each(
begin,
end,FQuadrilateralRenderer(m_color));
109 if (!meshUpToDate||!polysUpToDate) updatePolys();
113 void CGeneralizedCylinder::updateMesh()
const {
114 CRenderizableDisplayList::notifyChange();
116 size_t A=axis.size();
117 vector<TPoint3D> genX=generatrix;
118 if (closed&&genX.size()>2) genX.push_back(genX[0]);
119 size_t G=genX.size();
123 for (
size_t i=0;i<A;i++)
for (
size_t j=0;j<G;j++) axis[i].composePoint(genX[j],pointsMesh.get_unsafe(i,j));
133 writeToStreamRender(out);
134 out<<axis<<generatrix;
141 readFromStreamRender(
in);
144 generatePoses(
a,axis);
149 readFromStreamRender(
in);
151 in>>axis>>generatrix;
158 CRenderizableDisplayList::notifyChange();
163 for (
size_t i=0;i<profile.size();i++) pose.
composePoint(profile[i].x,profile[i].y,profile[i].z,
p[i].x,
p[i].y,
p[i].z);
164 vector<math::TPolygon3D> convexPolys;
166 poly=CPolyhedron::Create(convexPolys);
169 void CGeneralizedCylinder::getOrigin(CPolyhedronPtr &poly)
const {
170 if (!meshUpToDate) updateMesh();
171 if (axis.size()<2||generatrix.size()<3)
throw std::logic_error(
"Not enough points.");
172 size_t i=fullyVisible?0:firstSection;
174 poly->setPose(this->m_pose);
175 poly->setColor(getColor());
178 void CGeneralizedCylinder::getEnd(CPolyhedronPtr &poly)
const {
179 if (!meshUpToDate) updateMesh();
180 if (axis.size()<2||generatrix.size()<3)
throw std::logic_error(
"Not enough points.");
181 size_t i=(fullyVisible?axis.size():lastSection)-1;
183 poly->setPose(this->m_pose);
184 poly->setColor(getColor());
187 void CGeneralizedCylinder::generateSetOfPolygons(std::vector<TPolygon3D> &
res)
const {
188 if (!meshUpToDate||!polysUpToDate) updatePolys();
189 size_t N=polys.size();
191 for (
size_t i=0;i<N;i++)
res[i]=polys[i].poly;
194 void CGeneralizedCylinder::getClosedSection(
size_t index1,
size_t index2,mrpt::opengl::CPolyhedronPtr &poly)
const {
195 if (index1>index2) swap(index1,index2);
196 if (index2>=axis.size()-1)
throw std::logic_error(
"Out of range");
198 if (!meshUpToDate) updateMesh();
199 pointsMesh.extractRows(index1,index2+1,ROIpoints);
203 vector<TPoint3D> vec;
207 vector<TPoint3D> vertices;
211 vector<vector<uint32_t> > faces;
212 faces.reserve(nr*nc+2);
213 vector<uint32_t> tmp(4);
214 for (
size_t i=0;i<nr;i++)
for (
size_t j=0;j<nc;j++) {
215 size_t base=(nc+1)*i+j;
220 faces.push_back(tmp);
223 for (
size_t i=0;i<nr+1;i++) tmp[i]=i*(nc+1);
224 faces.push_back(tmp);
225 for (
size_t i=0;i<nr+1;i++) tmp[i]=i*(nc+2)-1;
226 poly=CPolyhedron::Create(vertices,faces);
229 void CGeneralizedCylinder::removeVisibleSectionAtStart() {
230 CRenderizableDisplayList::notifyChange();
232 if (!getNumberOfSections())
throw std::logic_error(
"No more sections");
235 lastSection=getNumberOfSections();
236 }
else if (firstSection>=lastSection)
throw std::logic_error(
"No more sections");
239 void CGeneralizedCylinder::removeVisibleSectionAtEnd() {
240 CRenderizableDisplayList::notifyChange();
242 if (!getNumberOfSections())
throw std::logic_error(
"No more sections");
245 lastSection=getNumberOfSections()-1;
246 }
else if (firstSection>=lastSection)
throw std::logic_error(
"No more sections");
250 void CGeneralizedCylinder::updatePolys()
const {
251 CRenderizableDisplayList::notifyChange();
253 if (!meshUpToDate) updateMesh();
254 size_t N=mesh.size();
257 for (
size_t i=0;i<N;i++) {
258 for (
size_t j=0;j<4;j++) tmp[j]=mesh[i].
points[j];
273 for (;;)
if ((it2=it1+1)==pIn.end())
break;
275 yaws.push_back(atan2(it2->y-it1->y,it2->x-it1->x));
278 yaws.push_back(*yaws.rbegin());
280 for (
size_t i=0;i<N;i++) {
286 bool CGeneralizedCylinder::getFirstSectionPose(
CPose3D &
p) {
287 if (axis.size()<=0)
return false;
292 bool CGeneralizedCylinder::getLastSectionPose(
CPose3D &
p) {
293 if (axis.size()<=0)
return false;
298 bool CGeneralizedCylinder::getFirstVisibleSectionPose(
CPose3D &
p) {
299 if (fullyVisible)
return getFirstSectionPose(
p);
300 if (getVisibleSections()<=0)
return false;
301 p=axis[firstSection];
305 bool CGeneralizedCylinder::getLastVisibleSectionPose(
CPose3D &
p) {
306 if (fullyVisible)
return getLastSectionPose(
p);
307 if (getVisibleSections()<=0)
return false;
318 m_pose.composePoint(bb_min, bb_min);
319 m_pose.composePoint(bb_max, bb_max);
void extractCol(size_t nCol, std::vector< T > &out, int startingRow=0) const
Returns a given column to a vector (without modifying the matrix)
Classes for serialization, sockets, ini-file manipulation, streams, list of properties-values, timewatch, extensions to STL.
bool BASE_IMPEXP splitInConvexComponents(const TPolygon2D &poly, std::vector< TPolygon2D > &components)
Splits a 2D polygon into convex components.
GLAPI void GLAPIENTRY glEnable(GLenum cap)
#define IMPLEMENTS_SERIALIZABLE(class_name, base, NameSpace)
This must be inserted in all CSerializable classes implementation files.
bool BASE_IMPEXP traceRay(const std::vector< TPolygonWithPlane > &vec, const mrpt::poses::CPose3D &pose, double &dist)
Fast ray tracing method using polygons' properties.
EIGEN_STRONG_INLINE iterator begin()
This file implements miscelaneous matrix and matrix/vector operations, and internal functions in mrpt...
GLAPI void GLAPIENTRY glVertex3d(GLdouble x, GLdouble y, GLdouble z)
const Scalar * const_iterator
#define GL_ONE_MINUS_SRC_ALPHA
GLAPI void GLAPIENTRY glBlendFunc(GLenum sfactor, GLenum dfactor)
GLsizei const GLfloat * points
A renderizable object suitable for rendering with OpenGL's display lists.
void composePoint(double lx, double ly, double lz, double &gx, double &gy, double &gz, mrpt::math::CMatrixFixedNumeric< double, 3, 3 > *out_jacobian_df_dpoint=NULL, mrpt::math::CMatrixFixedNumeric< double, 3, 6 > *out_jacobian_df_dpose=NULL, mrpt::math::CMatrixFixedNumeric< double, 3, 6 > *out_jacobian_df_dse3=NULL, 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...
This base class is used to provide a unified interface to files,memory buffers,..Please see the deriv...
This base provides a set of functions for maths stuff.
#define MRPT_THROW_UNKNOWN_SERIALIZATION_VERSION(__V)
For use in CSerializable implementations.
GLAPI void GLAPIENTRY glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz)
GLAPI void GLAPIENTRY glBegin(GLenum mode)
Classes for 2D/3D geometry representation, both of single values and probability density distribution...
void getAsVector(std::vector< T > &out) const
Returns a vector containing the matrix's values.
GLAPI void GLAPIENTRY glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
void generatePolygon(CPolyhedronPtr &poly, const vector< TPoint3D > &profile, const CPose3D &pose)
class OPENGL_IMPEXP CGeneralizedCylinder
This template class provides the basic functionality for a general 2D any-size, resizable container o...
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
This object represents any figure obtained by extruding any profile along a given axis...
A class used to store a 3D pose (a 3D translation + a rotation in 3D).
void appendCol(const std::vector< T > &in)
Appends a new column to the matrix from a vector.
void OPENGL_IMPEXP checkOpenGLError()
Checks glGetError and throws an exception if an error situation is found.
The namespace for 3D scene representation and rendering.
size_t getColCount() const
Number of columns in the matrix.
GLAPI void GLAPIENTRY glEnd(void)
size_t getRowCount() const
Number of rows in the matrix.
Auxiliary struct holding any quadrilateral, represented by foour points.
GLAPI void GLAPIENTRY glDisable(GLenum cap)
GLubyte GLubyte GLubyte a
std::vector< TYPE1, Eigen::aligned_allocator< TYPE1 > > vector_t
3D polygon, inheriting from std::vector<TPoint3D>
void createMesh(const CMatrixTemplate< TPoint3D > &pointsMesh, size_t R, size_t C, vector< CGeneralizedCylinder::TQuadrilateral > &mesh)