proj home

Files   Classes   Functions   Hierarchy  

tetrahedrondisplay.h

Go to the documentation of this file.
00001 #ifndef TETRAHEDRONDISPLAY_H
00002 #define TETRAHEDRONDISPLAY_H
00003 
00004 #include <gobj.h>
00005 #include <mathlib.h>
00006 #include <tetrahedron.h>
00007 #include <triangle.h>
00008 #include <triangledisplay.h>
00009 
00010 
00019 template< typename TET >
00020 class tetrahedrondisplay : public gobj
00021 {
00022 public:
00023 
00025   gobjContainer & gx;
00027   TET const & tr;
00028 
00030   bool mesh;
00032   bool centroid;
00033 
00034   bool test;
00035 
00037   bool trianglecenterpoints;
00038 
00039   bool trianglecenters;
00040 
00042   tetrahedrondisplay
00043   ( 
00044     gobjContainer & _gx, 
00045     TET const & _tr
00046   ) : gx(_gx), tr(_tr), mesh(1), centroid(1), test(1),
00047       trianglecenterpoints(0), trianglecenters(0) {}
00048 
00050   void turnon();
00051   
00053   void draw();
00054 };
00055 
00056 
00060 template< typename TET >
00061 class tetrahedrondisplaymesh : public gobj
00062 {
00064   gobjContainer & gx;
00066   TET const & tr;
00067 public:
00068 
00070   tetrahedrondisplaymesh
00071   ( 
00072     gobjContainer & _gx, 
00073     TET const & _tr
00074   ) : gx(_gx), tr(_tr) {}
00075   
00077   void draw();
00078 };
00079 
00084 template< typename TET >
00085 class tetrahedrondisplaycentroid : public gobj
00086 {
00088   gobjContainer & gx;
00090   TET const & tr;
00091 public:
00092 
00094   tetrahedrondisplaycentroid
00095   ( 
00096     gobjContainer & _gx, 
00097     TET const & _tr
00098   ) : gx(_gx), tr(_tr) {}
00099   
00101   void draw();
00102 };
00103 
00107 template< typename TET >
00108 class tetrahedrondisplaytest : public gobj
00109 {
00111   gobjContainer & gx;
00113   TET const & tr;
00114 public:
00115 
00117   tetrahedrondisplaytest
00118   ( 
00119     gobjContainer & _gx, 
00120     TET const & _tr
00121   ) : gx(_gx), tr(_tr) {}
00122   
00124   void draw();
00125 };
00126 
00130 template< typename TET, typename TD >
00131 class tetrahedrontriangledisplay : public gobj
00132 {
00134   gobjContainer & gx;
00136   TET const & tr;
00137 public:
00138 
00139   typedef triangle3D
00140   <
00141     typename TET::PTtype,
00142     typename TET::PDtype 
00143   > triType;
00144 
00146   TD * tdi[4];
00148   triType ti[4];
00149 
00152   #define tetrahedrontriangledisplaytdimacro(tet,xarg) \
00153   for (uint i=0; i<4; ++i ) tet.tdi[i]->xarg
00154 
00156   tetrahedrontriangledisplay
00157   ( 
00158     gobjContainer & _gx, 
00159     TET const & _tr
00160   ) : gx(_gx), tr(_tr) 
00161   {
00162     for (uint i=0; i<4; ++i)
00163     {
00164       tr.trianglei(ti[i],i);
00165       tdi[i] = new TD(gx,ti[i]);
00166     }
00167   }
00168   
00170   ~tetrahedrontriangledisplay()
00171   {
00172     for (uint i=0; i<4; ++i)
00173       delete tdi[i];
00174   }
00175 
00177   void draw();
00178 };
00179 
00180 //--------------------------------------------------------- 
00181 // Implementation
00182 
00183 template< typename TET >
00184 void tetrahedrondisplaytest<TET>::draw()
00185 {
00186   gx.push( new gobjglColor3ub(0,0,139) );
00187 
00188   gobjQuadric * gd = new gobjQuadric();
00189   gd->radius=.02;
00190   gx.push( gd );
00191 
00192   typename TET::PTtype e0;
00193   tr.equilaterali(e0,0);
00194   typename TET::PTtype e1;
00195   tr.equilaterali(e1,1);
00196   typename TET::PTtype e2;
00197   tr.equilaterali(e2,2);
00198   typename TET::PTtype e3;
00199   tr.equilaterali(e3,3);
00200 
00201   gx.push( new gobjMySphereDraw(e0,gd) );
00202   gx.push( new gobjMySphereDraw(e1,gd) );
00203   gx.push( new gobjMySphereDraw(e2,gd) );
00204   gx.push( new gobjMySphereDraw(e3,gd) );
00205 
00206   gx.push( new gobjglBegin(GL_LINES) );
00207   gx.push( new gobjglVertex3f(tr.pi[1]) );
00208   gx.push( new gobjglVertex3f(e0) );
00209   gx.push( new gobjglVertex3f(tr.pi[2]) );
00210   gx.push( new gobjglVertex3f(e0) );
00211   gx.push( new gobjglVertex3f(tr.pi[3]) );
00212   gx.push( new gobjglVertex3f(e0) );
00213 
00214   gx.push( new gobjglVertex3f(tr.pi[0]) );
00215   gx.push( new gobjglVertex3f(e1) );
00216   gx.push( new gobjglVertex3f(tr.pi[2]) );
00217   gx.push( new gobjglVertex3f(e1) );
00218   gx.push( new gobjglVertex3f(tr.pi[3]) );
00219   gx.push( new gobjglVertex3f(e1) );
00220 
00221   gx.push( new gobjglVertex3f(tr.pi[0]) );
00222   gx.push( new gobjglVertex3f(e2) );
00223   gx.push( new gobjglVertex3f(tr.pi[1]) );
00224   gx.push( new gobjglVertex3f(e2) );
00225   gx.push( new gobjglVertex3f(tr.pi[3]) );
00226   gx.push( new gobjglVertex3f(e2) );
00227 
00228   gx.push( new gobjglVertex3f(tr.pi[0]) );
00229   gx.push( new gobjglVertex3f(e3) );
00230   gx.push( new gobjglVertex3f(tr.pi[1]) );
00231   gx.push( new gobjglVertex3f(e3) );
00232   gx.push( new gobjglVertex3f(tr.pi[2]) );
00233   gx.push( new gobjglVertex3f(e3) );
00234 
00235 
00236   gx.push( new gobjglEnd() );
00237 
00238 
00239   gx.push( new gobjglColor3ub(148,0,211) );
00240   gx.push( new gobjglBegin(GL_LINES) );
00241   gx.push( new gobjglVertex3f(tr.pi[0]) );
00242   gx.push( new gobjglVertex3f(e0) );
00243   gx.push( new gobjglVertex3f(tr.pi[1]) );
00244   gx.push( new gobjglVertex3f(e1) );
00245   gx.push( new gobjglVertex3f(tr.pi[2]) );
00246   gx.push( new gobjglVertex3f(e2) );
00247   gx.push( new gobjglVertex3f(tr.pi[3]) );
00248   gx.push( new gobjglVertex3f(e3) );
00249 
00250 
00251   gx.push( new gobjglEnd() );
00252 
00253 
00254   typedef triangle3D
00255   <
00256     typename TET::PTtype,
00257     typename TET::PDtype 
00258   > triType;
00259 
00260   triType t0;
00261 
00262   tr.trianglei(t0,0);
00263 
00264 
00265 //  triangledisplaypoints<triType> td(gx,t0);
00266 /*
00267   td.turnon();
00268   td.draw();
00269 */
00270 
00271 }
00272 
00273 template< typename TET >
00274 void tetrahedrondisplaymesh<TET>::draw()
00275 {
00276   gx.push( new gobjglColor3ub(0,0,255) );
00277 
00278   gx.push( new gobjglBegin(GL_LINES) );
00279   gx.push( new gobjglVertex3f(tr.pi[0]) );
00280   gx.push( new gobjglVertex3f(tr.pi[1]) );
00281   gx.push( new gobjglVertex3f(tr.pi[0]) );
00282   gx.push( new gobjglVertex3f(tr.pi[2]) );
00283   gx.push( new gobjglVertex3f(tr.pi[0]) );
00284   gx.push( new gobjglVertex3f(tr.pi[3]) );
00285   gx.push( new gobjglVertex3f(tr.pi[1]) );
00286   gx.push( new gobjglVertex3f(tr.pi[2]) );
00287   gx.push( new gobjglVertex3f(tr.pi[1]) );
00288   gx.push( new gobjglVertex3f(tr.pi[3]) );
00289   gx.push( new gobjglVertex3f(tr.pi[2]) );
00290   gx.push( new gobjglVertex3f(tr.pi[3]) );
00291 
00292   gx.push( new gobjglEnd() );
00293 }
00294 
00295 template< typename TET >
00296 void tetrahedrondisplaycentroid<TET>::draw()
00297 {
00298   gx.push( new gobjglColor3ub(0,255,0) );
00299 
00300   gobjQuadric * gd = new gobjQuadric();
00301   gd->radius=.02;
00302   gx.push( gd );
00303 
00304   typename TET::PTtype c;
00305   tr.centroid(c);
00306 
00307   typename TET::PTtype c0 = (tr.pi[1]+tr.pi[2]+tr.pi[3])/3.0;
00308   typename TET::PTtype c1 = (tr.pi[0]+tr.pi[2]+tr.pi[3])/3.0;
00309   typename TET::PTtype c2 = (tr.pi[1]+tr.pi[0]+tr.pi[3])/3.0;
00310   typename TET::PTtype c3 = (tr.pi[1]+tr.pi[0]+tr.pi[2])/3.0;
00311 
00312   gx.push( new gobjMySphereDraw(c,gd) );
00313 
00314   gx.push( new gobjglBegin(GL_LINES) );
00315   gx.push( new gobjglVertex3f(tr.pi[0]) );
00316   gx.push( new gobjglVertex3f(c0) );
00317   gx.push( new gobjglVertex3f(tr.pi[1]) );
00318   gx.push( new gobjglVertex3f(c1) );
00319   gx.push( new gobjglVertex3f(tr.pi[2]) );
00320   gx.push( new gobjglVertex3f(c2) );
00321   gx.push( new gobjglVertex3f(tr.pi[3]) );
00322   gx.push( new gobjglVertex3f(c3) );
00323   gx.push( new gobjglEnd() );
00324 
00325 }
00326 
00327 
00328 /*
00329 // <TODO> This is displaying a triangle face.
00330 
00331   typedef triangle3D
00332   <
00333     typename TET::PTtype,
00334     typename TET::PDtype 
00335   > triType;
00336 
00337   triType t0;
00338   tr.trianglei(t0,0);
00339 
00340   //triangledisplaypoints<triType> td(gx,t0);
00341   triangledisplay<triType> td(gx,t0);
00342 
00343   td.turnon();
00344   td.draw();
00345 
00346 */
00347 
00348 
00349 template< typename TET >
00350 void tetrahedrondisplay<TET>::turnon()
00351 {
00352   mesh=true;
00353   centroid=true;
00354   test=true;
00355   trianglecenterpoints=true;
00356   trianglecenters=true;
00357 }
00358 
00359 
00360 template< typename TET >
00361 void tetrahedrondisplay<TET>::draw()
00362 {
00363   vector< gobj* > vi;
00364 
00365   if (mesh)
00366     vi.push_back(new tetrahedrondisplaymesh<TET>(gx,tr));
00367   if (centroid)
00368     vi.push_back(new tetrahedrondisplaycentroid<TET>(gx,tr));
00369   if (test)
00370     vi.push_back(new tetrahedrondisplaytest<TET>(gx,tr));
00371   if (trianglecenterpoints)
00372   {
00373 
00374     typedef triangledisplaypoints
00375       < triangle3D< typename TET::PTtype, typename TET::PDtype > > 
00376       tridisptype;
00377 //    typedef tetrahedron<typename TET::PTtype, typename TET::PDtype> 
00378 //      tettype;
00379 
00380     tetrahedrontriangledisplay< TET, tridisptype > tetd(gx,tr);
00381     tetrahedrontriangledisplaytdimacro(tetd, turnon() ); 
00382     tetd.draw();
00383   }
00384   if (trianglecenters)
00385   {
00386     typedef triangledisplay
00387       < triangle3D< typename TET::PTtype, typename TET::PDtype > > 
00388       tridisptype;
00389 
00390     tetrahedrontriangledisplay< TET, tridisptype > tetd(gx,tr);
00391     tetrahedrontriangledisplaytdimacro(tetd, turnon() ); 
00392     tetd.draw();
00393   } 
00394 
00395   for (uint i=0; i<vi.size(); ++i)
00396   {
00397     vi[i]->draw();
00398     delete vi[i];
00399   }
00400 }
00401 
00402 template< typename TET, typename TD >
00403 void tetrahedrontriangledisplay<TET,TD>::draw()
00404 {
00405   for (uint i=0; i<4; ++i)
00406   {
00407     assert(tdi[i]!=0);
00408     tdi[i]->draw();
00409   }
00410 }
00411 
00412 #endif
00413 
00414 

Generated on Fri Mar 4 00:49:30 2011 for Chelton Evans Source by  doxygen 1.5.8