DGtal  0.6.devel
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
Board3DTo2D.cpp
1 
30 
31 #include "DGtal/io/boards/Board3DTo2D.h"
32 #include <limits>
33 
34 
35 
36 // Cairo includes
37 #include <cairo.h>
38 #include <cairo-pdf.h>
39 #include <cairo-ps.h>
40 #include <cairo-svg.h>
41 // Cairo includes
43 
44 using namespace std;
45 
47 // class Board3DTo2D
49 
51 // Standard services - public :
52 
57 {
58  init();
59 }
60 
62 // Interface - public :
63 
68 void
69 DGtal::Board3DTo2D::selfDisplay ( std::ostream & out ) const
70 {
71  out << "[Board3DTo2D]";
72 }
73 
78 bool
80 {
81  return true;
82 }
83 
84 
90 static void TransposeMt(double tmat[16], double mat[16])
91 {
92  tmat[0] = mat[0]; tmat[1] = mat[4]; tmat[2] = mat[8]; tmat[3] = mat[12];
93  tmat[4] = mat[1]; tmat[5] = mat[5]; tmat[6] = mat[9]; tmat[7] = mat[13];
94  tmat[8] = mat[2]; tmat[9] = mat[6]; tmat[10] = mat[10]; tmat[11] = mat[14];
95  tmat[12] = mat[3]; tmat[13] = mat[7]; tmat[14] = mat[11]; tmat[15] = mat[15];
96 }
97 
104 static void MulMt(double v[4], double mat[16], double b[4])
105 {
106  v[0] = mat[0] * b[0] + mat[1] * b[1] + mat[2] * b[2] + mat[3] * b[3];
107  v[1] = mat[4] * b[0] + mat[5] * b[1] + mat[6] * b[2] + mat[7] * b[3];
108  v[2] = mat[8] * b[0] + mat[9] * b[1] + mat[10] * b[2] + mat[11] * b[3];
109  v[3] = mat[12] * b[0] + mat[13] * b[1] + mat[14] * b[2] + mat[15] * b[3];
110 }
111 
125 static void LookAtMt(double mat[16],
126  double eyex, double eyey, double eyez,
127  double dirx, double diry, double dirz,
128  double upx, double upy, double upz)
129 {
130  double up[3]; up[0]= upx; up[1]= upy; up[2]= upz;
131 
132  double z[3]; z[0]= -dirx; z[1]= -diry; z[2]= -dirz; normalize(z);
133  double x[3]; cross (x, up, z); normalize(x);
134  double y[3]; cross (y, z, x); normalize(y);
135 
136  double m[16];
137  m[0] = x[0]; m[1] = x[1]; m[2] = x[2]; m[3] = 0;
138  m[4] = y[0]; m[5] = y[1]; m[6] = y[2]; m[7] = 0;
139  m[8] = z[0]; m[9] = z[1]; m[10] = z[2]; m[11] = 0;
140  m[12] = 0; m[13] = 0; m[14] = 0; m[15] = 1;
141 
142  double e[4]; e[0]= -eyex; e[1]= -eyey; e[2]= -eyez; e[3]= 1;
143  double eyePrime[4]; MulMt(eyePrime, m, e);
144 
145  TransposeMt(mat, m);
146  mat[12] = eyePrime[0]; mat[13] = eyePrime[1]; mat[14] = eyePrime[2];
147 }
148 
153 {
154  // Projection: from qglviewer
155  /*const double f = 1.0/tan(fieldOfView()/2.0);
156  projectionMatrix_[0] = f/aspectRatio();
157  projectionMatrix_[5] = f;
158  projectionMatrix_[10] = (ZNear + ZFar) / (ZNear - ZFar);
159  projectionMatrix_[11] = -1.0;
160  projectionMatrix_[14] = 2.0 * ZNear * ZFar / (ZNear - ZFar);
161  projectionMatrix_[15] = 0.0;
162  // same as gluPerspective( 180.0*fieldOfView()/M_PI, aspectRatio(), zNear(), zFar() );*/
163 
164  double fieldOfView = M_PI/4.;
165  double f = 1.0/tan(fieldOfView/2.0);
166  double aspectRatio = (double)Viewport[2]/Viewport[3];
167 
168  double Projection[16] = { f/aspectRatio, 0.00, 0.00, 0.00,
169  0.00, f, 0.00, 0.00,
170  0.00, 0.00, (ZNear + ZFar) / (ZNear - ZFar), -1.00,
171  0.00, 0.00, 2.0 * ZNear * ZFar / (ZNear - ZFar), 0.00 };
172 
173  double Modelview[16];
174  LookAtMt(Modelview,
175  camera_position[0], camera_position[1], camera_position[2],
176  camera_direction[0], camera_direction[1], camera_direction[2],
177  camera_upVector[0], camera_upVector[1], camera_upVector[2]);
178 
179  for (unsigned short m=0; m<4; ++m)
180  {
181  for (unsigned short l=0; l<4; ++l)
182  {
183  double sum = 0.0;
184  for (unsigned short k=0; k<4; ++k)
185  sum += Projection[l+4*k]*Modelview[k+4*m];
186  matrix[l+4*m] = sum;
187  }
188  }
189 }
190 
199 void DGtal::Board3DTo2D::project(double x3d, double y3d, double z3d, double &x2d, double &y2d)
200 {
201  double v[4], vs[4];
202  v[0]=x3d; v[1]=y3d; v[2]=z3d; v[3]=1.0;
203 
204  vs[0]=matrix[0 ]*v[0] + matrix[4 ]*v[1] + matrix[8 ]*v[2] + matrix[12 ]*v[3];
205  vs[1]=matrix[1 ]*v[0] + matrix[5 ]*v[1] + matrix[9 ]*v[2] + matrix[13 ]*v[3];
206  vs[2]=matrix[2 ]*v[0] + matrix[6 ]*v[1] + matrix[10]*v[2] + matrix[14 ]*v[3];
207  vs[3]=matrix[3 ]*v[0] + matrix[7 ]*v[1] + matrix[11]*v[2] + matrix[15 ]*v[3];
208 
209  vs[0] /= vs[3];
210  vs[1] /= vs[3];
211  vs[2] /= vs[3];
212 
213  vs[0] = vs[0] * 0.5 + 0.5;
214  vs[1] = vs[1] * 0.5 + 0.5;
215  vs[2] = vs[2] * 0.5 + 0.5;
216 
217  vs[0] = vs[0] * Viewport[2] + Viewport[0];
218  vs[1] = vs[1] * Viewport[3] + Viewport[1];
219 
220  x2d = vs[0];
221  y2d = Viewport[3]-vs[1];
222 }
223 
231 void
232 DGtal::Board3DTo2D::saveCairo(const char *filename, CairoType type, int bWidth, int bHeight)
233 {
234  for(unsigned int i =0; i< myClippingPlaneList.size(); i++)
235  trace.info() << "-> ClippingPlane not implemented in Board3DTo2D" << std::endl;
236 
237  Viewport[0] = 0; Viewport[1] = 0; Viewport[2] = bWidth; Viewport[3] = bHeight;
238  precompute_projection_matrix();
239 
240  cairo_surface_t *surface;
241  cairo_t *cr;
242 
243  switch (type)
244  {
245  case CairoPDF:
246  surface = cairo_pdf_surface_create (filename, Viewport[2], Viewport[3]); break;
247  case CairoPS:
248  surface = cairo_ps_surface_create (filename, Viewport[2], Viewport[3]); break;
249  case CairoEPS:
250  surface = cairo_ps_surface_create (filename, Viewport[2], Viewport[3]);
251  cairo_ps_surface_set_eps(surface, true); break;
252  case CairoSVG:
253  surface = cairo_svg_surface_create (filename, Viewport[2], Viewport[3]); break;
254  case CairoPNG:
255  default:
256  surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, Viewport[2], Viewport[3]);
257  }
258 
259  cr = cairo_create (surface);
260 
261  // Fill the background with gray
262  cairo_set_source_rgba (cr, .3, .3, .3, 1.);
263  cairo_rectangle (cr, 0, 0, Viewport[2], Viewport[3]);
264  cairo_fill (cr);
265 
266  // Draw the shapes
267 
268  // myPointSetList
269  for(unsigned int i=0; i<myPointSetList.size(); i++)
270  {
271  for (std::vector<pointD3D>::iterator s_it = myPointSetList.at(i).begin();
272  s_it != myPointSetList.at(i).end();
273  ++s_it)
274  {
275  {
276  cairo_save (cr);
277 
278  cairo_set_source_rgba (cr, (*s_it).R/255.0, (*s_it).G/255.0, (*s_it).B/255.0, (*s_it).T/255.0);
279  cairo_set_line_width (cr, 1.); // arbitraire car non set
280 
281  double x1, y1, x2, y2, x3, y3, x4, y4;
282  //double width=(*s_it).size/120.; // arbitraire
283  double width=0.05; // arbitraire
284  // TODO:
285  /*double distCam =sqrt((camera_position[0]-centerS.x)*(camera_position[0]-centerS.x)+
286  (camera_position[1]-centerS.y)*(camera_position[1]-centerS.y)+
287  (camera_position[2]-centerS.z)*(camera_position[2]-centerS.z));*/
288 
289  //z+
290  project((*s_it).x-width, (*s_it).y+width, (*s_it).z+width, x1, y1);
291  project((*s_it).x+width, (*s_it).y+width, (*s_it).z+width, x2, y2);
292  project((*s_it).x+width, (*s_it).y-width, (*s_it).z+width, x3, y3);
293  project((*s_it).x-width, (*s_it).y-width, (*s_it).z+width, x4, y4);
294  cairo_move_to (cr, x1, y1); cairo_line_to (cr, x2, y2); cairo_line_to (cr, x3, y3); cairo_line_to (cr, x4, y4); cairo_line_to (cr, x1, y1); cairo_close_path (cr); myModes["Board3DTo2D"]=="SolidMode"?cairo_fill (cr):cairo_stroke (cr);
295  //z-
296  project((*s_it).x-width, (*s_it).y+width, (*s_it).z-width, x1, y1);
297  project((*s_it).x+width, (*s_it).y+width, (*s_it).z-width, x2, y2);
298  project((*s_it).x+width, (*s_it).y-width, (*s_it).z-width, x3, y3);
299  project((*s_it).x-width, (*s_it).y-width, (*s_it).z-width, x4, y4);
300  cairo_move_to (cr, x1, y1); cairo_line_to (cr, x2, y2); cairo_line_to (cr, x3, y3); cairo_line_to (cr, x4, y4); cairo_line_to (cr, x1, y1); cairo_close_path (cr); myModes["Board3DTo2D"]=="SolidMode"?cairo_fill (cr):cairo_stroke (cr);
301  //x+
302  project((*s_it).x+width, (*s_it).y-width, (*s_it).z+width, x1, y1);
303  project((*s_it).x+width, (*s_it).y+width, (*s_it).z+width, x2, y2);
304  project((*s_it).x+width, (*s_it).y+width, (*s_it).z-width, x3, y3);
305  project((*s_it).x+width, (*s_it).y-width, (*s_it).z-width, x4, y4);
306  cairo_move_to (cr, x1, y1); cairo_line_to (cr, x2, y2); cairo_line_to (cr, x3, y3); cairo_line_to (cr, x4, y4); cairo_line_to (cr, x1, y1); cairo_close_path (cr); myModes["Board3DTo2D"]=="SolidMode"?cairo_fill (cr):cairo_stroke (cr);
307  //x-
308  project((*s_it).x-width, (*s_it).y-width, (*s_it).z+width, x1, y1);
309  project((*s_it).x-width, (*s_it).y+width, (*s_it).z+width, x2, y2);
310  project((*s_it).x-width, (*s_it).y+width, (*s_it).z-width, x3, y3);
311  project((*s_it).x-width, (*s_it).y-width, (*s_it).z-width, x4, y4);
312  cairo_move_to (cr, x1, y1); cairo_line_to (cr, x2, y2); cairo_line_to (cr, x3, y3); cairo_line_to (cr, x4, y4); cairo_line_to (cr, x1, y1); cairo_close_path (cr); myModes["Board3DTo2D"]=="SolidMode"?cairo_fill (cr):cairo_stroke (cr);
313  //y+
314  project((*s_it).x-width, (*s_it).y+width, (*s_it).z+width, x1, y1);
315  project((*s_it).x+width, (*s_it).y+width, (*s_it).z+width, x2, y2);
316  project((*s_it).x+width, (*s_it).y+width, (*s_it).z-width, x3, y3);
317  project((*s_it).x-width, (*s_it).y+width, (*s_it).z-width, x4, y4);
318  cairo_move_to (cr, x1, y1); cairo_line_to (cr, x2, y2); cairo_line_to (cr, x3, y3); cairo_line_to (cr, x4, y4); cairo_line_to (cr, x1, y1); cairo_close_path (cr); myModes["Board3DTo2D"]=="SolidMode"?cairo_fill (cr):cairo_stroke (cr);
319  //y-
320  project((*s_it).x-width, (*s_it).y-width, (*s_it).z+width, x1, y1);
321  project((*s_it).x+width, (*s_it).y-width, (*s_it).z+width, x2, y2);
322  project((*s_it).x+width, (*s_it).y-width, (*s_it).z-width, x3, y3);
323  project((*s_it).x-width, (*s_it).y-width, (*s_it).z-width, x4, y4);
324  cairo_move_to (cr, x1, y1); cairo_line_to (cr, x2, y2); cairo_line_to (cr, x3, y3); cairo_line_to (cr, x4, y4); cairo_line_to (cr, x1, y1); cairo_close_path (cr); myModes["Board3DTo2D"]=="SolidMode"?cairo_fill (cr):cairo_stroke (cr);
325 
326  cairo_restore (cr);
327  }
328  }
329  }
330 
331  // myLineSetList
332  for(unsigned int i=0; i<myLineSetList.size(); i++)
333  {
334  for (std::vector<lineD3D>::iterator s_it = myLineSetList.at(i).begin();
335  s_it != myLineSetList.at(i).end();
336  ++s_it)
337  {
338  {
339  cairo_save (cr);
340 
341  cairo_set_source_rgba (cr, (*s_it).R/255.0, (*s_it).G/255.0, (*s_it).B/255.0, (*s_it).T/255.0);
342 
343  double x1, y1;
344  double x2, y2;
345  project((*s_it).x1, (*s_it).y1, (*s_it).z1, x1, y1);
346  project((*s_it).x2, (*s_it).y2, (*s_it).z2, x2, y2);
347  cairo_move_to (cr, x1, y1);
348  cairo_line_to (cr, x2, y2);
349 
350  //cairo_set_line_width (cr, (*s_it).width);
351  cairo_set_line_width (cr, 1.); // arbitraire car non set
352 
353  cairo_stroke (cr);
354 
355  cairo_restore (cr);
356  }
357  }
358  }
359 
360  // myVoxelSetList
361  for(unsigned int i=0; i<myVoxelSetList.size(); i++)
362  {
363  for (std::vector<voxelD3D>::iterator s_it = myVoxelSetList.at(i).begin();
364  s_it != myVoxelSetList.at(i).end();
365  ++s_it)
366  {
367  {
368  cairo_save (cr);
369 
370  if (myModes["Board3DTo2D"]=="SolidMode")
371  cairo_set_source_rgba (cr, (*s_it).R/255.0, (*s_it).G/255.0, (*s_it).B/255.0, (*s_it).T/(255.0*1.75)); // *1.75 arbitraire
372  else
373  cairo_set_source_rgba (cr, (*s_it).R/255.0, (*s_it).G/255.0, (*s_it).B/255.0, (*s_it).T/(255.0*0.75)); // *0.75 arbitraire
374 
375  cairo_set_line_width (cr, 1.); // arbitraire car non set
376 
377  double x1, y1, x2, y2, x3, y3, x4, y4;
378  double width=(*s_it).width;
379 
380  //z+
381  project((*s_it).x-width, (*s_it).y+width, (*s_it).z+width, x1, y1);
382  project((*s_it).x+width, (*s_it).y+width, (*s_it).z+width, x2, y2);
383  project((*s_it).x+width, (*s_it).y-width, (*s_it).z+width, x3, y3);
384  project((*s_it).x-width, (*s_it).y-width, (*s_it).z+width, x4, y4);
385  cairo_move_to (cr, x1, y1); cairo_line_to (cr, x2, y2); cairo_line_to (cr, x3, y3); cairo_line_to (cr, x4, y4); cairo_line_to (cr, x1, y1); cairo_close_path (cr); myModes["Board3DTo2D"]=="SolidMode"?cairo_fill (cr):cairo_stroke (cr);
386  //z-
387  project((*s_it).x-width, (*s_it).y+width, (*s_it).z-width, x1, y1);
388  project((*s_it).x+width, (*s_it).y+width, (*s_it).z-width, x2, y2);
389  project((*s_it).x+width, (*s_it).y-width, (*s_it).z-width, x3, y3);
390  project((*s_it).x-width, (*s_it).y-width, (*s_it).z-width, x4, y4);
391  cairo_move_to (cr, x1, y1); cairo_line_to (cr, x2, y2); cairo_line_to (cr, x3, y3); cairo_line_to (cr, x4, y4); cairo_line_to (cr, x1, y1); cairo_close_path (cr); myModes["Board3DTo2D"]=="SolidMode"?cairo_fill (cr):cairo_stroke (cr);
392  //x+
393  project((*s_it).x+width, (*s_it).y-width, (*s_it).z+width, x1, y1);
394  project((*s_it).x+width, (*s_it).y+width, (*s_it).z+width, x2, y2);
395  project((*s_it).x+width, (*s_it).y+width, (*s_it).z-width, x3, y3);
396  project((*s_it).x+width, (*s_it).y-width, (*s_it).z-width, x4, y4);
397  cairo_move_to (cr, x1, y1); cairo_line_to (cr, x2, y2); cairo_line_to (cr, x3, y3); cairo_line_to (cr, x4, y4); cairo_line_to (cr, x1, y1); cairo_close_path (cr); myModes["Board3DTo2D"]=="SolidMode"?cairo_fill (cr):cairo_stroke (cr);
398  //x-
399  project((*s_it).x-width, (*s_it).y-width, (*s_it).z+width, x1, y1);
400  project((*s_it).x-width, (*s_it).y+width, (*s_it).z+width, x2, y2);
401  project((*s_it).x-width, (*s_it).y+width, (*s_it).z-width, x3, y3);
402  project((*s_it).x-width, (*s_it).y-width, (*s_it).z-width, x4, y4);
403  cairo_move_to (cr, x1, y1); cairo_line_to (cr, x2, y2); cairo_line_to (cr, x3, y3); cairo_line_to (cr, x4, y4); cairo_line_to (cr, x1, y1); cairo_close_path (cr); myModes["Board3DTo2D"]=="SolidMode"?cairo_fill (cr):cairo_stroke (cr);
404  //y+
405  project((*s_it).x-width, (*s_it).y+width, (*s_it).z+width, x1, y1);
406  project((*s_it).x+width, (*s_it).y+width, (*s_it).z+width, x2, y2);
407  project((*s_it).x+width, (*s_it).y+width, (*s_it).z-width, x3, y3);
408  project((*s_it).x-width, (*s_it).y+width, (*s_it).z-width, x4, y4);
409  cairo_move_to (cr, x1, y1); cairo_line_to (cr, x2, y2); cairo_line_to (cr, x3, y3); cairo_line_to (cr, x4, y4); cairo_line_to (cr, x1, y1); cairo_close_path (cr); myModes["Board3DTo2D"]=="SolidMode"?cairo_fill (cr):cairo_stroke (cr);
410  //y-
411  project((*s_it).x-width, (*s_it).y-width, (*s_it).z+width, x1, y1);
412  project((*s_it).x+width, (*s_it).y-width, (*s_it).z+width, x2, y2);
413  project((*s_it).x+width, (*s_it).y-width, (*s_it).z-width, x3, y3);
414  project((*s_it).x-width, (*s_it).y-width, (*s_it).z-width, x4, y4);
415  cairo_move_to (cr, x1, y1); cairo_line_to (cr, x2, y2); cairo_line_to (cr, x3, y3); cairo_line_to (cr, x4, y4); cairo_line_to (cr, x1, y1); cairo_close_path (cr); myModes["Board3DTo2D"]=="SolidMode"?cairo_fill (cr):cairo_stroke (cr);
416 
417  cairo_restore (cr);
418  }
419  }
420  }
421 
422  for(unsigned int i=0; i<myQuadList.size(); i++)
423  trace.info() << "-> Quad not YET implemented in Board3DTo2D" << std::endl;
424 
425  // Drawing all Khalimsky Space Cells
426 
427  // KSSurfel (from updateList)
428  for (std::vector<quadD3D>::iterator s_it = myKSSurfelList.begin();
429  s_it != myKSSurfelList.end();
430  ++s_it)
431  {
432  {
433  cairo_save (cr);
434 
435  if (myModes["Board3DTo2D"]=="SolidMode")
436  cairo_set_source_rgba (cr, (*s_it).R/255.0, (*s_it).G/255.0, (*s_it).B/255.0, (*s_it).T/(255.0*3.75)); // *3.75 arbitraire
437  else
438  cairo_set_source_rgba (cr, (*s_it).R/255.0, (*s_it).G/255.0, (*s_it).B/255.0, (*s_it).T/(255.0*0.75)); // *0.75 arbitraire
439 
440  cairo_set_line_width (cr, 1.); // arbitraire car non set
441 
442  double x1, y1, x2, y2, x3, y3, x4, y4;
443 
444  project((*s_it).x1, (*s_it).y1, (*s_it).z1, x1, y1);
445  project((*s_it).x2, (*s_it).y2, (*s_it).z2, x2, y2);
446  project((*s_it).x3, (*s_it).y3, (*s_it).z3, x3, y3);
447  project((*s_it).x4, (*s_it).y4, (*s_it).z4, x4, y4);
448  cairo_move_to (cr, x1, y1); cairo_line_to (cr, x2, y2); cairo_line_to (cr, x3, y3); cairo_line_to (cr, x4, y4); cairo_line_to (cr, x1, y1); cairo_close_path (cr); myModes["Board3DTo2D"]=="SolidMode"?cairo_fill (cr):cairo_stroke (cr);
449 
450  cairo_restore (cr);
451  }
452  }
453 
454  // KSLinel
455  for(unsigned int i=0; i< myKSLinelList.size();i++)
456  {
457  //if (!myKSLinelList.at(i).isSigned) // for the moment, same for Signed or NonSigned
458  {
459  {
460  cairo_save (cr);
461 
462  cairo_set_source_rgba (cr, myKSLinelList.at(i).R/255.0, myKSLinelList.at(i).G/255.0, myKSLinelList.at(i).B/255.0, myKSLinelList.at(i).T/255.0);
463  cairo_set_line_width (cr, 4.); // arbitraire car non set
464 
465  double x1, y1, x2, y2;
466 
467  project(myKSLinelList.at(i).x1, myKSLinelList.at(i).y1, myKSLinelList.at(i).z1, x1, y1);
468  project(myKSLinelList.at(i).x2, myKSLinelList.at(i).y2, myKSLinelList.at(i).z2, x2, y2);
469  cairo_move_to (cr, x1, y1); cairo_line_to (cr, x2, y2); cairo_close_path (cr); cairo_stroke (cr);
470 
471  cairo_restore (cr);
472  }
473  }
474  }
475 
476  // KSPointel
477  for(unsigned int i=0; i< myKSPointelList.size();i++)
478  {
479  //if (!myKSPointelList.at(i).isSigned) // for the moment, same for Signed or NonSigned
480  {
481  {
482  cairo_save (cr);
483 
484  cairo_set_source_rgba (cr, myKSPointelList.at(i).R/255.0, myKSPointelList.at(i).G/255.0, myKSPointelList.at(i).B/255.0, myKSPointelList.at(i).T/255.0);
485  cairo_set_line_width (cr, 1.); // arbitraire car non set
486 
487  double x1, y1, x2, y2, x3, y3, x4, y4;
488  //double width=myKSPointelList.at(i).size/120.; // arbitraire
489  double width=0.04; // arbitraire
490 
491  //z+
492  project(myKSPointelList.at(i).x-width, myKSPointelList.at(i).y+width, myKSPointelList.at(i).z+width, x1, y1);
493  project(myKSPointelList.at(i).x+width, myKSPointelList.at(i).y+width, myKSPointelList.at(i).z+width, x2, y2);
494  project(myKSPointelList.at(i).x+width, myKSPointelList.at(i).y-width, myKSPointelList.at(i).z+width, x3, y3);
495  project(myKSPointelList.at(i).x-width, myKSPointelList.at(i).y-width, myKSPointelList.at(i).z+width, x4, y4);
496  cairo_move_to (cr, x1, y1); cairo_line_to (cr, x2, y2); cairo_line_to (cr, x3, y3); cairo_line_to (cr, x4, y4); cairo_line_to (cr, x1, y1); cairo_close_path (cr); myModes["Board3DTo2D"]=="SolidMode"?cairo_fill (cr):cairo_stroke (cr);
497  //z-
498  project(myKSPointelList.at(i).x-width, myKSPointelList.at(i).y+width, myKSPointelList.at(i).z-width, x1, y1);
499  project(myKSPointelList.at(i).x+width, myKSPointelList.at(i).y+width, myKSPointelList.at(i).z-width, x2, y2);
500  project(myKSPointelList.at(i).x+width, myKSPointelList.at(i).y-width, myKSPointelList.at(i).z-width, x3, y3);
501  project(myKSPointelList.at(i).x-width, myKSPointelList.at(i).y-width, myKSPointelList.at(i).z-width, x4, y4);
502  cairo_move_to (cr, x1, y1); cairo_line_to (cr, x2, y2); cairo_line_to (cr, x3, y3); cairo_line_to (cr, x4, y4); cairo_line_to (cr, x1, y1); cairo_close_path (cr); myModes["Board3DTo2D"]=="SolidMode"?cairo_fill (cr):cairo_stroke (cr);
503  //x+
504  project(myKSPointelList.at(i).x+width, myKSPointelList.at(i).y-width, myKSPointelList.at(i).z+width, x1, y1);
505  project(myKSPointelList.at(i).x+width, myKSPointelList.at(i).y+width, myKSPointelList.at(i).z+width, x2, y2);
506  project(myKSPointelList.at(i).x+width, myKSPointelList.at(i).y+width, myKSPointelList.at(i).z-width, x3, y3);
507  project(myKSPointelList.at(i).x+width, myKSPointelList.at(i).y-width, myKSPointelList.at(i).z-width, x4, y4);
508  cairo_move_to (cr, x1, y1); cairo_line_to (cr, x2, y2); cairo_line_to (cr, x3, y3); cairo_line_to (cr, x4, y4); cairo_line_to (cr, x1, y1); cairo_close_path (cr); myModes["Board3DTo2D"]=="SolidMode"?cairo_fill (cr):cairo_stroke (cr);
509  //x-
510  project(myKSPointelList.at(i).x-width, myKSPointelList.at(i).y-width, myKSPointelList.at(i).z+width, x1, y1);
511  project(myKSPointelList.at(i).x-width, myKSPointelList.at(i).y+width, myKSPointelList.at(i).z+width, x2, y2);
512  project(myKSPointelList.at(i).x-width, myKSPointelList.at(i).y+width, myKSPointelList.at(i).z-width, x3, y3);
513  project(myKSPointelList.at(i).x-width, myKSPointelList.at(i).y-width, myKSPointelList.at(i).z-width, x4, y4);
514  cairo_move_to (cr, x1, y1); cairo_line_to (cr, x2, y2); cairo_line_to (cr, x3, y3); cairo_line_to (cr, x4, y4); cairo_line_to (cr, x1, y1); cairo_close_path (cr); myModes["Board3DTo2D"]=="SolidMode"?cairo_fill (cr):cairo_stroke (cr);
515  //y+
516  project(myKSPointelList.at(i).x-width, myKSPointelList.at(i).y+width, myKSPointelList.at(i).z+width, x1, y1);
517  project(myKSPointelList.at(i).x+width, myKSPointelList.at(i).y+width, myKSPointelList.at(i).z+width, x2, y2);
518  project(myKSPointelList.at(i).x+width, myKSPointelList.at(i).y+width, myKSPointelList.at(i).z-width, x3, y3);
519  project(myKSPointelList.at(i).x-width, myKSPointelList.at(i).y+width, myKSPointelList.at(i).z-width, x4, y4);
520  cairo_move_to (cr, x1, y1); cairo_line_to (cr, x2, y2); cairo_line_to (cr, x3, y3); cairo_line_to (cr, x4, y4); cairo_line_to (cr, x1, y1); cairo_close_path (cr); myModes["Board3DTo2D"]=="SolidMode"?cairo_fill (cr):cairo_stroke (cr);
521  //y-
522  project(myKSPointelList.at(i).x-width, myKSPointelList.at(i).y-width, myKSPointelList.at(i).z+width, x1, y1);
523  project(myKSPointelList.at(i).x+width, myKSPointelList.at(i).y-width, myKSPointelList.at(i).z+width, x2, y2);
524  project(myKSPointelList.at(i).x+width, myKSPointelList.at(i).y-width, myKSPointelList.at(i).z-width, x3, y3);
525  project(myKSPointelList.at(i).x-width, myKSPointelList.at(i).y-width, myKSPointelList.at(i).z-width, x4, y4);
526  cairo_move_to (cr, x1, y1); cairo_line_to (cr, x2, y2); cairo_line_to (cr, x3, y3); cairo_line_to (cr, x4, y4); cairo_line_to (cr, x1, y1); cairo_close_path (cr); myModes["Board3DTo2D"]=="SolidMode"?cairo_fill (cr):cairo_stroke (cr);
527 
528  cairo_restore (cr);
529  }
530  }
531  }
532 
533  if (type==CairoPNG)
534  cairo_surface_write_to_png (surface, filename);
535 
536  cairo_destroy (cr);
537  cairo_surface_destroy (surface);
538 }
539 
543 void
545 {
546  createNewVoxelList(true);
547 
548  vector<lineD3D> listeLine;
549  myLineSetList.push_back(listeLine);
550 
551  vector<pointD3D> listePoint;
552  myPointSetList.push_back(listePoint);
553 
554  myCurrentFillColor = DGtal::Color (220, 220, 220);
555  myCurrentLineColor = DGtal::Color (22, 22, 222, 50);
556 
557  /*createNewVoxelList(true);
558  std::vector<voxelD3D> aKSVoxelList;*/
559 
560  myDefaultColor= DGtal::Color(255, 255, 255);
561 
562  //
563 
564  camera_position[0] = 5.000000; camera_position[1] = 5.000000; camera_position[2] = 29.893368;
565  camera_direction[0] = 0.000000; camera_direction[1] = 0.000000; camera_direction[2] = -1.000000;
566  camera_upVector[0] = 0.000000; camera_upVector[1] = 1.000000; camera_upVector[2] = 0.000000;
567 
568  ZNear = 0.001;
569  ZFar = 100.0;
570  //ZNear = 4.578200;
571  //ZFar = 22.578199;
572 
573  myModes["Board3DTo2D"]="SolidMode";
574 }
575