#include <ctime>
#include <vector>
#include <iostream>
#include <atlstr.h>

using namespace std;

struct tagRand
{
	int nCount;
	CString strRand;
};

int main( )
{
	srand( (unsigned)time(NULL) );
	
	int nInput(1);
	vector<tagRand> vecNum;

	//데이터 입력
	for( int i=0 ; i<10 ; ++i )
	{
		tagRand oTemp;

		oTemp.nCount = i+1;
		oTemp.strRand.Format( TEXT("%d"), rand( )%8 );

		vecNum.push_back( oTemp );
	}

	printf( "0을 입력하면 종료됩니다.\n\n" );

	while( nInput != 0 )
	{	
		//입력된 데이터 출력
		for( int i=0 ; i<vecNum.size( ) ; ++i )
		{
			printf( "%d, %s\n", vecNum[i].nCount, vecNum[i].strRand );
		}

		printf( "삭제할 수를 입력하세요 : " );
		scanf( "%d", &nInput );
		printf( "\n" );
		
		//선택한 항목 삭제
		//vector<tagRand>::iterator iter = vecNum.begin( );
		auto iter = vecNum.begin( );
		while( iter != vecNum.end( ) )
		{
			if( iter->nCount == nInput )
			{ 
				iter = vecNum.erase( iter );				
			} 
			else 
			{ 
				++iter; 
			} 
		}
		system( "cls" );
	}

	return 0;
}




ply 파일을 읽어서 출력하는 프로그램입니다. ply 파일은 PhotoSynth에서 SynthExport프로그램을 통해 얻을 수 있습니다.


개발 환경은 아래와 같습니다.

Win x64

Visual Studio 2010 SP1

OpenGL




 




'프로그래밍 관련 > 자작 프로그램' 카테고리의 다른 글

각도기 프로그램  (60) 2013.11.28
위경도 도, 도분, 도분초 변환  (19) 2013.10.17
EXIF Viewer, EXIF 뷰어  (7) 2013.10.05
무료 로또 프로그램 - 오뇽 로또  (393) 2013.09.13
넷마블 틀린그림찾기 매크로  (17) 2013.04.01
HSV Cam Viewer  (4) 2013.03.31
HSV Image Viewer  (1) 2013.03.31

OpenGL로 구현한 프로그램에 화면 캡쳐 기능이 필요해서 오동님 블로그를 참조해서 사용하다가 리눅스(Qt)에서도 사용하게 될 일이 있어서 수정한 거 올립니다. 확인 결과 MFC, Win32 API 에서 문제 없이 잘 동작하며 리눅스에의 확인은 제 친구가 했는 데 리눅스에서도 문제 없이 잘 동작한다고 하네요.(비트맵 관련 구조체가 없어서 구조체는 직접 추가했다고 함)


