블로그는 나의 힘!
[ Programing ]/STL & Booster2009. 12. 24. 00:37
[List 원하는 위치의 데이터 삭제]


#include <list>
#include <algorithm>

typedef struct {
   word buff;
} TEST;

// 사용자가 새로 정의. 구조체 이면서 함수 처럼 동작.
// 즉, 구조체이나 이터네이터로 동작.
struct CompareList : public std::binary_function < TEST*, char, bool >
{
   bool operator() ( const TEST* pData, const word test ) const
   {
      return pData->buff == test ;  // 같으면 true, 다르면 flase
   }
};

 

// 사용자가 새로 정의. 구조체 이면서 함수 처럼 동작.
// 즉, 구조체이나 이터네이터로 동작.
struct CompareList2
{

   CommpareList2();

   CommpareList2( word param ) { this->param = param; }

   word param;


   bool operator() ( const TEST& hs ) const
   {
      return ( hs.buff == this->param );
   }
}; 



std::list<TEST*> TestList;

////////////////////////////// Data input. //////////////////////////////
TestList.push_back( new TEST );
TestList.push_back( new TEST );
TestList.push_back( new TEST );
TestList.push_back( new TEST );


//////////////////////////// Data output //////////////////////////////
for( std::list<TEST*>::iterator iter = TestList.begin(); iter != TestList.end(); ++iter )
{
     printf( "Test buffer = %s \n", (*iter)->buff );
}

 

word comparevalue = 0;

// find_if 첫번째
///////// find data  처음 ~ 끝까지 검색하며 CompareList() 의 조건으로 comparevalue 를 찾아라 ///////

std::list<Test*>::iterator iter = std::find_if( TestList.begin(), TestList.end(), CompareList(), comparevalue );

 

// find_if 두번째

 std::list<Test*>::iterator iter2 = std::find_if( TestList.begin(), TestList.end(), CompareList2(comparevalue) );

 

// 걍 검사

std::list<TEST*>::iterator iter_ = std::find( TestList.begin(), TestList.end(), comparevalue ); 


// erase func.  해당 위치를 삭제 한다.

if( iter != TestList.end() )
{
   TestList.erase( iter );
}




=============================================================================
- 핵심 :
list.erase( iterator );    
std::binary_function<Test*, char, bool>    
std::find_if( list.begin(), list.end(), CompareList, CompareValue );

 

 

 

Posted by Mister_Q
[ Programing ]/STL & Booster2009. 12. 24. 00:36
[입력과 출력 부분]

#include <list>

struct test { char buff; };

std::list<test*> TestList;

TestList.push_back( temp );  // 입력
std::list<test*>::iterator iter = NULL;

for( iter = TestList.begin(); iter != TestList.end(); ++iter) 
   (*iter)->buff; // 출력 test->buff 가져 온다.




- 핵심 : push_back( Value );    iterator

Posted by Mister_Q
[ Programing ]/DirtectX92009. 12. 24. 00:32
[텍스쳐 직선 이동 공식] D3DXVec3Normalize( &vecNormalize, &vecDirection );     vecPOS += ( vecNormalize *fMove );
=================================================================================== 
int move = (한번에 이동할 거리);
vec3 dir             = B - A;                     // 방향
float len             = length( dir );            // 이동할 거리
dir                     = normalize( dir );
int moveCount    = len / move;             // 이동 횟수
for( int i = 0; i < moveCount; ++i )
{
     A = A + dir * move;     // 이동 중
}
A = B;                       // 이동 완료
 
/////////////////////////////////////////////////////////////////////////////////////////////
 
struct TAG_CARD   // Card Data
{
 D3DXVECTOR3  vecPOSBF;          // Before Position
 D3DXVECTOR3  vecPOSAF;          // After Position
 D3DXVECTOR3  vecNormalize;       // Normalize
 FLOAT               fMove;                  // Move Data
 INT                    nMVRepetition;     // Move Repetition Count
}; 
 
// 이동할 위치 설정 ( 카드 객체, 이동할 좌표, 이동 횟수 )
 HRESULT cCardMng::SetMovePosition( TAG_CARD& tagCard, D3DXVECTOR3 vecAfter, INT nMVRepetition )

     const D3DXVECTOR3 vecDIR = vecAfter -tagCard.vecPOSBF; // 방향
     tagCard.fMove    = D3DXVec3Length( &vecDIR ) /static_cast< FLOAT >( nMVRepetition ); // 이동할 거리
     tagCard.vecPOSAF   = vecAfter;  // 최종 이동할 위치
     tagCard.nMVRepetition  = nMVRepetition; // 이동 횟수
     D3DXVec3Normalize( &tagCard.vecNormalize, &vecDIR ); 
    // 곡선이나 다른 값 대입 시 Normalize 대신 방정식을 넣는다. 현 좌표와 이동할 좌표 까지 루프를 돌리고 이동할 거리를 계속 넣어 주면 된다.
     
     return S_OK;
}
 
// SetMovePosition() 으로 설정한 만큼 이동.
 D3DXVECTOR3 cCardMng::DynamicMove( TAG_CARD& tagCard )

     // vecPOSBF + vecNormalize * fMove  -> 이동 공식
     if( tagCard.vecPOSBF != tagCard.vecPOSAF )    // 목적지 도착했다면 넘어간다.
     {
          tagCard.vecPOSBF += ( tagCard.vecNormalize *tagCard.fMove );
          if( tagCard.vecPOSBF > tagCard.vecPOSAF ) tagCard.vecPOSBF = tagCard.vecPOSAF;    
          // 만약 이동하는 좌표가 목적지를 초과하면 강제 대입 이동

     } // >>> END if
     return tagCard.vecPOSBF;
}   
 

 - 조금씩 이동할 거리를 '이동할 좌표 - 현재 좌표' 한 값의 노멀라이징 한것에 곱해 주고 현재 좌표랑 더해 줘서 이동할 좌표 만큼 루프를 돌리면 직선 이동한다.
 - 곡선이나 다른 값 대입 시 Normalize 대신 방정식을 넣는다. 현 좌표와 이동할 좌표 까지 루프를 돌리고 이동할 거리를 계속 넣어 주면 된다.
 - 직접 좌표 건들 필요 없이 이렇게 사용 가능하다. 응용하면 곡선도 가능.
Posted by Mister_Q