DGtal  0.6.devel
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
Viewer3D.h
1 
17 #pragma once
18 
31 #if defined(Viewer3D_RECURSES)
32 #error Recursive header files inclusion detected in Viewer3D.h
33 #else // defined(Viewer3D_RECURSES)
34 
35 #define Viewer3D_RECURSES
36 
37 #if !defined Viewer3D_h
38 
39 #define Viewer3D_h
40 
42 // Inclusions
43 #include <iostream>
44 #include <vector>
45 #include <algorithm>
46 
47 #ifdef APPLE
48 #include <OpenGL/gl.h>
49 #include <OpenGL/glu.h>
50 #else
51 #include <GL/gl.h>
52 #include <GL/glu.h>
53 #endif
54 
55 
56 #include <QGLViewer/qglviewer.h>
57 #include <QGLWidget>
58 #include <QKeyEvent>
59 
60 #include "DGtal/base/Common.h"
61 #include "DGtal/base/CountedPtr.h"
62 #include "DGtal/io/Display3D.h"
63 
64 
65 
67 
68 
69 
70 namespace DGtal
71 {
72 
73 
74 
76 // class Viewer3D
112 class Viewer3D : public QGLViewer, public Display3D
113 {
114  // ----------------------- Standard services ------------------------------
115 public:
116 
121  Viewer3D() :QGLViewer(), Display3D()
122  {
123 
124  };
125 
126 
127 
128 
133 
134 
142  Viewer3D & operator<< ( const DGtal::Color & aColor );
143 
144 
145 
153  Viewer3D & operator<< ( const Display3D::StreamKey & key );
154 
155 
156 
157 
158 
165  void sortSurfelFromCamera();
166 
173  void sortTriangleFromCamera();
180  void sortQuadFromCamera();
181 
182 
188  void sortPolygonFromCamera();
189 
190 
199  template <typename TDrawableWithDisplay3D>
200  Viewer3D & operator<< ( const TDrawableWithDisplay3D & object );
201 
202 
203 
204  // ----------------------- Interface --------------------------------------
205 public:
206 
211  void selfDisplay ( std::ostream & out ) const;
212 
217  bool isValid() const;
218 
219 
220 
221 
222  // ------------------------- Protected Datas ------------------------------
223 private:
224 
225 
226 
227 public:
228 
229 
230 
231  // ------------------------- Private Datas --------------------------------
232 private:
233 
234 
235  GLuint myListToAff;
236  unsigned int myNbListe;
239 
240 public:
241 
242  // ------------------------- Hidden services ------------------------------
243 protected:
244 
245 
251  void updateList ( bool needToUpdateBoundingBox=true );
252 
253 
259  void glDrawGLLinel ( lineD3D aLinel );
260 
261 
262 
263 
269  void glDrawGLPointel ( pointD3D pointel );
270 
271 
272 
273 
292  virtual void keyPressEvent ( QKeyEvent *e );
293 
294 
300  {
301  qglviewer::Vec posCam;
303  {
304  double dist1= sqrt ( ( posCam.x-s1.x ) * ( posCam.x-s1.x ) + ( posCam.y-s1.y ) * ( posCam.y-s1.y ) + ( posCam.z-s1.z ) * ( posCam.z-s1.z ) );
305  double dist2= sqrt ( ( posCam.x-s2.x ) * ( posCam.x-s2.x ) + ( posCam.y-s2.y ) * ( posCam.y-s2.y ) + ( posCam.z-s2.z ) * ( posCam.z-s2.z ) );
306  return dist1>dist2;
307  }
308  }
309  ;
310 
311 
313  {
314  qglviewer::Vec posCam;
316  {
317  qglviewer::Vec center1 ( ( t1.x1+t1.x2+t1.x3 ) /3.0, ( t1.y1+t1.y2+t1.y3 ) /3.0, ( t1.z1+t1.z2+t1.z3 ) /3.0 );
318  qglviewer::Vec center2 ( ( t2.x1+t2.x2+t2.x3 ) /3.0, ( t2.y1+t2.y2+t2.y3 ) /3.0, ( t2.z1+t2.z2+t2.z3 ) /3.0 );
319  double dist1= sqrt ( ( posCam.x-center1.x ) * ( posCam.x-center1.x ) + ( posCam.y-center1.y ) * ( posCam.y-center1.y ) + ( posCam.z-center1.z ) * ( posCam.z-center1.z ) );
320  double dist2= sqrt ( ( posCam.x-center2.x ) * ( posCam.x-center2.x ) + ( posCam.y-center2.y ) * ( posCam.y-center2.y ) + ( posCam.z-center2.z ) * ( posCam.z-center2.z ) );
321 
322  return dist1>dist2;
323  }
324  };
325 
327  {
328  qglviewer::Vec posCam;
329  bool operator() ( quadD3D q1, quadD3D q2 )
330  {
331 
332  qglviewer::Vec center1 ( ( q1.x1+q1.x2+q1.x3+q1.x4 ) /4.0, ( q1.y1+q1.y2+q1.y3+q1.y4 ) /4.0, ( q1.z1+q1.z2+q1.z3+q1.z4 ) /4.0 );
333  qglviewer::Vec center2 ( ( q2.x1+q2.x2+q2.x3+q2.x4 ) /4.0, ( q2.y1+q2.y2+q2.y3+q2.y4 ) /4.0, ( q2.z1+q2.z2+q2.z3+q2.z4 ) /4.0 );
334 
335  double dist1= sqrt ( ( posCam.x-center1.x ) * ( posCam.x-center1.x ) + ( posCam.y-center1.y ) * ( posCam.y-center1.y ) + ( posCam.z-center1.z ) * ( posCam.z-center1.z ) );
336  double dist2= sqrt ( ( posCam.x-center2.x ) * ( posCam.x-center2.x ) + ( posCam.y-center2.y ) * ( posCam.y-center2.y ) + ( posCam.z-center2.z ) * ( posCam.z-center2.z ) );
337  return dist1>dist2;
338  }
339  };
340 
341 
342 
343 
345  {
346  qglviewer::Vec posCam;
348  {
349  double c1x, c1y, c1z=0.0;
350  double c2x, c2y, c2z=0.0;
351  for(unsigned int i=0; i< q1.vectPoints.size(); i++){
352  c1x+=q1.vectPoints.at(i).x;
353  c1y+=q1.vectPoints.at(i).y;
354  c1z+=q1.vectPoints.at(i).z;
355  }
356  for(unsigned int i=0; i< q2.vectPoints.size(); i++){
357  c2x+=q2.vectPoints.at(i).x;
358  c2y+=q2.vectPoints.at(i).y;
359  c2z+=q2.vectPoints.at(i).z;
360  }
361 
362  qglviewer::Vec center1 ( c1x/(double)q1.vectPoints.size(),c1y/(double)q1.vectPoints.size(), c1z/(double)q1.vectPoints.size() );
363  qglviewer::Vec center2 ( c2x/(double)q2.vectPoints.size(),c2y/(double)q2.vectPoints.size(), c2z/(double)q2.vectPoints.size() );
364 
365  double dist1= sqrt ( ( posCam.x-center1.x ) * ( posCam.x-center1.x ) + ( posCam.y-center1.y ) * ( posCam.y-center1.y ) + ( posCam.z-center1.z ) * ( posCam.z-center1.z ) );
366  double dist2= sqrt ( ( posCam.x-center2.x ) * ( posCam.x-center2.x ) + ( posCam.y-center2.y ) * ( posCam.y-center2.y ) + ( posCam.z-center2.z ) * ( posCam.z-center2.z ) );
367  return dist1>dist2;
368  }
369  };
370 
371 
372 
373 
374 
375 
376 
377 protected :
378  virtual void drawWithNames();
379  virtual void draw();
380  virtual void init();
381  virtual QString helpString() const;
382  virtual void postSelection ( const QPoint& point );
383 
384 
385 
386  // ------------------------- Internals ------------------------------------
387 private:
388 
389 
390 
391 
392 
393 
394 }; // end of class Viewer3D
395 
396 
397 
398 
399 
400 
401 
402 
409 std::ostream&
410 operator<< ( std::ostream & out, const Viewer3D & object );
411 
412 
413 } // namespace DGtal
414 
415 
416 
417 
419 // Includes inline functions.
420 #include "DGtal/io/viewers/Viewer3D.ih"
421 
422 // //
424 
425 #endif // !defined Viewer3D_h
426 
427 #undef Viewer3D_RECURSES
428 #endif // else defined(Viewer3D_RECURSES)