void ScreenCapture( const char *strFilePath )
{
	//비트맵 파일 처리를 위한 헤더 구조체
	BITMAPFILEHEADER	BMFH;
	BITMAPINFOHEADER	BMIH;

	int nWidth = 0;
	int nHeight = 0;
	unsigned long dwQuadrupleWidth = 0;		//LJH 추가, 가로 사이즈가 4의 배수가 아니라면 4의 배수로 만들어서 저장

	GLbyte *pPixelData = NULL;				//front buffer의 픽셀 값들을 얻어 오기 위한 버퍼의 포인터

#ifdef WIN32
	//윈도우의 클라이언트 영역 좌표
	RECT ImageRect;
	GetClientRect( *m_hWndCopy, &ImageRect );			

	//이미지 영역 좌표를 이용하여 실제 이미지의 사이즈를 계산
	nWidth  = ImageRect.right - ImageRect.left;		//윈도우 버전의 경우 사이즈 변경이 되므로 그때그때 조사
	nHeight = ImageRect.bottom - ImageRect.top;

#else
	nWidth  = 1024;		//(나의 경우)리눅스에서의 경우 해상도 고정이므로 그 값을 입력
	nHeight = 768;

#endif

	//4의 배수인지 아닌지 확인해서 4의 배수가 아니라면 4의 배수로 맞춰준다.
	dwQuadrupleWidth = ( nWidth % 4 ) ? ( ( nWidth ) + ( 4 - ( nWidth % 4 ) ) ) : ( nWidth );

	//비트맵 파일 헤더 처리
	BMFH.bfType  = 0x4D42;		//B(42)와 M(4D)에 해당하는 ASCII 값을 넣어준다.
	//바이트 단위로 전체파일 크기
	BMFH.bfSize  = sizeof( BITMAPFILEHEADER ) + sizeof( BITMAPINFOHEADER ) + ( dwQuadrupleWidth * 3 * nHeight );
	//영상 데이터 위치까지의 거리
	BMFH.bfOffBits = sizeof( BITMAPFILEHEADER ) + sizeof( BITMAPINFOHEADER );

	//비트맵 인포 헤더 처리
	BMIH.biSize				= sizeof( BITMAPINFOHEADER );		//이 구조체의 크기
	BMIH.biWidth			= nWidth;							//픽셀 단위로 영상의 폭
	BMIH.biHeight			= nHeight;							//영상의 높이
	BMIH.biPlanes			= 1;								//비트 플레인 수(항상 1)
	BMIH.biBitCount			= 24;								//픽셀당 비트수(컬러, 흑백 구별)
	BMIH.biCompression		= BI_RGB;							//압축 유무
	BMIH.biSizeImage		= dwQuadrupleWidth * 3 * nHeight;	//영상의 크기
	BMIH.biXPelsPerMeter	= 0;								//가로 해상도
	BMIH.biYPelsPerMeter	= 0;								//세로 해상도
	BMIH.biClrUsed			= 0;								//실제 사용 색상수
	BMIH.biClrImportant		= 0;								//중요한 색상 인덱스

	pPixelData = new GLbyte[ dwQuadrupleWidth * 3 * nHeight ];	//LJH 수정

    //프런트 버퍼로 부터 픽셀 정보들을 얻어온다.
	glReadPixels(
		0, 0,					//캡처할 영역의 좌측상단 좌표
		nWidth, nHeight,		//캡처할 영역의 크기
		GL_BGR,					//캡처한 이미지의 픽셀 포맷
		GL_UNSIGNED_BYTE,		//캡처한 이미지의 데이터 포맷
		pPixelData				//캡처한 이미지의 정보를 담아둘 버퍼 포인터
		);

	{//저장 부분
		FILE *outFile = fopen( strFilePath, "wb" );
		if( outFile == NULL )
		{
			//에러 처리
			//printf( "에러" );
			//fclose( outFile );
		}

		fwrite( &BMFH, sizeof( char ), sizeof(BITMAPFILEHEADER), outFile );			//파일 헤더 쓰기
		fwrite( &BMIH, sizeof( char ), sizeof(BITMAPINFOHEADER), outFile );			//인포 헤더 쓰기
		fwrite( pPixelData, sizeof( unsigned char ), BMIH.biSizeImage, outFile );	//glReadPixels로 읽은 데이터 쓰기

		fclose( outFile );	//파일 닫기
	}

	if ( pPixelData != NULL )
	{
		delete pPixelData;
	}
}


아래는 위의 함수로 저장한 bmp파일들입니다.

C언어나 C++에서 사용할 수 있는 함수입니다. 두 지점의 위경도 값을 정해서 함수에 대입하면 Meter로 값을 반환합니다. km로 값을 받고 싶으면 dDistance*=1000; 부분 주석치면 됩니다.

double GetDistance( tagPT pt1, tagPT pt2 )
{
	int radius = 6371;

	double dLat = rad( (pt2.y-pt1.y) );
	double dLon = rad( (pt2.x-pt1.x) );
	
	pt1.y = rad( pt1.y );
	pt2.y = rad( pt2.y );

	double a = sin(dLat⁄2) * sin(dLat⁄2) + sin(dLon⁄2) * sin(dLon⁄2) * cos(pt1.y) * cos(pt2.y);
	double c = 2 * atan2f(sqrtf(a), sqrtf(1-a));
	double dDistance = radius * c;

	dDistance*=1000;

	return dDistance;
}



