반응형
프랙탈을 그리는데 일반적으로 많이들 해보는 것이 코시곡선, 맨델브로트 집합 등인 듯 합니다.
여기서는 간단하게 Win32 API를 이용해서 Sierpinsky 삼각형을 그려보도록 합니다.
일단 이 프로그램을 이해하기 위해서는 Win32의 기본적인 프로그램 구조를 알아야 하겠죠.
프랙탈 자체가 자기 복제이기 때문에 이미지를 축소시켜서 복사하는 방법도 있겠지만, 여기서는 순수하게 라인만 가지고 그려봅니다.
프랙탈이 자기 복제이므로, C/C++ 프로그램에서도 자기복제가 되는 자기호출함수를 이용해서 프로그램을 짭니다. 정삼각형을 자기복제를 이용해서 그리면, 전체를 그리지 않아도 훌륭하게 완성됩니다.
여기서는 가장 중요한 키 함수만 소개하면 다음과 같습니다.
void DrawTriangle(HDC hdc, float x, float y, float r, int t)
{
if( t == 1 )
{
MoveToEx(hdc, x, y-r, 0);
for( int i = 1 ; i < 3 ; i++ )
{
LineTo(hdc, x+r*sin(2*i*M_PI/3.0)+0.5, y-r*cos(2*i*M_PI/3.0)+0.5);
}
LineTo(hdc, x, y-r);
return;
}
for( int i = 0 ; i < 3 ; i++ )
{
DrawTriangle(hdc, x+r*sin(2*i*M_PI/3.0)/2.0, y-r*cos(2*i*M_PI/3.0)/2.0, r/2.0f, t-1);
}
}
hdc는 WM_PAINT에서 BeginPaint로 받은 DC를 받으면 됩니다.
x, y는 삼각형의 중심값입니다. r은 삼각형 중심에서 꼭지점에 이르는 거리입니다. t는 반드시 1 이상이어야 하고, 얼마나 삼각형을 더 그리냐입니다.
예를 들어서 작은 삼각형을 4단계까지 그리려면
DrawTriangle(hdc, 200, 200, 200, 4);
로 WM_PAINT의 BeginPaint 호출 뒤에 불러주시면 됩니다.
t 가 1일 때 삼각형을 그립니다. 이 부분이 재귀함수의 탈출조건입니다.
삼각형을 그리는 방법은 극좌표계를 따랐습니다.
재귀호출 부분도 삼각형을 그리는 것과 동일한 방식을 따랐습니다.
윈도즈 프로그램이다보니 Visual Studio 2010 프로젝트를 첨부합니다.
결과화면은 다음과 같습니다.
728x90
'Programming > Win32' 카테고리의 다른 글
트레이 프로그램 작성 (0) | 2011.11.28 |
---|
댓글