Socket의 입력버퍼 내용을 버리는 코드

요즘 하고 있는 작업중에 필요했던 기능이, 특정 소켓에 대한 입력 버퍼를 버리는 것입니다.

char ch;
u_long cntRecvBuf = 0;

if (ioctlsocket(hSocket, FIONREAD, &cntRecvBuf) != SOCKET_ERROR) {
	for (long i = 0; i

보다 효율적으로 한다면 한 바이트씩 읽어오지 않고, 버퍼에 있는 크기만큼 한번에 읽어서 버리면 더 좋겠지만, 매 순간마다 필요한 만큼의 메모리 할당을 해야하므로 그냥 한 바이트씩 읽도록 했습니다.

TT에서 소스코드에 대해 칼라를 먹일 수 있는 손 쉬운 방법 없나요? 이거.. 너무 폼이 않나네요.. ㅜ_ㅜ잉~

한장의 종이와 대화.

계정이 만료되어 3일간 사이트가 나도 모르게 문이 닫혔다. 다시 만료된 계정을 갱신은 했는데… 예전엔 1년 단위로 했었지만 이번엔 2년으로 했다. 갱신을 하려면 일정한 금액을 지불해야 한다. 전세계의 도메인네임이 가히 천문학적(만큼은 아니겠지만) 일텐데, 가만이 앉아서 돈을 긁어 모으고 있는거나 다름없잔은가. 완벽한 블루오션(Blue ocean) 중에 하나가 아닐까 한다.

요즘 내가 하고 있는 대부분의 작업은 종이 한장 앞에서 펜대를 굴리는 일이다. 굴리다가 머리가 복잡하거나, 단순해져 멍해지면 예전엔 하지도 않았던 게임을 한다. 펜대를 종이위에 굴리는 이유는 아직까지도 감이 잡히지 않는 복잡한 그 무엇을 눈으로 가시화시키기 위해서이다. 가장 에너지가 최소로 소비되는 방법이란 생각에서이다.

복잡한 것들 중에 불필요한 것들은 제거하고 필요하지만 복잡한 것은 단순화시키다가는, 이게 아니다.. 하고는 한장의 종이는 폐기된다. 정확히 5월 9일부터 바로 오늘 몇십분전까지 반복되고 있다. 이제는 한장의 종이로 제법 정리 되어가고는 있지만….. 아직까지도 의심의 여지가 몇 있고, 실제 적용했을때에 발견하지 못했던 문제가 불거져 나올 건 뻔한 일이다.

하지만 이제 더 이상 종이와 씨름할 시간은 오늘로써 만기되었다. 풀지 못한 이론상의 난제와 실제 적용했을때 불거질, 얼마나 치명적일지 모르는 문제들은, 이제 직접 부딪혀 보고 풀어나가는 방법이 지금의 나에게는 최선일듯하다.

남은 시간은 10일, 그리고 일주일동안 검증을 받을 것이고 6월이 끝나는 그 날까지 남은 작업을 마무리해야한다. 내 자신에 대한 즐거운 도전이고 내 일에 대한 행복한 레벨업의 기회에 겸허한 마음으로 스스로에게 건투를 빈다…

OrangeMap – 3차 릴리즈

2005년 1월 5일부터 진행된 2D GIS 컴포넌트입니다. 총 5단계로 나누어져 진행되는 프로젝트이며, 4단계까지는 공개이며 마지막 5단계는 비공개로 진행되는 프로젝트입니다.

3차배포 샘플예제 실행화면 일부

5월 4일에 3차 배포까지 진행되었습니다. 3차 배포까지의 대략적인 기능은 다음과 같습니다.

▭ 수치지도(Shape) 화면 표시 및 조작
▭ 다중 레이어 관리
▭ 수치지도의 속성에 따른 복합심벌
▭ 주기(Annotation, Label)
▭ 속성검색
▭ 수치지도에 공간격자 기법 적용
▭ Point의 경우 이미지 심벌 적용 기능
▭ Tracking Layer 기능
▭ 수치지도 및 속성 편집
▭ 편집시 Undo/Redo 기능
▭ MapLegend 컨트롤
▭ GeoTIF 형식의 영상 표시
▭ 영상의 투명도, 명암, 채도등의 필터 적용
▭ 자체포멧정의(수치지도: EPF, 영상: EPrR)
▭ 영상지도에 피라미드와 타일링 기법 적용

최근 배포된 3차 배포의 실행버전과 OrangeMap의 자세한 개요는 다음 링크로터 다운로드 받을 수 있습니다.

오렌지맵 3차 릴리즈(컴포넌트 및 예제소스)
대전지역(픽셀해상도 1m) 항공영상 데이터

필요한 기능에 대한 피드백을 보내주시면 수집하여 중복될 경우 적극적으로 반영시키겠습니다.

[OpenGL Tutorial] Bill-board(빌보드) 기법

사용자 삽입 이미지빌보드 기법이란 사각형이 항상 시점을 바라보도록 만드는 것을 말한다. 결과적으로 관찰자가 어느 위치로 이동하더라도 사각형은 항상 같은 면을 관찰자에게 보여주게 된다. 응용예로써 넓은 대지위에 나무를 나타내고자 할때, 나무를 메쉬(Mesh)를 사용하여 모델링하지 않고 나무 이미지만으로 구현이 가능하다.

구현에 대한 핵심은, 항상 시점을 바라보도록 사각형을 이루는 네 좌표를 조정하여야 하는데, 이를 위해 Model View 행렬을 이용한다. Model-View 행렬에는 관찰자의 시점에 대한 정수직벡터와 정우측벡터에 대한 정보가 담겨있다.

일단 OpenGL에서 Model View 행렬을 얻는 코드를 알아보자.

Glfloat viewMatrix[16];
GlGetFloatv(GL_MODELVIEW_MATRIX, viewMatrix);

ViewMatrix에 저장된 Model View 행렬이 다음 그림과 같다고 할 때 벡터(m1, m5, m9)은 시선 벡터와 수직인 위쪽 벡터이고, 벡터(m0, m4, m8)는 시선 벡터와 수직인 오른쪽 벡터이다.사용자 삽입 이미지시선과 위쪽으로 수직인 벡터를 UpVector라 하고 오른쪽 방향으로 수직인 벡터를 RightVector라 하자. 이 두 벡터를 이용하여 사각형을 이루는 4개의 좌표를 조정하기 위해, 사각형의 중심 벡터를 centerVector라고 하면, 사각형을 이루는 4개의 좌표는 다음 그림과 같다. 사용자 삽입 이미지위의 네 좌표를 스칼라값 Size를 적용하면 다음과 같다. Size는 사각형의 크기로 생각할 수 있다.

CenterPoint + (RightVector + UpVector) * (-Size))
CenterPoint + (RightVector -UpVector) * Size
CenterPoint + (RightVector + UpVector) * Size
CenterPoint + (UpVector -RightVector) * Size

실제로 구현 코드를 살펴보자.

void GL_Window::Draw(void)
{
    // Clear Screen And Depth Buffer
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);     
    glLoadIdentity (); // Reset The Modelview Matrix
    glTranslatef (0.0f, 0.0f, -6.0f); // Translate 6 Units Into The Screen
    glRotatef (angle, 0.0f, 1.0f, 0.0f); // Rotate On The Y-Axis By angle
   
    // 모델뷰 행렬을 얻는다
    float mat[16];
    glGetFloatv(GL_MODELVIEW_MATRIX, mat);
   
    // 모델뷰 행렬로부터 시선방향에 대해 수직으로 오른쪽 벡터와 
    // 수직으로 윗쪽 벡터를 정의한다.
    vector3_t right(mat[0], mat[4], mat[8]);
    vector3_t up(mat[1], mat[5], mat[9]);
   
    glBindTexture(GL_TEXTURE_2D, texture[0]); // Select Our Texture
   
    vector3_t pos(0.0f, 0.0f, 1.0f);
   
    glBegin(GL_QUADS);
    // 빌보드 기법을 적용하지 않은 폴리곤의 경우
    // Bottom Left Of The Texture and Quad
    // glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); 
    // Bottom Right Of The Texture and Quad
    // glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
    // Top Right Of The Texture and Quad
    // glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); 
    // Top Left Of The Texture and Quad
    // glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); 
   
    // 빌보드 기법이 적용된 폴리곤의 경우
    // Bottom Left Of The Texture and Quad
    glTexCoord2f(0.0f, 0.0f); glVertex3fv((pos+(right+up)*(-1)).v);
    // Bottom Right Of The Texture and Quad 
    glTexCoord2f(1.0f, 0.0f); glVertex3fv((pos+(right-up)*(+1)).v);
    // Top Right Of The Texture and Quad
    glTexCoord2f(1.0f, 1.0f); glVertex3fv((pos+(right+up)*(+1)).v); 
    // Top Left Of The Texture and Quad
    glTexCoord2f(0.0f, 1.0f); glVertex3fv((pos+(up-right)*(+1)).v); 
    glEnd();

    glFlush();
} 

위의 소스에서 이미 제작된 vector 클래스를 사용하였다. vector 클래스의 사용은 크게 어렵지 않으므로 10여분정도 투자하여 소스를 분석해보면 쉽게 이해할 수 있을 것이다.

빌보드 기법을 적용하지 않은 경우에 대한 소스 코드를 주석처리하였 놓았다. 주석을 제거하여 실행해 보면서 비교해보기 바란다.