![]() |
TAPs 0.7.7.3
|
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----+----