![]() |
TAPs 0.7.7.3
|
00001 /****************************************************************************** 00002 TAPsVertexRings.cpp 00003 00004 VertexRings class is a class for generic 3D vertex rings. 00005 (Details are in its header file) 00006 00007 SUKITTI PUNAK (11/12/2004) 00008 UPDATE (11/19/2004) 00009 ******************************************************************************/ 00010 #include "TAPsVertexRings.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 // Constructor 00019 VertexRings::VertexRings ( std::vector<int> const * const pviVertexRing1List ) 00020 : m_pviVertexRing1List( pviVertexRing1List ), 00021 m_piFlagVertexNo( NULL ), m_iFlagStep( 0 ), m_iNoVertices( 0 ) 00022 {} 00023 //----------------------------------------------------------------------------- 00024 // Constructor 00025 VertexRings::VertexRings ( std::vector<int> const * const pviVertexRing1List, int iNoVertices ) 00026 : m_pviVertexRing1List( pviVertexRing1List ), 00027 m_iFlagStep( 0 ), m_iNoVertices( iNoVertices ) 00028 { 00029 m_piFlagVertexNo = new int[m_iNoVertices]; 00030 for ( int i = 0; i < iNoVertices; ++i ) { 00031 m_piFlagVertexNo[i] = m_iFlagStep; 00032 } 00033 } 00034 //----------------------------------------------------------------------------- 00035 // Destructor 00036 VertexRings::~VertexRings () 00037 { 00038 delete [] m_piFlagVertexNo; 00039 } 00040 //----------------------------------------------------------------------------- 00041 //============================================================================= 00042 // OPERATIONS 00043 //----------------------------------------------------------------------------- 00044 // Set vertex#i as the list of zeroth ring 00045 inline bool VertexRings::SetVertex ( int i ) 00046 { 00047 //---------------------------------------------------------------- 00048 // Clear the previous data 00049 m_viRingLayers.clear(); 00050 m_viRingVertices.clear(); 00051 //---------------------------------------------------------------- 00052 // Set the size of zeroth ring 00053 m_viRingLayers.push_back( 0 ); 00054 m_viRingLayers.push_back( 1 ); 00055 //---------------------------------------------------------------- 00056 // Set the zeroth ring vertex 00057 m_viRingVertices.push_back( i ); 00058 00059 return true; 00060 } 00061 //----------------------------------------------------------------------------- 00062 // Set vertices as the list of zeroth ring 00063 inline bool VertexRings::SetVertices ( int v[], int size ) 00064 { 00065 //---------------------------------------------------------------- 00066 // Clear the previous data 00067 m_viRingLayers.clear(); 00068 m_viRingVertices.clear(); 00069 //---------------------------------------------------------------- 00070 // Set the size of zeroth ring 00071 m_viRingLayers.push_back( 0 ); 00072 m_viRingLayers.push_back( size ); 00073 //---------------------------------------------------------------- 00074 // increase flag step 00075 #ifndef _WINDOWS_ 00076 if ( m_iFlagStep < std::numeric_limits<int>::max() ) { 00077 #else 00078 if ( m_iFlagStep < 1024 ) { 00079 #endif 00080 ++m_iFlagStep; 00081 } 00082 else { 00083 m_iFlagStep = 0; 00084 for ( int i = 0; i < m_iNoVertices; ++i ) { 00085 m_piFlagVertexNo[i] = 0; 00086 } 00087 } 00088 //---------------------------------------------------------------- 00089 // Set the vertices 00090 for ( int i = 0; i < size; ++i ) { 00091 m_viRingVertices.push_back( v[i] ); 00092 m_piFlagVertexNo[ v[i] ] = m_iFlagStep; 00093 } 00094 00095 return true; 00096 } 00097 //----------------------------------------------------------------------------- 00098 // Add vertex#i to the list of zeroth ring 00099 //inline bool VertexRings::AddVertex ( int i ) 00100 //{ 00101 // return true; 00102 //} 00103 //----------------------------------------------------------------------------- 00104 // Add vertices to the list of zeroth ring 00105 //inline bool VertexRings::AddVertices ( int v[], int size ) 00106 //{ 00107 // return true; 00108 //} 00109 //----------------------------------------------------------------------------- 00110 // Increase one layer 00111 bool VertexRings::IncreaseOneLayer (int dummy) 00112 { 00113 int count = 0; 00114 bool notInTheSet; 00115 int noLayers = static_cast<int>( m_viRingLayers.size() ) - 2; 00116 for ( int i = m_viRingLayers[noLayers]; i < m_viRingLayers[noLayers+1]; ++i ) { 00117 for ( int r = 0; r < static_cast<int>( m_pviVertexRing1List[ m_viRingVertices[i] ].size() ); ++r ) { 00118 notInTheSet = true; 00119 for ( int vr = 0; vr < static_cast<int>( m_viRingVertices.size() ); ++vr ) { 00120 if ( m_pviVertexRing1List[ m_viRingVertices[i] ][r] == m_viRingVertices[vr] ) { 00121 notInTheSet = false; 00122 break; // break from the most inner loop 00123 } 00124 } 00125 if ( notInTheSet ) { 00126 m_viRingVertices.push_back( m_pviVertexRing1List[ m_viRingVertices[i] ][r] ); 00127 ++count; 00128 } 00129 } 00130 } 00131 m_viRingLayers.push_back( count + m_viRingLayers[noLayers+1] ); 00132 00133 return true; 00134 } 00135 //----------------------------------------------------------------------------- 00136 // Increase one layer 00137 bool VertexRings::IncreaseOneLayer () 00138 { 00139 int count = 0; 00140 int noLayers = static_cast<int>( m_viRingLayers.size() ) - 2; 00141 for ( int i = m_viRingLayers[noLayers]; i < m_viRingLayers[noLayers+1]; ++i ) { 00142 for ( int r = 0; r < static_cast<int>( m_pviVertexRing1List[ m_viRingVertices[i] ].size() ); ++r ) { 00143 if ( m_piFlagVertexNo[ m_pviVertexRing1List[ m_viRingVertices[i] ][r] ] < m_iFlagStep ) { 00144 m_piFlagVertexNo[ m_pviVertexRing1List[ m_viRingVertices[i] ][r] ] = m_iFlagStep; 00145 m_viRingVertices.push_back( m_pviVertexRing1List[ m_viRingVertices[i] ][r] ); 00146 ++count; 00147 } 00148 } 00149 } 00150 if ( count > 0 ) { 00151 m_viRingLayers.push_back( count + m_viRingLayers[noLayers+1] ); 00152 return true; 00153 } 00154 else { 00155 return false; 00156 } 00157 } 00158 //----------------------------------------------------------------------------- 00159 // Decrease one layer 00160 bool VertexRings::DecreaseOneLayer () 00161 { 00162 // Erase the outer most layer 00163 // But not the zeroth layer 00164 if ( static_cast<int>( m_viRingLayers.size() ) > 1 ) { 00165 m_viRingLayers.pop_back(); 00166 return true; 00167 } 00168 return false; 00169 } 00170 //----------------------------------------------------------------------------- 00171 // Zeroth Ring is the list of directly deformed vertex 00172 std::vector<int> VertexRings::GetVertexListOfRingZero () const 00173 { 00174 std::vector<int> ringZero; 00175 for (int i = 0; i < GetSizeOfRingNo( 0 ); ++i ) { 00176 ringZero.push_back( m_viRingVertices[i] ); 00177 } 00178 return ringZero; 00179 } 00180 //----------------------------------------------------------------------------- 00181 //============================================================================= 00182 END_NAMESPACE_TAPs 00183 //345678901234567890123456789012345678901234567890123456789012345678901234567890 00184 //--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8