proj home

Files   Classes   Functions   Hierarchy  

primshpcenters.h

Go to the documentation of this file.
00001 #ifndef PRIMSHPCENTERS_H
00002 #define PRIMSHPCENTERS_H
00003 
00004 
00005 #include <tetrahedron.h>
00006 
00007 #include <gobj.h>
00008 #include <mathlib.h>
00009 
00010 
00011 //  Display the triangles centers and mesh.
00012 //  Configure by setting the boolean flags.
00013 //  Then call eval() to post the graphics.
00014 
00015 #define SQUARED(X) ((X)*(X))
00016 
00017 
00018 
00019 template< typename T >
00020 class visualize_tetrahedron
00021 {
00022   gobjContainer & gX;
00023   tetrahedron<T> const & t;
00024 public:
00025 
00026   // Display the triangle.
00027   bool mesh_on;
00028   // Display the midpoints.
00029   bool midpoints_on;
00030   // Display the centroid. 
00031   bool midpoint_center_on;
00032   // Display the altitudes to there opposite points, 
00033   // and the orthocenter.
00034   bool altitude_to_point_on;
00035   // Display the circumcenter.
00036   bool altitude_on;
00037 
00038   bool innersphere_on;
00039 
00040   bool outersphere_on;
00041 
00042   // Constructor with basic defaults.
00043   visualize_tetrahedron
00044   (
00045     gobjContainer & _gX,
00046     tetrahedron<T> const & _t
00047   );
00048 
00049   // Evaluate or send the graphics to
00050   void eval() const;
00051 
00052 };
00053 
00054 
00055 
00056 // --------------------------------------------------------- 
00057 // Implementation
00058 //
00059 
00060 
00061 
00062 template< typename T >
00063 visualize_tetrahedron<T>::visualize_tetrahedron
00064 (
00065   gobjContainer & _gX,
00066   tetrahedron<T> const & _t
00067 )
00068   : gX(_gX), t(_t), mesh_on(true), midpoints_on(true),
00069     midpoint_center_on(true), altitude_to_point_on(true),
00070     altitude_on(true), innersphere_on(true), outersphere_on(true)
00071 {
00072 }
00073 
00074 
00075 template< typename T >
00076 void visualize_tetrahedron<T>::eval() const 
00077 {
00078   gX.push_back( new gobjglDisable(GL_LIGHTING) );
00079 
00080   if (mesh_on)
00081   {
00082   gX.push_back( new gobjglColor3f(0.0,0.0,1.0) );
00083 
00084   gX.push_back( new gobjglBegin(GL_LINES) );
00085 
00086   gX.push_back( new gobjglVertex3f(t.pi[0]) );
00087   gX.push_back( new gobjglVertex3f(t.pi[1]) );
00088   gX.push_back( new gobjglVertex3f(t.pi[0]) );
00089   gX.push_back( new gobjglVertex3f(t.pi[2]) );
00090   gX.push_back( new gobjglVertex3f(t.pi[0]) );
00091   gX.push_back( new gobjglVertex3f(t.pi[3]) );
00092   gX.push_back( new gobjglVertex3f(t.pi[1]) );
00093   gX.push_back( new gobjglVertex3f(t.pi[2]) );
00094   gX.push_back( new gobjglVertex3f(t.pi[1]) );
00095   gX.push_back( new gobjglVertex3f(t.pi[3]) );
00096   gX.push_back( new gobjglVertex3f(t.pi[2]) );
00097   gX.push_back( new gobjglVertex3f(t.pi[3]) );
00098 
00099   gX.push_back( new gobjglEnd() );
00100   }
00101 
00102   point3<double> m0 = t.midpoint(0);
00103   point3<double> m1 = t.midpoint(1);
00104   point3<double> m2 = t.midpoint(2);
00105   point3<double> m3 = t.midpoint(3);
00106 
00107 
00108   gobjQuadric* gd = new gobjQuadric();
00109   gd->radius=.02;
00110   gX.push_back( gd );
00111 
00112   if (outersphere_on)
00113   {
00114   gX.push_back( new gobjglColor3ub(255,20,147) );
00115   point3<double> c1 = t.circumcenter();
00116   gX.push_back( new gobjMySphereDraw(c1,gd) );
00117 for (uint i=0; i<4; ++i)
00118   cout << (c1-t.pi[i]).distance() << endl;
00119   }
00120 
00121   if (midpoints_on)
00122   {
00123   gX.push_back( new gobjglColor3ub(255,0,255) );
00124   gX.push_back( new gobjMySphereDraw(m0,gd) );
00125   gX.push_back( new gobjMySphereDraw(m1,gd) );
00126   gX.push_back( new gobjMySphereDraw(m2,gd) );
00127   gX.push_back( new gobjMySphereDraw(m3,gd) );
00128   }
00129 
00130   if (midpoint_center_on)
00131   {
00132   gX.push_back( new gobjglColor3ub(0,255,0) );
00133   gX.push_back( new gobjglBegin(GL_LINES) );
00134   gX.push_back( new gobjglVertex3f(t.pi[0]) );
00135   gX.push_back( new gobjglVertex3f(m0) );
00136   gX.push_back( new gobjglVertex3f(t.pi[1]) );
00137   gX.push_back( new gobjglVertex3f(m1) );
00138   gX.push_back( new gobjglVertex3f(t.pi[2]) );
00139   gX.push_back( new gobjglVertex3f(m2) );
00140   gX.push_back( new gobjglVertex3f(t.pi[3]) );
00141   gX.push_back( new gobjglVertex3f(m3) );
00142   gX.push_back( new gobjglEnd() );
00143   }
00144 
00145 
00146   point3<double> alt0 = t.verticiespoint(0);
00147   point3<double> alt1 = t.verticiespoint(1);
00148   point3<double> alt2 = t.verticiespoint(2);
00149   point3<double> alt3 = t.verticiespoint(3);
00150 
00151   if (altitude_to_point_on)
00152   {
00153   gX.push_back( new gobjglColor3ub(255,215,0) );
00154   //gX.push_back( new gobjMySphereDraw(alt0,gd) );
00155   gX.push_back( new gobjMySphereDraw(alt1,gd) );
00156   gX.push_back( new gobjMySphereDraw(alt2,gd) );
00157   gX.push_back( new gobjMySphereDraw(alt3,gd) );
00158 
00159 
00160 
00161   gX.push_back( new gobjglBegin(GL_LINES) );
00162   gX.push_back( new gobjglVertex3f(t.pi[0]) );
00163   gX.push_back( new gobjglVertex3f(alt0) );
00164   gX.push_back( new gobjglVertex3f(t.pi[1]) );
00165   gX.push_back( new gobjglVertex3f(alt1) );
00166   gX.push_back( new gobjglVertex3f(t.pi[2]) );
00167   gX.push_back( new gobjglVertex3f(alt2) );
00168   gX.push_back( new gobjglVertex3f(t.pi[3]) );
00169   gX.push_back( new gobjglVertex3f(alt3) );
00170   gX.push_back( new gobjglEnd() );
00171   }
00172 
00173 /*
00174 
00175   if (innersphere_on)
00176   {
00177   point3<double> b0 = t.bisectangle(0);
00178   point3<double> b1 = t.bisectangle(1);
00179   point3<double> b2 = t.bisectangle(2);
00180   point3<double> b3 = t.bisectangle(3);
00181   gX.push_back( new gobjglColor3ub(127,255,212) );
00182   gX.push_back( new gobjMySphereDraw(b0,gd) );
00183   gX.push_back( new gobjMySphereDraw(b1,gd) );
00184   gX.push_back( new gobjMySphereDraw(b2,gd) );
00185   gX.push_back( new gobjMySphereDraw(b3,gd) );
00186 
00187 
00188 
00189 //  point2<double> x;
00190 //  double r;
00191 //  t.innercircle(x,r);
00192 //  gX.push_back( new gobjMySphereDraw(x,gd) );
00193 //  gX.push_back( new gobjMyCircleDraw(r,point3<double>(x),*gc) );
00194 
00195 
00196 
00197   gX.push_back( new gobjglBegin(GL_LINES) );
00198   gX.push_back( new gobjglVertex3f(t.pi[0]) );
00199   gX.push_back( new gobjglVertex3f(b0) );
00200 
00201   gX.push_back( new gobjglVertex3f(t.pi[1]) );
00202   gX.push_back( new gobjglVertex3f(b1) );
00203   gX.push_back( new gobjglVertex3f(t.pi[2]) );
00204   gX.push_back( new gobjglVertex3f(b2) );
00205   gX.push_back( new gobjglVertex3f(t.pi[3]) );
00206   gX.push_back( new gobjglVertex3f(b3) );
00207 
00208   gX.push_back( new gobjglEnd() );
00209   }
00210 */
00211 
00212 /*
00213   {
00214     double a[12];
00215 
00216 //    a[0] = t.pi[1].x - t.pi[2].x;  a[1] = t.pi[1].y - t.pi[2].y;  a[2] = t.pi[1].z - t.pi[2].z; 
00217 //    a[3] = (t.pi[1].dot() - t.pi[2].dot())*0.5;
00218 //    a[4] = t.pi[0].x - t.pi[2].x;  a[5] = t.pi[0].y - t.pi[2].y;  a[6] = t.pi[0].z - t.pi[2].z; 
00219 //    a[7] = (t.pi[0].dot() - t.pi[2].dot())*0.5;
00220 //    a[8] = t.pi[0].x - t.pi[1].x;  a[9] = t.pi[0].y - t.pi[1].y;  a[10] = t.pi[0].z - t.pi[1].z; 
00221 //    a[11] = (t.pi[0].dot() - t.pi[1].dot())*0.5;
00222 
00223     a[0] = t.pi[0].x; a[1] = t.pi[0].y; a[2] = t.pi[0].z; a[3] = t.pi[0].dot()*0.5;
00224     a[4] = t.pi[1].x; a[5] = t.pi[1].y; a[6] = t.pi[1].z; a[7] = t.pi[1].dot()*0.5;
00225     a[8] = t.pi[2].x; a[9] = t.pi[2].y; a[10] = t.pi[2].z; a[11] = t.pi[2].dot()*0.5;
00226 
00227     gausselim<double,3> g(a,1E-14);
00228 
00229     bool res = g.eval();
00230     cout << SHOW(res) << endl;
00231     g.print();
00232 
00233 
00234   }
00235 */
00236 
00237   point3<double> a,b,c;
00238   a = t.pi[3] - t.pi[0];
00239   c = t.pi[1] - t.pi[0];
00240   b = t.pi[2] - t.pi[0];
00241 
00242   crossprod< point3<double> > cross;
00243   point3<double> N0,N1,N2,N3;
00244   cross(N0,a-b,c-b);
00245   cross(N1,a,b);
00246   cross(N2,a,c);
00247   cross(N3,b,c);
00248 
00249   point3<double> cc0 = t.circumcenter(0);
00250   point3<double> cc1 = t.circumcenter(1);
00251   point3<double> cc2 = t.circumcenter(2);
00252   point3<double> cc3 = t.circumcenter(3);
00253 
00254   gX.push_back( new gobjglColor3ub(220,20,60) );
00255   gX.push_back( new gobjMySphereDraw(cc0,gd) );
00256   gX.push_back( new gobjMySphereDraw(cc1,gd) );
00257   gX.push_back( new gobjMySphereDraw(cc2,gd) );
00258   gX.push_back( new gobjMySphereDraw(cc3,gd) );
00259 
00260 
00261 
00262 
00263 
00264 /*
00265   // Looking at perpendicular line through midpoints.
00266   gX.push_back( new gobjglColor3ub(255,0,0) );
00267   gX.push_back( new gobjglBegin(GL_LINES) );
00268   gX.push_back( new gobjglVertex3f(m0+N0*-1.0) );
00269   gX.push_back( new gobjglVertex3f(m0+N0*1.0) );
00270   gX.push_back( new gobjglVertex3f(m1+N1*-1.0) );
00271   gX.push_back( new gobjglVertex3f(m1+N1*1.0) );
00272   gX.push_back( new gobjglVertex3f(m2+N2*-1.0) );
00273   gX.push_back( new gobjglVertex3f(m2+N2*1.0) );
00274   gX.push_back( new gobjglVertex3f(m3+N3*-1.0) );
00275   gX.push_back( new gobjglVertex3f(m3+N3*1.0) );
00276   gX.push_back( new gobjglEnd() );
00277 */
00278 
00279 
00280 /*
00281   {
00282     unsigned int n=9;
00283     double z[(n+1)*n];
00284     for (unsigned int i=0; i<(n+1)*n; ++i)
00285       z[i] = 0;
00286 
00287     unsigned int k = 0;
00288 
00289     z[k+0] = a.x;  z[k+1] = c.x;  z[k+2] = -b.x;  z[k+3] = -a.x;  
00290     z[k+8] = N1.x/N1.dot() - N2.x/N2.dot();
00291     k += n;
00292 
00293     z[k+0] = a.y;  z[k+1] = c.y;  z[k+2] = -b.y;  z[k+3] = -a.y;  
00294     z[k+8] = N1.y/N1.dot() - N2.y/N2.dot();
00295     k += n;
00296 
00297     z[k+0] = a.z;  z[k+1] = c.z;  z[k+2] = -b.z;  z[k+3] = -a.z;  
00298     z[k+8] = N1.z/N1.dot() - N2.z/N2.dot();
00299     k += n;
00300 
00301 
00302     z[k+4] = a.x - b.x;  z[k+5] = c.x - b.x;  z[k+6] = -b.x;  z[k+7] = c.x;
00303     z[k+8] = N3.x/N3.dot() - N0.z/N0.dot();
00304     k += n;
00305 
00306     z[k+4] = a.y - b.y;  z[k+5] = c.y - b.y;  z[k+6] = -b.y;  z[k+7] = c.y;
00307     z[k+8] = N3.y/N3.dot() - N0.y/N0.dot();
00308     k += n;
00309 
00310     z[k+4] = a.z - b.z;  z[k+5] = c.z - b.z;  z[k+6] = -b.z;  z[k+7] = c.z;
00311     z[k+8] = N3.z/N3.dot() - N0.z/N0.dot();
00312     k += n;
00313 
00314 
00315     z[k+0] = a.x;  z[k+1] = c.x;  z[k+6] = -b.x;  z[k+7] = -c.x; 
00316     z[k+8] = N1.x/N1.dot() - N0.x/N0.dot();
00317     k += n;
00318 
00319     z[k+0] = a.y;  z[k+1] = c.y;  z[k+6] = -b.y;  z[k+7] = -c.y; 
00320     z[k+8] = N1.y/N1.dot() - N0.y/N0.dot();
00321     k += n;
00322 
00323     z[k+0] = a.z;  z[k+1] = c.z;  z[k+6] = -b.z;  z[k+7] = -c.z; 
00324     z[k+8] = N1.z/N1.dot() - N0.z/N0.dot();
00325 
00326     gausselim<double,10> g(z,1E-14);
00327 
00328     bool res = g.eval();
00329     cout << SHOW(res) << endl;
00330     g.print();
00331   }
00332 */
00333 
00334 
00335 
00336 
00337 
00338 
00339 }
00340 
00341 #endif
00342 
00343 

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