TAPs 0.7.7.3
TAPsConverter.cpp
Go to the documentation of this file.
00001 /******************************************************************************
00002 TAPsConverter.cpp
00003 
00004 Converter class is a static class.
00005 See TAPsConverter.hpp for a detail description.
00006 
00007 SUKITTI PUNAK   (04/22/2005)
00008 UPDATE          (04/25/2005)
00009 ******************************************************************************/
00010 #include "TAPsConverter.hpp"
00011 // Using Inclusion Model (i.e. definitions are included in declarations)
00012 //                       (this name.cpp is included in name.hpp)
00013 // Each friend is defined directly inside its declaration.
00014 
00015 BEGIN_NAMESPACE_TAPs
00016 //=============================================================================
00017 //-----------------------------------------------------------------------------
00018 template <typename T>
00019 Point3<T> * Converter<T>::ConvertABezierPatchToAQuadMesh (  
00020     Point3<T> * bPts,           // i/p
00021     int uDegree, int vDegree,   // i/p
00022     int uSub, int vSub )        // i/p
00023 {
00024     //----------------------------------------------------------------
00025     // Allocate memory for meshPts
00026     int mSize = ( uSub+1 ) * ( vSub+1 );
00027     Point3<T> * meshPts = new Point3<T>[ mSize ];
00028     if ( !meshPts ) return NULL;
00029     //----------------------------------------------------------------
00030     // Allocate memory for bPts
00031     int bSize = (uDegree + 1) * (vDegree + 1);
00032     Point3<T> * bPts1 = new Point3<T>[ bSize ];
00033     Point3<T> * bPts2 = new Point3<T>[ bSize ];
00034     if ( !bPts1 || !bPts2 ) {
00035         delete [] bPts1;
00036         delete [] bPts2;
00037         return NULL;
00038     }
00039     //if ( !bPts )  return NULL;
00040     //----------------------------------------------------------------
00041     T uStep = static_cast<T>(1.0) / static_cast<T>(uSub);
00042     T vStep = static_cast<T>(1.0) / static_cast<T>(vSub);
00043     T u = 0, v;
00044     for ( int i = 0; i <= uSub; ++i, u += uStep ) {
00045         v = 0;
00046         for ( int j = 0; j <= vSub; ++j, v += vStep ) {
00047             // Reset Bezier (control) points
00048             for ( int p = 0; p < bSize; ++p ) {
00049                 bPts1[p] = bPts[p];
00050             }
00051             deCasteljauBiLinear( u, v, uDegree, vDegree, 
00052                     bPts1, bPts2, &meshPts[i*(vSub+1) + j] );
00053         }
00054     }
00055     delete [] bPts1;
00056     delete [] bPts2;
00057     return meshPts;
00058 }
00059 //-----------------------------------------------------------------------------
00060 template <typename T>
00061 void Converter<T>::deCasteljauBiLinear ( 
00062     T u, T v, int U, int V, // i/p
00063     Point3<T> * bPts_ip,    // i/o  bPts or control points
00064     Point3<T> * bPts_op,    // i/o
00065     Point3<T> * meshPt )    // o/p
00066 {
00067     deCasteljauBiLinearRec( u, v, U, V, bPts_ip, bPts_op, meshPt );
00068 }
00069 //-----------------------------------------------------------------------------
00070 template <typename T>
00071 void Converter<T>::deCasteljauBiLinearRec( 
00072     T u, T v, int U, int V,     // i/p
00073     Point3<T> * bPts_ip,        // i/p
00074     Point3<T> * bPts_op,        // o/p
00075     Point3<T> * meshPt )        // o/p
00076 {
00077     int inc = V + 1;
00078     T one = static_cast<T>( 1.0 );
00079     for ( int i = 0; i < U; ++i ) {
00080         for ( int j = 0; j < V; ++j ) {
00081             for ( int d = 0; d < 3; ++d ) {
00082                 bPts_op[i*V + j][d] = (one-v)*(  (one-u)* bPts_ip[i*inc +j][d] 
00083                                                 +     u * bPts_ip[(i+1)*inc +j][d] )
00084                                     +      v *(  (one-u)* bPts_ip[i*inc +j+1][d]
00085                                                 +     u * bPts_ip[(i+1)*inc +j+1][d] );
00086             }
00087         }
00088     }
00089     //----------------------------------------------------------------
00090     if ( U == 1 && V == 1 ) {
00091         *meshPt = bPts_op[0];
00092     }
00093     //else if ( U == 0 || V == 0 ) deCasteljauCurve
00094     else    deCasteljauBiLinearRec( u, v, U-1, V-1, bPts_op, bPts_ip, meshPt ); // swap i/p and o/p
00095 }
00096 //-----------------------------------------------------------------------------
00097 template <typename T>
00098 bool Converter<T>::WriteGridPtsAsQuadMeshToA10FormatFile ( 
00099     Point3<T> * gridPts, int uSize, int vSize, char * outFileName )
00100 {
00101     //----------------------------------------------------------------
00102     // Open the output file
00103     std::ofstream outFile ( outFileName, ios::out );
00104     if ( !outFile ) {
00105         std::cerr << "File could not be opened" << std::endl;
00106         return false;
00107     }
00108     //----------------------------------------------------------------
00109     // Write vertices
00110     outFile << uSize * vSize << "\n";       // write number of vertices
00111     int number = 0;
00112     for ( int u = 0; u < uSize; ++u ) { // write each vertex
00113         for ( int v = 0; v < vSize; ++v ) {
00114             outFile << ++number << "\t" 
00115                     << gridPts[ u*vSize + v ][0] << "\t"
00116                     << gridPts[ u*vSize + v ][1] << "\t"
00117                     << gridPts[ u*vSize + v ][2] << "\n";
00118         }
00119     }
00120     //----------------------------------------------------------------
00121     // Write quad faces
00122     int vDeg = vSize - 1;
00123     outFile << (uSize-1) * vDeg << "\n";    // write number of faces
00124     for ( int u = 0; u < uSize-1; ++u ) {   // write each face
00125         for ( int v = 0; v < vSize-1; ++v ) {
00126             outFile << 4 << "\t" 
00127                     <<  u*vSize + v + 1 << " "
00128                     << (u+1)*vSize + v + 1 << " "
00129                     << (u+1)*vSize + v + 2 << " "
00130                     <<  u*vSize + v + 2 << "\n";
00131         }
00132     }
00133     outFile.close();
00134     return true;
00135 }
00136 //-----------------------------------------------------------------------------
00137 template <typename T>
00138 bool Converter<T>::WriteGridPtsAsTriMeshToA10FormatFile ( 
00139     Point3<T> * gridPts, int uSize, int vSize, char * outFileName )
00140 {
00141     std::ofstream outFile ( outFileName, ios::out );
00142     if ( !outFile ) {
00143         std::cerr << outFileName << " could not be opened!" << std::endl;
00144         return false;
00145     }
00146     //----------------------------------------------------------------
00147     // Write vertices
00148     outFile << uSize * vSize << "\n";       // write number of vertices
00149     int number = 0;
00150     for ( int u = 0; u < uSize; ++u ) {     // write each vertex
00151         for ( int v = 0; v < vSize; ++v ) {
00152             outFile << ++number << "\t" 
00153                     << gridPts[ u*vSize + v ][0] << "\t"
00154                     << gridPts[ u*vSize + v ][1] << "\t"
00155                     << gridPts[ u*vSize + v ][2] << "\n";
00156         }
00157     }
00158     //----------------------------------------------------------------
00159     // Write triangle faces
00160     int vDeg = vSize - 1;
00161     outFile << (uSize-1) * vDeg * 2 << "\n";    // write number of faces
00162     for ( int u = 0; u < uSize-1; ++u ) {       // write each face
00163         for ( int v = 0; v < vSize-1; ++v ) {
00164             outFile << 3 << "\t" 
00165                     <<  u*vSize + v + 1 << " "
00166                     << (u+1)*vSize + v + 1 << " "
00167                     << (u+1)*vSize + v + 2 << "\n";
00168             outFile << 3 << "\t" 
00169                     << (u+1)*vSize + v + 2 << " "
00170                     <<  u*vSize + v + 2 << " "
00171                     <<  u*vSize + v + 1 << "\n";
00172         }
00173     }
00174     outFile.close();
00175     return true;
00176 }
00177 //-----------------------------------------------------------------------------
00178 template <typename T>
00179 bool Converter<T>::WriteGridPtsAsTriMeshToA10FormatFile2 ( 
00180     Point3<T> * gridPts, int uSize, int vSize, char * outFileName )
00181 {
00182     //----------------------------------------------------------------
00183     // Open the output file
00184     std::ofstream outFile ( outFileName, ios::out );
00185     if ( !outFile ) {
00186         std::cerr << outFileName << " could not be opened!" << std::endl;
00187         return false;
00188     }
00189     //----------------------------------------------------------------
00190     // Write vertices
00191     int vDeg = vSize - 1;
00192     int noOfExtraVertices = (uSize-1) * vDeg;
00193     // write number of vertices
00194     outFile << uSize * vSize + noOfExtraVertices << "\n";
00195     int number = 0;
00196     // write each vertex
00197     for ( int u = 0; u < uSize; ++u ) {
00198         for ( int v = 0; v < vSize; ++v ) {
00199             outFile << ++number << "\t" 
00200                     << gridPts[ u*vSize + v ][0] << "\t"
00201                     << gridPts[ u*vSize + v ][1] << "\t"
00202                     << gridPts[ u*vSize + v ][2] << "\n";
00203         }
00204     }
00205     // write each extra vertex
00206     for ( int u = 0; u < uSize-1; ++u ) {
00207         for ( int v = 0; v < vSize-1; ++v ) {
00208             Vector3<T> vertex = (
00209                         gridPts[ u*vSize + v ]      +
00210                         gridPts[ (u+1)*vSize + v ]  +
00211                         gridPts[ (u+1)*vSize + v + 1 ]  +
00212                         gridPts[ u*vSize + v + 1 ]
00213                     ) / static_cast<T>(4);
00214             outFile << ++number << "\t" 
00215                     << vertex[0] << "\t"
00216                     << vertex[1] << "\t"
00217                     << vertex[2] << "\n";
00218         }
00219     }
00220     //----------------------------------------------------------------
00221     // Write triangle faces
00222     outFile << (uSize-1) * vDeg * 4 << "\n";    // write number of faces
00223     number = uSize*vSize + 1;
00224     for ( int u = 0; u < uSize-1; ++u ) {       // write each face
00225         for ( int v = 0; v < vSize-1; ++v, ++number ) {
00226             outFile << 3 << "\t" 
00227                     <<  u*vSize + v + 1 << " "
00228                     << (u+1)*vSize + v + 1 << " "
00229                     <<  number << "\n";
00230             outFile << 3 << "\t" 
00231                     << (u+1)*vSize + v + 1 << " "
00232                     << (u+1)*vSize + v + 2 << " "
00233                     <<  number << "\n";
00234             outFile << 3 << "\t" 
00235                     << (u+1)*vSize + v + 2 << " "
00236                     <<  u*vSize + v + 2 << " "
00237                     <<  number << "\n";
00238             outFile << 3 << "\t" 
00239                     <<  u*vSize + v + 2 << " "
00240                     <<  u*vSize + v + 1 << " "
00241                     <<  number << "\n";
00242         }
00243     }
00244     outFile.close();
00245     return true;
00246 }
00247 //-----------------------------------------------------------------------------
00248 template <typename T>
00249 Point3<T> * Converter<T>::ReadABezierPatchFromFile (
00250                 char * inFileName,          // i/p
00251                 int &uDeg, int &vDeg )      // o/p
00252 {
00253     //----------------------------------------------------------------
00254     // Open the input file
00255     std::ifstream inFile ( inFileName, ios::in );
00256     if ( !inFile ) {
00257         std::cerr << inFileName << " could not be opened!" << std::endl;
00258         return NULL;
00259     }
00260     //----------------------------------------------------------------
00261     int type;
00262     inFile >> type;
00263     if ( type != 5 ) {
00264         std::cerr << inFileName << " does not contain a Bezier patch!" << std::endl;
00265     }
00266     inFile >> uDeg >> vDeg;
00267     //----------------------------------------------------------------
00268     Point3<T> * bPts = new Point3<T>[ (uDeg+1) * (vDeg+1) ];
00269     if ( !bPts )    return NULL;
00270     int index = 0;
00271     for ( int u = 0; u <= uDeg; ++u ) {
00272         for ( int v = 0; v <= vDeg; ++v, ++index ) {
00273             inFile >> bPts[index][0] >> bPts[index][1] >> bPts[index][2];
00274         }
00275     }
00276     inFile.close();
00277     return bPts;
00278 }
00279 //-----------------------------------------------------------------------------
00280 // This function is for converting the Bezier patch hexoid into a 10 format hexoid
00281 // the Bezier patch hexoid has 6 patches for six sides of the hexoid:
00282 /*
00283         +---+
00284         | 5 |                 u and v indices
00285     +---+---+---+---+            +-u-->
00286     | 2 | 1 | 3 | 4 |            |
00287     +---+---+---+---+            v
00288         | 6 |
00289         +---+
00290 */
00291 
00292 template <typename T>
00293 bool Converter<T>::SpecialFnToCreateA10FormatFileFromHegDataFile ( int uSize, int vSize )
00294 {
00295     //----------------------------------------------------------------
00296     // Open the input file
00297     std::ifstream inFile ( 
00298         "D:/Shared/MyWorksIII/TAPs/Applications/Data/HexDeg3.txt", 
00299         ios::in );
00300     if ( !inFile ) {
00301         std::cerr << "Input file could not be opened!" << std::endl;
00302         return false;
00303     }
00304     //----------------------------------------------------------------
00305     // Open the output file
00306     std::ofstream outFile ( 
00307         "D:/Shared/MyWorksIII/TAPs/Applications/Data/HexDeg3Tri.10", 
00308         ios::out );
00309     if ( !outFile ) {
00310         std::cerr << "Output file could not be opened!" << std::endl;
00311         return false;
00312     }
00313     //----------------------------------------------------------------
00314     int uDeg, vDeg;
00315     Point3<T> * bPts[6];
00316     Point3<T> * mPts[6];
00317     int type;
00318     //----------------------------------------------------------------
00319     for ( int i = 0; i < 6; ++i ) {
00320         inFile >> type;
00321         if ( type != 5 ) {
00322             std::cerr << "Input file does not contain a Bezier patch!" << std::endl;
00323         }
00324         inFile >> uDeg >> vDeg;
00325         //--------------------------------------------------
00326         bPts[i] = new Point3<T>[ (uDeg+1) * (vDeg+1) ];
00327         //--------------------------------------------------
00328         int index = 0;
00329         for ( int u = 0; u <= uDeg; ++u ) {
00330             for ( int v = 0; v <= vDeg; ++v, ++index ) {
00331                 inFile >> bPts[i][index][0] >> bPts[i][index][1] >> bPts[i][index][2];
00332             }
00333         }
00334         mPts[i] = ConvertABezierPatchToAQuadMesh( bPts[i], uDeg, vDeg, uSize-1, vSize-1 );
00335     }
00336     inFile.close();
00337 
00338     
00339     //----------------------------------------------------------------
00340     // Write vertices
00341     int noOfVertices = uSize * vSize;           // patch# 1
00342     noOfVertices += 2 * uSize * (vSize-1);      // patch# 3 & 4
00343     noOfVertices += uSize * (vSize-2);          // patch# 2
00344     noOfVertices += 2 * (uSize-2) * (vSize-2);  // patch# 5 & 6
00345     int number = 0, number1 = 0;
00346     outFile << noOfVertices << "\n";    // write number of vertices
00347     //----------------------------------------------------------------
00348     // Write each vertex of patch# 1
00349     for ( int u = 0; u < uSize; ++u ) {
00350         for ( int v = 0; v < vSize; ++v ) {
00351             outFile << setiosflags( ios::fixed | ios::showpoint )
00352                     << ++number << "\t" 
00353                     << mPts[0][ u*vSize + v ][0] << setprecision( 6 ) << " "
00354                     << mPts[0][ u*vSize + v ][1] << " "
00355                     << mPts[0][ u*vSize + v ][2] << "\n";
00356         }
00357     }
00358     //----------------------------------------------------------------
00359     // Write each vertex of patch# 3
00360     for ( int u = 0; u < uSize; ++u ) {
00361         for ( int v = 1; v < vSize; ++v ) {
00362             outFile << ++number << "\t" 
00363                     << mPts[2][ u*vSize + v ][0] << " "
00364                     << mPts[2][ u*vSize + v ][1] << " "
00365                     << mPts[2][ u*vSize + v ][2] << "\n";
00366         }
00367     }
00368     //----------------------------------------------------------------
00369     // Write each vertex of patch# 4
00370     for ( int u = 0; u < uSize; ++u ) {
00371         for ( int v = 1; v < vSize; ++v ) {
00372             outFile << ++number << "\t" 
00373                     << mPts[3][ u*vSize + v ][0] << " "
00374                     << mPts[3][ u*vSize + v ][1] << " "
00375                     << mPts[3][ u*vSize + v ][2] << "\n";
00376         }
00377     }
00378     //----------------------------------------------------------------
00379     // Write each vertex of patch# 2
00380     for ( int u = 0; u < uSize; ++u ) {
00381         for ( int v = 1; v < vSize-1; ++v ) {
00382             outFile << ++number << "\t" 
00383                     << mPts[1][ u*vSize + v ][0] << " "
00384                     << mPts[1][ u*vSize + v ][1] << " "
00385                     << mPts[1][ u*vSize + v ][2] << "\n";
00386         }
00387     }
00388     //----------------------------------------------------------------
00389     // Write each vertex of patch# 5
00390     for ( int u = 1; u < uSize-1; ++u ) {
00391         for ( int v = 1; v < vSize-1; ++v ) {
00392             outFile << ++number << "\t" 
00393                     << mPts[4][ u*vSize + v ][0] << " "
00394                     << mPts[4][ u*vSize + v ][1] << " "
00395                     << mPts[4][ u*vSize + v ][2] << "\n";
00396         }
00397     }
00398     //----------------------------------------------------------------
00399     // Write each vertex of patch# 6
00400     for ( int u = 1; u < uSize-1; ++u ) {
00401         for ( int v = 1; v < vSize-1; ++v ) {
00402             outFile << ++number << "\t" 
00403                     << mPts[5][ u*vSize + v ][0] << " "
00404                     << mPts[5][ u*vSize + v ][1] << " "
00405                     << mPts[5][ u*vSize + v ][2] << "\n";
00406         }
00407     }
00408     //----------------------------------------------------------------
00409     // Write triangle faces (patch# 1)
00410     int inc, inc1;
00411     int noOfFaces = 10 * (uSize-1) * (vSize-1);
00412     noOfFaces += 2 * (uSize-3) * (uSize-3);
00413     noOfFaces += 2 * (uSize-3);
00414     noOfFaces += 2 * (uSize-3);
00415     noOfFaces += 2 * (uSize-3);
00416     noOfFaces += 2 * (uSize-3);
00417     noOfFaces += 8;
00418     outFile << noOfFaces << "\n";   // write number of faces
00419     for ( int u = 0; u < uSize-1; ++u ) {       // write each face
00420         for ( int v = 0; v < vSize-1; ++v ) {
00421             outFile << 3 << "  " 
00422                     <<  u*vSize + v + 1 << " "
00423                     << (u+1)*vSize + v + 1 << " "
00424                     << (u+1)*vSize + v + 2 << "\n";
00425             outFile << 3 << "  " 
00426                     << (u+1)*vSize + v + 2 << " "
00427                     <<  u*vSize + v + 2 << " "
00428                     <<  u*vSize + v + 1 << "\n";
00429         }
00430     }
00431     //----------------------------------------------------------------
00432     // Write triangle faces (patch# 3)
00433     number = uSize * vSize; // after patch# 1
00434     inc = vSize - 1;
00435     // Write faces
00436     for ( int u = 0; u < uSize-1; ++u ) {
00437         outFile << 3 << "\t" 
00438                 <<  u*vSize + vSize << " "
00439                 << (u+1)*vSize + vSize << " "
00440                 << number + (u+1)*inc + 1 << "\n";
00441         outFile << 3 << "\t" 
00442                 << number + (u+1)*inc + 1 << " "
00443                 << number +  u*inc + 1 << " "
00444                 << u*vSize + vSize << "\n";
00445     }
00446     // Write faces of patch#3 connected with patch#1
00447     for ( int u = 0; u < uSize-1; ++u ) {
00448         for ( int v = 1; v < inc; ++v ) {
00449             outFile << 3 << "\t" 
00450                     << number + u*inc + v << " "
00451                     << number + (u+1)*inc + v << " "
00452                     << number + (u+1)*inc + v + 1 << "\n";
00453             outFile << 3 << "\t" 
00454                     << number + (u+1)*inc + v + 1 << " "
00455                     << number +  u*inc + v + 1 << " "
00456                     << number +  u*inc + v << "\n";
00457         }
00458     }
00459     //----------------------------------------------------------------
00460     // Write triangle faces (patch# 4)
00461     number = uSize * vSize;                 // after patch# 1
00462     number1 = number + uSize * (vSize-1);   // after patch# 1 and 3
00463     inc = vSize - 1;
00464     // Write faces
00465     for ( int u = 0; u < uSize-1; ++u ) {
00466         outFile << 3 << "\t" 
00467                 << number + u*inc + inc << " "
00468                 << number + (u+1)*inc + inc << " "
00469                 << number1 + (u+1)*inc + 1 << "\n";
00470         outFile << 3 << "\t" 
00471                 << number1 + (u+1)*inc + 1 << " "
00472                 << number1 +  u*inc + 1 << " "
00473                 << number + u*inc + inc << "\n";
00474     }
00475     // Write faces of patch#4 connected with patch#3
00476     for ( int u = 0; u < uSize-1; ++u ) {
00477         for ( int v = 1; v < inc; ++v ) {
00478             outFile << 3 << "\t" 
00479                     << number1 + u*inc + v << " "
00480                     << number1 + (u+1)*inc + v << " "
00481                     << number1 + (u+1)*inc + v + 1 << "\n";
00482             outFile << 3 << "\t" 
00483                     << number1 + (u+1)*inc + v + 1 << " "
00484                     << number1 +  u*inc + v + 1 << " "
00485                     << number1 +  u*inc + v << "\n";
00486         }
00487     }
00488     //----------------------------------------------------------------
00489     // Write triangle faces (patch# 2)
00490     number = number1;                       // after patch# 1 and 3
00491     number1 = number + uSize * (vSize-1);   // after patch# 1, 3, and 4
00492     inc  = vSize - 1;
00493     inc1 = inc - 1;
00494     // Write faces
00495     for ( int u = 0; u < uSize-1; ++u ) {
00496         for ( int v = 1; v < inc1; ++v ) {
00497             outFile << 3 << "\t" 
00498                     << number1 + u*inc1 + v << " "
00499                     << number1 + (u+1)*inc1 + v << " "
00500                     << number1 + (u+1)*inc1 + v + 1 << "\n";
00501             outFile << 3 << "\t" 
00502                     << number1 + (u+1)*inc1 + v + 1 << " "
00503                     << number1 +  u*inc1 + v + 1 << " "
00504                     << number1 +  u*inc1 + v << "\n";
00505         }
00506     }
00507     // Write faces of patch#2 connected with patch#4
00508     for ( int u = 0; u < uSize-1; ++u ) {
00509         outFile << 3 << "\t" 
00510                 << number + u*inc + inc << " "
00511                 << number + (u+1)*inc + inc << " "
00512                 << number1 + (u+1)*inc1 + 1 << "\n";
00513         outFile << 3 << "\t" 
00514                 << number1 + (u+1)*inc1 + 1 << " "
00515                 << number1 +  u*inc1 + 1 << " "
00516                 << number + u*inc + inc << "\n";
00517     }
00518     // Write faces of patch#2 connected with patch#1
00519     for ( int u = 0; u < uSize-1; ++u ) {
00520         outFile << 3 << "\t" 
00521                 << number1 +  u*inc1 + inc1 << " "
00522                 << number1 + (u+1)*inc1 + inc1 << " "
00523                 << (u+1)*vSize + 1 << "\n";
00524         outFile << 3 << "\t" 
00525                 << number1 + u*inc1 + inc1 << " "
00526                 << (u+1)*vSize + 1 << " "
00527                 << u*vSize + 1 << "\n";
00528     }
00529     //----------------------------------------------------------------
00530     // Write triangle faces (patch# 5)
00531     number = number1;                       // after patch# 1, 3, and 4
00532     number1 = number + uSize * (vSize-2);   // after patch# 1, 3, 4, and 2
00533     inc  = vSize - 1;
00534     inc1 = inc - 1;
00535     // Write faces
00536     for ( int u = 0; u < uSize-3; ++u ) {
00537         for ( int v = 1; v < inc1; ++v ) {
00538             outFile << 3 << "\t" 
00539                     << number1 + u*inc1 + v << " "
00540                     << number1 + (u+1)*inc1 + v << " "
00541                     << number1 + (u+1)*inc1 + v + 1 << "\n";
00542             outFile << 3 << "\t" 
00543                     << number1 + (u+1)*inc1 + v + 1 << " "
00544                     << number1 +  u*inc1 + v + 1 << " "
00545                     << number1 +  u*inc1 + v << "\n";
00546         }
00547     }
00548     // Write faces of patch#5 connected with patch#1
00549     --inc1;
00550     for ( int v = 1; v < vSize-2; ++v ) {
00551         outFile << 3 << "\t" 
00552                 << number1 +  (uSize-2)*inc1 + v << " "
00553                 << v + 1 << " "
00554                 << v + 2 << "\n";
00555         outFile << 3 << "\t" 
00556                 << v + 2 << " " 
00557                 << number1 +  (uSize-2)*inc1 + v + 1 << " " 
00558                 << number1 +  (uSize-2)*inc1 + v << "\n";
00559     }
00560     // Write faces of patch#5 connected with patch#3
00561     number = uSize * vSize;     // vertex after patch#1
00562     ++inc1;
00563     for ( int u = 0; u < uSize-3; ++u ) {
00564         int op = vSize - 3 - u;
00565         outFile << 3 << "\t" 
00566                 << number1 +  (uSize-2)*u + inc1 << " "
00567                 << number1 +  (uSize-2)*(u+1) + inc1 << " "
00568                 << number + op << "\n";
00569         outFile << 3 << "\t" 
00570                 << number + op << " "
00571                 << number + op + 1 << " "
00572                 << number1 +  (uSize-2)*u + inc1 << "\n";
00573     }
00574     // Write faces of patch#5 connected with patch#4
00575     number = uSize * (vSize + (vSize-1));   // vertex after patch# 1 and 3
00576     for ( int v = 1; v < vSize-2; ++v ) {
00577         int op = vSize - 1 - v;
00578         outFile << 3 << "\t" 
00579                 << number + op << " "
00580                 << number1 +  v << " "
00581                 << number1 +  v + 1 << "\n";
00582         outFile << 3 << "\t" 
00583                 << number1 +  v + 1 << " "
00584                 << number + op - 1 << " "
00585                 << number + op << "\n";
00586     }
00587     // Write faces of patch#5 connected with patch#2
00588     number = uSize * (vSize + (vSize-1)*2); // vertex after patch#1, 3, and 4
00589     for ( int u = 1; u < uSize-2; ++u ) {
00590         outFile << 3 << "\t" 
00591                 << number1 + (uSize-2)*u + 1 << " "
00592                 << number +  u << " "
00593                 << number +  u + 1 << "\n";
00594         outFile << 3 << "\t" 
00595                 << number1 + (uSize-2)*u + 1 << " "
00596                 << number1 + (uSize-2)*(u-1) + 1 << " "
00597                 << number +  u << "\n";
00598     }
00599     // Write cornors of patch#5
00600     {
00601         //----------------------------------------
00602         // Bottom left
00603         //number = uSize * (vSize + (vSize-1)*2);   // vertex after patch#1, 3, and 4
00604         int v1 = number + vSize - 2;
00605         int v2 = 1;
00606         int v3 = 2;
00607         int v4 = number1 + (uSize-2)*(vSize-3) + 1;
00608         outFile << 3 << "\t" << v1 << " " << v2 << " " << v3 << "\n";
00609         outFile << 3 << "\t" << v3 << " " << v4 << " " << v1 << "\n";
00610         //----------------------------------------
00611         // Bottom right
00612         v1 = number1 + (uSize-2)*(vSize-2);
00613         v2 = vSize - 1;
00614         v3 = vSize;
00615         v4 = uSize*vSize + 1;
00616         outFile << 3 << "\t" << v1 << " " << v2 << " " << v3 << "\n";
00617         outFile << 3 << "\t" << v3 << " " << v4 << " " << v1 << "\n";
00618         //----------------------------------------
00619         // Top left
00620         v1 = uSize * (vSize + (vSize-1)) + vSize - 1;
00621         v2 = uSize * (vSize + (vSize-1)*2) + 1;
00622         v3 = number1 + 1;
00623         v4 = v1 - 1;
00624         outFile << 3 << "\t" << v1 << " " << v2 << " " << v3 << "\n";
00625         outFile << 3 << "\t" << v3 << " " << v4 << " " << v1 << "\n";
00626         //----------------------------------------
00627         // Top right
00628         v1 = uSize * (vSize + (vSize-1)) + 1;
00629         v2 = number1 + vSize - 2;
00630         v3 = uSize*vSize + vSize - 2;
00631         v4 = uSize*vSize + vSize - 1;
00632         outFile << 3 << "\t" << v1 << " " << v2 << " " << v3 << "\n";
00633         outFile << 3 << "\t" << v3 << " " << v4 << " " << v1 << "\n";
00634     }
00635     //----------------------------------------------------------------
00636     // Write triangle faces (patch# 6)
00637     number = uSize * (vSize + (vSize-1)*2 + (vSize-2)); // after patch# 1, 3, 4, and 2
00638     number1 = number + (uSize-2)*(vSize-2); // after patch# 1, 3, 4, 2, and 5
00639     inc  = vSize - 1;
00640     inc1 = inc - 1;
00641     // Write faces
00642     for ( int u = 0; u < uSize-3; ++u ) {
00643         for ( int v = 1; v < inc1; ++v ) {
00644             outFile << 3 << "\t" 
00645                     << number1 + u*inc1 + v << " "
00646                     << number1 + (u+1)*inc1 + v << " "
00647                     << number1 + (u+1)*inc1 + v + 1 << "\n";
00648             outFile << 3 << "\t" 
00649                     << number1 + (u+1)*inc1 + v + 1 << " "
00650                     << number1 +  u*inc1 + v + 1 << " "
00651                     << number1 +  u*inc1 + v << "\n";
00652         }
00653     }
00654     // Write faces of patch#6 connected with patch#1
00655     for ( int v = 1; v < vSize-2; ++v ) {
00656         outFile << 3 << "\t" 
00657                 << uSize*(vSize-1) + v + 1 << " "
00658                 << number1 + v << " "
00659                 << number1 + v + 1 << "\n";
00660         outFile << 3 << "\t" 
00661                 << number1 + v + 1 << " "
00662                 << uSize*(vSize-1) + v + 2 << " "
00663                 << uSize*(vSize-1) + v + 1 << "\n";
00664     }
00665     // Write faces of patch#6 connected with patch#3
00666     number = uSize * vSize + (uSize-1)*(vSize-1) + 2;   // vertex after patch#1 + some of patch#3
00667     for ( int u = 0; u < uSize-3; ++u ) {
00668         outFile << 3 << "\t" 
00669                 << number1 +  (uSize-2)*u + inc1 << " "
00670                 << number1 +  (uSize-2)*(u+1) + inc1 << " "
00671                 << number + u << "\n";
00672         outFile << 3 << "\t" 
00673                 << number + u << " "
00674                 << number + u - 1 << " "
00675                 << number1 +  (uSize-2)*u + inc1 << "\n";
00676     }
00677     // Write faces of patch#6 connected with patch#4
00678     number = uSize * (vSize + (vSize-1));   // vertex after patch#1 and 3
00679     number += (uSize-1)*(vSize-1);          // and some of patch#4
00680     for ( int v = 1; v < vSize-2; ++v ) {
00681         int op = vSize - v - 2;
00682         outFile << 3 << "\t" 
00683                 << number1 + (uSize-2)*(vSize-3) + v << " "
00684                 << number + op + 1 << " "
00685                 << number + op << "\n";     
00686         outFile << 3 << "\t" 
00687                 << number + op << " "
00688                 << number1 + (uSize-2)*(vSize-3) + v + 1<< " "
00689                 << number1 + (uSize-2)*(vSize-3) + v << "\n";
00690     }
00691     // Write faces of patch#6 connected with patch#2
00692     number = uSize * (vSize + (vSize-1)*2); // vertex after patch#1, 3, and 4
00693     number += (uSize)*(vSize-3);            // and some of patch#2
00694     for ( int u = 0; u < uSize-3; ++u ) {
00695         int op = vSize - u;
00696         outFile << 3 << "\t" 
00697                 << number +  op << " "
00698                 << number +  op - 1 << " "
00699                 << number1 + (u+1)*(vSize-2) + 1 << "\n";
00700         outFile << 3 << "\t" 
00701                 << number1 + (u+1)*(vSize-2) + 1 << " "
00702                 << number1 + (u)*(vSize-2) + 1 << " "
00703                 << number +  op << "\n";
00704     }
00705     // Write cornors of patch#6
00706     {
00707         //----------------------------------------
00708         // Top left
00709         number = (uSize-1) * (vSize);
00710         int v1 = number + 1;
00711         int v2 = uSize * (vSize + (vSize-1)*2) + uSize*(vSize-2);
00712         int v3 = number1 + 1;
00713         int v4 = number + 2;
00714         outFile << 3 << "\t" << v1 << " " << v2 << " " << v3 << "\n";
00715         outFile << 3 << "\t" << v3 << " " << v4 << " " << v1 << "\n";
00716         //----------------------------------------
00717         // Top right
00718         number = (uSize) * (vSize);
00719         v1 = number - 1;
00720         v2 = number1 + vSize - 2;
00721         v3 = uSize*vSize + (uSize-1)*(vSize-1) + 1;
00722         v4 = uSize * vSize;
00723         outFile << 3 << "\t" << v1 << " " << v2 << " " << v3 << "\n";
00724         outFile << 3 << "\t" << v3 << " " << v4 << " " << v1 << "\n";
00725         //----------------------------------------
00726         // Bottom left
00727         number = uSize * (vSize + (vSize-1)) + (uSize)*(vSize-1);
00728         v1 = uSize * (vSize + (vSize-1)*2) + (uSize-1)*(vSize-2) + 1;
00729         v2 = number;
00730         v3 = number - 1;
00731         v4 = number1 + (uSize-2)*(vSize-3) + 1;
00732         outFile << 3 << "\t" << v1 << " " << v2 << " " << v3 << "\n";
00733         outFile << 3 << "\t" << v3 << " " << v4 << " " << v1 << "\n";
00734         //----------------------------------------
00735         // Bottom right
00736         number = uSize*vSize + (uSize)*(vSize-1);
00737         v1 = number1 + (uSize-2)*(vSize-2);
00738         v2 = uSize * (vSize + (vSize-1)) + (uSize-1)*(vSize-1) + 1;
00739         v3 = number;
00740         v4 = number - 1;
00741         outFile << 3 << "\t" << v1 << " " << v2 << " " << v3 << "\n";
00742         outFile << 3 << "\t" << v3 << " " << v4 << " " << v1 << "\n";
00743     }
00744     //----------------------------------------------------------------
00745     for ( int i = 0; i < 6; ++i ) {
00746         delete [] bPts[i];
00747         delete [] mPts[i];
00748     }
00749     outFile.close();
00750     return true;
00751 }
00752 //-----------------------------------------------------------------------------
00753 //=============================================================================
00754 END_NAMESPACE_TAPs
00755 //345678901234567890123456789012345678901234567890123456789012345678901234567890
00756 //--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines