Files Classes Functions Hierarchy
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
1.5.8