아래는 예제 입니다.

#include <stdio.h>
#include <math.h>

#define rad(x) x*3.14159⁄180.0

struct tagPT
{
	double x;
	double y;
	double z;
};

double GetDistance( tagPT pt1, tagPT pt2 );

int main()
{
	tagPT pt1;
	tagPT pt2;
	
	//한밭수목원 거리
	pt1.y = 36.364808;
	pt1.x = 127.379525;

	pt2.y = 36.364772;
	pt2.x = 127.390275;

	double dDis = GetDistance( pt1, pt2 );

	return 0;
}

double GetDistance( tagPT pt1, tagPT pt2 )
{
	int radius = 6371;

	double dLat = rad( (pt2.y-pt1.y) );
	double dLon = rad( (pt2.x-pt1.x) );
	
	pt1.y = rad( pt1.y );
	pt2.y = rad( pt2.y );

	double a = sin(dLat⁄2) * sin(dLat⁄2) + sin(dLon⁄2) * sin(dLon⁄2) * cos(pt1.y) * cos(pt2.y);
	double c = 2 * atan2f(sqrtf(a), sqrtf(1-a));
	double dDistance = radius * c;

	dDistance*=1000;

	return dDistance;
}


마방진이란


정보처리기사 배열 마방진(Magic Square) 만들기 입니다.


#include <stdio.h>

//마방진의 크기를 결정
//홀수로 입력하되, 19미만이 보기 좋음
//7이상부터 19까지는 대각선 "우상좌하" 의 합이 다른 합과 다름
#define MAX 19

int main()
{
	//좌표 0, 2부터 시작 
	int i(0), j(2), k(1);
	int arr[MAX][MAX];

	for(k=1 ; k<=(MAX*MAX) ; k++)
	{
		//처음 0, 2에 1을 대입 
		arr[i][j] = k;
		
		//k가 배열 크기의 배수이면 규칙에 따라 행만 증가
		if(k%MAX == 0)
			++i;

		//k가 배열 크기의 배수가 아니면 규칙에 따라 "행감소, 열증가"
		if(k%MAX != 0)
		{			

			//마방진 규칙 "행감소, 열증가"
			--i;
			j++;

			//행이 감소하다가 0보다 작아지면 배열 크기의 가장 큰 값으로 교체
			if(i < 0)	i = MAX-1;

			//열이 증가하다가 배열 크기보다 커지면 0으로 교체
			if( j > (MAX-1) )	j = 0;
		}
	}

	//출력
	for(i=0 ; i<MAX ; i++)
	{
		for(j=0 ; j<MAX ; j++)
		{
			printf("%4d", arr[i][j]);
		}
		printf("\n");
	}

	printf("\n");

	return 0;
}



정보처리기사 배열 달팽이 만들기 입니다.


#include<stdio.h>

//달팽이의 크기를 지정
//홀수를 입력하되 19미만이 보기 좋음
#define MAX 7

int main()
{
	int i(0), j(-1), k(0), p, n(MAX);		//i=행, j=열, k=대입값
	int sw(1);
	int arr[MAX][MAX]={0};

	//달팽이 모양으로 대입
	while( n>0 )
	{
		//열 증가 및 감소
		for( p=0 ; p<n ; p++ )
		{
			j = j + sw;
			arr[i][j] = ++k;
		}
		
		//달팽이를 채워감에 따라 감소하는 수
		--n;
		
		//행 증가 및 감소
		for( p=0 ; p<n ; p++ )
		{
			i = i + sw;
			arr[i][j] = ++k;
		}

		//sw값이 1, -1을 반복
		sw = sw*(-1);
	}

	//출력
	for( i=0 ; i<MAX ; i++ )
	{
		for( j=0 ; j<MAX ; j++ )
		{
			printf("%4d", arr[i][j]);
		}
		printf("\n");
	}
	
	printf("\n");

	return 0;
}


