Main Page | File List

Sphere.cpp

Go to the documentation of this file.
00001 /**
00002  *\file         Sphere.cpp
00003  *
00004  *\brief        
00005  *
00006  *\author       Xianming Chen
00007  *
00008  *\date         16 Jul 2004
00009  */
00010 
00011 
00012 #include "Sphere.h"
00013 #include "TriangleMesh.h"
00014 #include "xmath.h"
00015 
00016 
00017 namespace columbia
00018 {
00019 
00020   void TriangulateSphere(TriangleMesh &msh, int depth)
00021   {
00022     const float X = .525731112119133606;
00023     const float Z = .850650808352039932;
00024     float vdata[12][3] = {    
00025       {-X, 0.0, Z}, {X, 0.0, Z}, {-X, 0.0, -Z}, {X, 0.0, -Z},    
00026       {0.0, Z, X}, {0.0, Z, -X}, {0.0, -Z, X}, {0.0, -Z, -X},    
00027       {Z, X, 0.0}, {-Z, X, 0.0}, {Z, -X, 0.0}, {-Z, -X, 0.0} 
00028     };
00029     int tindices[20][3] = { 
00030       {0,4,1}, {0,9,4}, {9,5,4}, {4,5,8}, {4,8,1},    
00031       {8,10,1}, {8,3,10}, {5,3,8}, {5,2,3}, {2,7,3},    
00032       {7,10,3}, {7,6,10}, {7,11,6}, {11,0,6}, {0,1,6}, 
00033       {6,1,10}, {9,0,11}, {9,11,2}, {9,2,5}, {7,2,11} };
00034 
00035     msh.V.clear(), msh.N.clear(), msh.T.clear(), msh.F.clear();
00036     
00037     for(int i=0; i<12; i++)
00038     {
00039       msh.V.push_back( Vertex(vdata[i][0], vdata[i][1], vdata[i][2]) );
00040     }
00041   
00042     for(int i=0; i<20; i++)
00043     {
00044       msh.F.push_back( TriangleFace(tindices[i][0], tindices[i][1], tindices[i][2],  -1, -1, -1, tindices[i][0], tindices[i][1], tindices[i][2]) );
00045     }
00046     for(int d=1; d<depth; d++)  
00047     {
00048       int faces = msh.F.size();
00049       for(int f=0; f < faces; ++f)
00050       {
00051         int i = msh.F[0].i, j = msh.F[0].j, k = msh.F[0].k;
00052         
00053         Vertex v1 = msh.V[i];
00054         Vertex v2 = msh.V[j];
00055         Vertex v3 = msh.V[k];
00056 
00057         Vertex v12 = ((v1 + v2) / 2).GetUnit();
00058         Vertex v13 = ((v1 + v3) / 2).GetUnit();
00059         Vertex v23 = ((v3 + v2) / 2).GetUnit();
00060 
00061         int ij = msh.V.size();
00062         msh.V.push_back(v12);
00063         
00064         int ik = msh.V.size();
00065         msh.V.push_back(v13);
00066         
00067         int jk = msh.V.size();
00068         msh.V.push_back(v23);
00069         
00070         msh.F.erase( msh.F.begin() );
00071         
00072         msh.F.push_back( TriangleFace(i, ik, ij,  -1, -1, -1, i, ik, ij) );
00073         msh.F.push_back( TriangleFace(j, jk, ij,  -1, -1, -1, j, jk, ij) );
00074         msh.F.push_back( TriangleFace(k, ik, jk,  -1, -1, -1, k, ik, jk) );
00075         msh.F.push_back( TriangleFace(jk, ik,ij,  -1, -1, -1, jk, ik,ij) );
00076       }
00077     }
00078     msh.N = msh.V;
00079     msh.init();
00080   }
00081 
00082     
00083   void ParametrizeSphere(TriangleMesh & msh, int slicesV, int slicesH)
00084   {
00085     msh.V.clear(), msh.N.clear(), msh.T.clear(), msh.F.clear();
00086     
00087     double theta_step = pi / slicesV, theta = theta_step;
00088     msh.V.push_back( Vertex(0, -1, 0) );                         // south pole
00089     for(int i = 1; i < slicesV; ++i, theta += theta_step)
00090     {
00091       double phi = 0, phi_step = 2 * pi / slicesH;
00092 
00093       for(int j = 0; j < slicesH; ++j, phi += phi_step)
00094       {
00095         msh.V.push_back( Vertex(sin(theta) * sin(phi-pi),  -cos(theta), sin(theta) * cos(phi-pi) ) );
00096         msh.T.push_back( Vertex(phi / (2*pi), theta / pi) );
00097       }
00098       msh.T.push_back( Vertex(1.0, theta / pi) );
00099     }
00100     msh.V.push_back( Vertex(0, 1, 0) );                         // north pole
00101 
00102 
00103     for(int i=0; i<slicesV; ++i)
00104     {
00105       for(int j=0; j<slicesH; ++j)
00106       {
00107         int tex0 = i * (slicesH+1) + j;                                     // tex indices
00108         int tex1 = tex0 + 1;
00109         int tex2 = tex1 + (slicesH+1);
00110         int tex3 = tex2 - 1;         
00111 
00112         if(i==0)
00113         {
00114           msh.F.push_back( TriangleFace(0,    j,    j+1 == slicesH ? 0 : j+1,
00115                                         tex0, tex1, tex2,      
00116                                         0,    j,    j+1 == slicesH ? 0 : j+1) );               // same indices for normals as for vertices.
00117           continue;
00118         }
00119 
00120         // cur quad is (i,j) to (i+1, j+1).
00121         // (i,j) vertex has an index = i * slicesH + j 
00122         int idx0 = 1 + (i-1) * slicesH + j;
00123         int idx1 = idx0 + 1;
00124         int idx2 = idx1 + slicesH;
00125         int idx3 = idx2 - 1;                                                // idx0, idx1, idx2, idx3: counter clockwise order
00126 
00127         if(i+1 == slicesV)
00128         {
00129           msh.F.push_back( TriangleFace(idx0, j+1 == slicesH ? msh.V.size() - slicesH - 1 : idx1,  msh.V.size() - 1,
00130                                         tex0, tex1,                                                tex2,      
00131                                         idx0, j+1 == slicesH ? msh.V.size() - slicesH - 1 : idx1,  msh.V.size() - 1) );
00132           continue;
00133         }
00134           
00135         if(j+1 == slicesH)                                                                     // last vertex == first vertex in each horizontal direction.  
00136         {
00137           idx1 = 1 + (i-1) * slicesH, idx2 = 1 + i * slicesH;
00138         }
00139         
00140         msh.F.push_back( TriangleFace(idx0, idx1, idx2,                   // triangle (i,j)->(i, j+1)->(i+1, j+1)       
00141                                       tex0, tex1, tex2,      
00142                                       idx0, idx1, idx2) );                // same indices for normals.
00143 
00144         msh.F.push_back( TriangleFace(idx0, idx2, idx3,                   // triangle (i,j)->(i+1, j+1)->(i, j+1)       
00145                                       tex0, tex2, tex3,      
00146                                       idx0, idx2, idx3) );                // same indices for normals.
00147       }
00148     }
00149 
00150     msh.N = msh.V;
00151 
00152     msh.init();
00153   }
00154   
00155 
00156 }//end namespace xchen

Generated on Mon Jul 19 17:20:27 2004 by doxygen 1.3.6