CRT main

아래의 내용은 정보문화사 발행 저자 유동근 님의 "윈도우즈 MFC 프로그래밍" 책을 보고 정리한 것 입니다.

흔히, Win32 어플리케이션의 시작점은 main, WinMain 함수로 알고 있다.
하지만, 실제로 시작하는 것은 C-Runtime main 이다.
줄여서 CRT main 이라고 한다.
다음의 코드를 보자.

class FirstClass
{
public:
    FirstClass();
};
FitstClass::FirstClass()  { std::cout << "First Class 생성자" << std::endl; }

FirstClass fc;

void main()
{
    std::cout << "Run Main" << std::endl;
}


위에 코드를 실행하면 결과는
"First Class 생성자"
"Run Main"

이 나오게 된다.
즉, main 함수에 당도하기 전에 전역변수의 생성자가 불리는 것 이다.
CRT main 이 전역변수의 생성을 하는 것 이다.
그리고 하는 또 하나의 중요한 작업이 new등으로 생기는 동적할당 메모리 등에
할당될 힙 메모리를 초기화 하는 일을 한다.
new연산은 내부적으로 malloc 함수를 사용한다.
그 malloc 함수 내부에는 HeapAlloc 함수로 힙 메모리를 얻어 오는데,
이 힙 메모리는 누가 초기화 하는 것 일까?
바로 CRT main 인 것 이다.

by 누아루영웅 | 2009/04/26 02:13 | PublicPrograming | 트랙백 | 덧글(0)

아핀 결합

작성중

by 누아루영웅 | 2009/04/13 11:53 | Math | 트랙백 | 덧글(0)

아핀 공간

벡터를 이용한 형식적인 좌표 공간 이라고 생각하면 된다.
우선 벡터와 점 사이의 관계를 규명 짓자.
아핀공간 내의 점의 집합을 W라하고, 벡터의 집합을 V라고 하자.
W내의 점 p1,p2에서 아래와 같은 연산을 만족하는 V공간내의 유일한 벡터 v가 존재한다.
v = p2 - p1
마찬가지로 W내의 점 p2를 규명하는 아래와 같은 식이 성립된다.
p2 = p1 + v
이 두 관계식의 도식화는 아래의 그림과 같다. 









즉, 벡터 v 가 두점 p1,p2의 사이를 이동한다고 볼 수 있다.

두 점 사이의 변위를 결정하기 위해서 한 점에서 다른 한점을 뺀다.
한 점을 이동시키기 위하여 벡터를 더하면 새로운 점을 얻게 된다.

점의 집합 W내에 원점 이라고 불리는 O를 정의 할수 있다.
그 원점 O를 이용해서 W내의 임의의 점 P를 다음과 같이 정의 할수 있다.
P = O + V
위에 공식 V를 나타내는 기저 벡터로 표현하면 아래와 같다.
P = O + p0v0 + p1v1 + p2v2 + pn-1vn-1
즉, n-1과 같은 기저 벡터들로 표현이 되는 것이다.
이렇게 원점 O와 기저벡터들(v0,v1,..vn-1) 들로 이루어진 세계를 '좌표 프레임' 이라고 한다.

여기서 물리적 기하학 공간을 나타내는 데는 원점은 (0,0,0) 과 표준기저(1,0,0),(0,1,0),(0,0,1) 로 표현하는게 쉽다.
그리고 이 공간은 '직교 좌표 프레임' 이라고 한다.

우리가 흔히 쓰는 3차원 공간(R3) 에서는 잘 알다시피 원점 (0,0,0)이고, 표준기저 { i(1,0,0), j(0,1,0), k(0,0,1) }
로 쓰이고 있다.
이렇게 x,y,z 축으로 기저 벡터들이 놓임으로써, 공간내의 임의의 점과 벡터들을 모두 표현 할수 있게 된다.

by 누아루영웅 | 2009/04/06 09:30 | Math | 트랙백(1) | 덧글(0)

후면 제거 공식

그 어떤 방법보다도 polygon 을 직접 그리지 않는게 제일 비용이 좋다.
(즉, polygon에 pixel 을 채워넣는 작업을 생략하는게 제일 좋다.)

먼저 polygon의 법선 벡터를 구한다.
구하는 방법은 정점 i1,i2,i3 으로 이루어진 polygon 이라고 치자.

 v1 = i2 - i1
 v2 = i3 - i1
 crossV = cross(v1 , v2)
 norV = nor(crossV)


하지만 보통은 정점 포맷에 법선벡터가 추가되어 있으니 더 쉽게 구할수 있다.

 norV = nor( i1.nor + i2.nor + i3.nor )

이 이후에 각 정점으로부터 카메라 위치로 향하는 벡터들을 구해서 polygon의
법선벡터와 내적 연산을 한다.

 dot = (cameraPos - in) * norV

이 dot 값이 0 보다 작거나 같으면 해당 polygon은 반대 방향에 있는 것이 된다.

by 누아루영웅 | 2009/03/23 21:01 | Math | 트랙백 | 덧글(0)

저는 이런식으로 잘 씁니다.

typedef std::vector<MyClass*>                          MyVec;
typedef std::vector<MyClass*>::iterator              MyVecIt;
typedef std::vector<MyClass*>::const_iterator     MyVecCIt;

MyVec m_MyVec;

//요소 삽입...

MyVecCIt myClassBegin( m_MyVec.begin() ), myClassEnd( m_MyVec.end() );
while( myClassBegin != myClassEnd )
{
    //process 수행
    std::advance( myClassBegin, 1 );
}


//컨테이너 요소중에 특정 요소들이 제거 되어야 할때
MyVecCIt myClassBegin( m_MyVec.begin() ), myClassEnd( m_MyVec.end() );
while( myClassBegin != myClassEnd )
{
    if( 지워야 할 요소 조건 )
    {
        size_t dis( std::distance(m_MyVec.begin(), myClassBegin) );
        m_MyVec.erase( myClassBegin );
        myClassBegin = m_MyVec.begin();
        myClssEnd = m_MyVec.end();
        std::advance( myClassBegin, dis );
    }
    else
        std::advance( myClassBegin, 1 );
}

//하지만 실제로는 중간 요소 제거가 자주 일어나게 된다면
//list로 해야겠죠

typedef std::list<MyClass*>                         MyList;
typedef std::list<MyClass*>::iterator             MyListIt;
typedef std::list<MyClass*>::const_iterator    MyListCIt;
MyList m_MyList( m_MyVec.begin(), m_MyVec.end() );
MyList listBegin( m_MyList.begin() ), listEnd( m_MyList.end() );
while( listBegin != listEnd )
{
    if( 지워야 할 조건 )
    {
        MyListIt deleteIt( listBegin );
        std::advance( listBegin, -1 );//listBegin 이 m_MyList.begin() 이었다면 error 입니다. 주의 하세요.
        m_MyList.erase( deleteIt );
    }
    std::advance( listBegin, 1 );
}

by 누아루영웅 | 2009/03/23 20:55 | STL | 트랙백 | 덧글(0)

◀ 이전 페이지 다음 페이지 ▶