정보처리기사 배열 다이아몬드 만들기 입니다.


#include <stdio.h>

//다이아몬드의 크기를 지정
//"홀수"만 입력하되 19미만이 보기 좋음
#define MAX 13

int main()
{
	int row, col, k(0);		//row=행, col=열
	int begin(0), end(0);
	int center=MAX⁄2;
	int arr[MAX][MAX]={0};

	//대입
	for( row=0 ; row<MAX ; row++ )
	{
		//상
		if(row <= center)
		{
			begin = center -row ;
			end = row+center ;
		}
		
		//하
		if(row > center)
		{
			begin = row-center ;
			//끝 값이 MAX의 크기에 비례하여 대입
			end = (MAX+center-1)-row ;
		}

		//상하에 따라 대입
		for( col=begin ; col<=end ; col++ )
		{
			++k;
			arr[row][col] = k;
		}
	}

	//출력
	for( row=0 ; row<MAX ; row++ )
	{
		for( col=0 ; col<MAX ; col++ )
		{
			printf( "%4d", arr[row][col]);
		}
		printf( "\n" );
	}

	printf( "\n" );

	return 0;
}



정보처리기사 배열 모래시계 만들기 입니다.



#include <stdio.h>

//모래시계의 크기를 지정
//"홀수"만 입력하되 19미만이 보기 좋음
#define MAX 13

int main()
{
	int row, col, k(0);		//row=행, col=열
	int begin(0), end(0);
	int center=MAX⁄2;
	int arr[MAX][MAX]={0};

	//상하로 나누어 모래시계 모양으로 대입
	for(row=0 ; row<MAX ; row++)
	{
		//상
		if(row <= center)
		{
			begin = row; 
			end = MAX-row;
		}

		//하
		if(row > center)
		{
			begin = (MAX-1)-row; 
			end = row+1;		
		}

		//if문에 따라 대입되는 값이 변함
		for(col=begin ; col<end ; col++)
		{
			++k;
			arr[row][col] = k;
		}
	}

	//출력
	for(row=0 ; row<MAX ; row++)
	{
		for(col=0 ; col<MAX ; col++)
		{
			printf("%4d", arr[row][col]);
		}
		printf("\n");
	}

	printf("\n");

	return 0;
}


정보처리기사 배열 대각선 채우기 입니다.

#include <stdio.h>

//행, 열의 크기를 지정, 10미만일때 보기 편함.
#define MAX 10

int main()
{
	int arr[MAX][MAX]={0};
	int i, j, k(0);
	int spin;

	//대각선으로 대입
	for(spin=2 ; spin<=(MAX*2) ; spin++ )
	{
		for(i=1 ; i<=MAX ; i++)
		{
			//대각선 대입 규칙
			j = spin-i;
		
			//j값이 특정 범위 내일 때만 대입
			if(j <= MAX && j > 0)
			{
				++k;

				//각각 -1하는 건 spin과 i의 초기값이 2와 1이어서( 1, 1=2-1 )
				arr[i-1][j-1] = k;
			}
		}//for i
	}//for spin

	⁄⁄출력
	for(i=0 ; i<MAX ; i++)
	{
		for(j=0 ; j<MAX ; j++)
		{
			printf("%2d ", arr[i][j]);
		}
		printf("\n");
	}

	return 0;
}


Qnap TS-212랑 자작나스입니다. TS-212는 MySQL이랑 AirComics, FTP 서버가 24시간 돌고 있고, 자작나스에는 MySQL이랑 FTP, svn, Torrent, plex, smb 서버가 새벽 시간을 제외하고 돌고 있습니다.


아래는 자작나스 사양입니다.



두 나스 모두 조용해서 좋네요.







+ Recent posts