TAPs 0.7.7.3
TAPsCGAlgo.cpp
Go to the documentation of this file.
00001 /******************************************************************************
00002 TAPsCGAlgo.hpp
00003 ******************************************************************************/
00007 /******************************************************************************
00008 SUKITTI PUNAK   (2/03/2006)
00009 UPDATE          (2/15/2010)
00010 ******************************************************************************/
00011 #include "TAPsCGAlgo.hpp"
00012 // Using Inclusion Model (i.e. definitions are included in declarations)
00013 //                       (this name.cpp is included in name.hpp)
00014 // Each friend is defined directly inside its declaration.
00015 
00016 BEGIN_NAMESPACE_TAPs
00017 //=============================================================================
00018 // Subdivision Fns
00019 //=============================================================================
00020 //-----------------------------------------------------------------------------
00021 template <typename T>
00022 bool CGAlgo<T>::SubdivisionLoop ( OpenGL::OpenGLModel<T> * prModel )
00023 {
00024     //-------------------------------------------------------------------
00025     // Loop Subdivision for HalfEdge Model
00026     {
00027         OpenGL::HalfEdgeModel<T> * const  model = 
00028             dynamic_cast< OpenGL::HalfEdgeModel<T> * const >( prModel );
00029         if ( model ) {
00030             std::cout << "Do Loop Subdivision to A HalfEdge Model\n";
00031             return SubdivisionLoop( model );
00032         }
00033     }
00034     //-------------------------------------------------------------------
00035     // Loop Subdivision for XPolygonal Model
00036     {
00037         OpenGL::XPolygonalModel<T> * const  model = 
00038             dynamic_cast< OpenGL::XPolygonalModel<T> * const >( prModel );
00039         if ( model ) {
00040             std::cout << "Do Loop Subdivision to An XPolygonal Model\n";
00041             return SubdivisionLoop( model );
00042         }
00043     }
00044     //-------------------------------------------------------------------
00045     // Loop Subdivision for Polygonal Model
00046     {
00047         OpenGL::PolygonalModel<T> * const  model = 
00048             dynamic_cast< OpenGL::PolygonalModel<T> * const >( prModel );
00049         if ( model ) {
00050             std::cout << "Do Loop Subdivision to A Polygonal Model\n";
00051             return SubdivisionLoop( model );
00052         }
00053     }
00054     //-------------------------------------------------------------------
00055     std::cout << "WARNING: Failed Doing Loop Subdivision --> the model is unrecognized!"
00056         << std::endl;
00057     return false;
00058 }
00059 //-----------------------------------------------------------------------------
00060 template <typename T>
00061 bool CGAlgo<T>::SubdivisionLoop ( OpenGL::PolygonalModel<T> * prModel )
00062 {
00063     return false;
00064 }
00065 //-----------------------------------------------------------------------------
00066 template <typename T>
00067 bool CGAlgo<T>::SubdivisionLoop ( OpenGL::XPolygonalModel<T> * prModel )
00068 {
00069     return false;
00070 }
00071 //-----------------------------------------------------------------------------
00072 template <typename T>
00073 bool CGAlgo<T>::SubdivisionLoop ( OpenGL::HalfEdgeModel<T> * prModel )
00074 {
00075     return false;
00076 }
00077 //-----------------------------------------------------------------------------
00078 //=============================================================================
00079 
00080 
00081 
00082 
00083 //=============================================================================
00084 //-----------------------------------------------------------------------------
00085 template <typename T>
00086 void CGAlgo<T>::Physics::CalVolumeAndCentroid_BasedOnTetrahedron (
00087     OpenGL::OpenGLModel<T> *    prModel,    
00088     T &                         Volume,     
00089     Vector3<T> &                Centroid    
00090 )
00091 {
00092     std::cout << "CalVolumeAndCentroid_BasedOnTetrahedron\n";
00093     OpenGL::HalfEdgeModel<T> * pHEModel = dynamic_cast< OpenGL::HalfEdgeModel<T> * >( prModel );
00094     if ( pHEModel ) {
00095         CalVolumeAndCentroid_BasedOnTetrahedron( pHEModel, Volume, Centroid );
00096         return;
00097     }
00098     OpenGL::XPolygonalModel<T> * pXPolyModel = dynamic_cast< OpenGL::XPolygonalModel<T> * >( prModel );
00099     if ( pXPolyModel ) {
00100         std::cout << "CGAlgo<T>::Physics::CalVolumeAndCentroid_BasedOnTetrahedron(...) -- ";
00101         std::cout << "(" << __FILE__ << ", " << __LINE__ << ") -- ";
00102         std::cout << "NOT IMPLEMENTED YET\n";
00103         return;
00104     }
00105     OpenGL::PolygonalModel<T> * pPolyModel = dynamic_cast< OpenGL::PolygonalModel<T> * >( prModel );
00106     if ( pPolyModel ) {
00107         std::cout << "CGAlgo<T>::Physics::CalVolumeAndCentroid_BasedOnTetrahedron(...) -- ";
00108         std::cout << "(" << __FILE__ << ", " << __LINE__ << ") -- ";
00109         std::cout << "NOT IMPLEMENTED YET\n";
00110         return;
00111     }
00112 }
00113 //-----------------------------------------------------------------------------
00114 template <typename T>
00115 void CGAlgo<T>::Physics::CalVolumeAndCentroid_BasedOnTetrahedron (
00116     OpenGL::HalfEdgeModel<T> *  prModel,    
00117     T &                         Volume,     
00118     Vector3<T> &                Centroid    
00119 )
00120 {
00121     T TetVol = 0;
00122     Vector3<T> sumOfTetCentroidMultWithTetVol;
00123     Volume = 0;
00124 
00125     //std::vector< HEVertex<T> const * > vertices;
00126     std::vector< HEVertex<T> * const > vertices;
00127     TAPs::HEFace<T> * pFace = prModel->GetFaceList()->Head();
00128     while ( pFace ) {
00129 
00130         // volume of tetrahedron = |(a-d)*((b-d)^(c-d))| / 6
00131         // d := (0,0,0)
00132         vertices = pFace->GetPtrsToVertices();
00133         TetVol = vertices[0]->GetPosition() * ( vertices[1]->GetPosition() ^ vertices[2]->GetPosition() ) / T(6.0);
00134         Volume += TetVol;
00135 
00136         // centroid of tetrahedron = (a + b + c + d ) / 4
00137         sumOfTetCentroidMultWithTetVol += ( vertices[0]->GetPosition() + vertices[1]->GetPosition() + vertices[2]->GetPosition() ) * T(0.25) * TetVol;
00138 
00139         pFace = pFace->Next();
00140     }
00141     Centroid = sumOfTetCentroidMultWithTetVol / Volume;
00142 }
00143 //-----------------------------------------------------------------------------
00144 //=============================================================================
00145 
00146 
00147 
00148 
00149 //=============================================================================
00150 //=============================================================================
00151 //-----------------------------------------------------------------------------
00152 //-----------------------------------------------------------------------------
00153 //=============================================================================
00154 END_NAMESPACE_TAPs
00155 //-----------------------------------------------------------------------------
00156 //34567890123456789012345678901234567890123456789012345678901234567890123456789
00157 //--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines