TAPs 0.7.7.3
TAPsVertexRings.cpp
Go to the documentation of this file.
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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines