BacuJIuu KypraHoB |
10-11-2009 17:00 1266741 |
Решено.
Всё-таки Си - отличный язык. Надо всегда учить матчасть. Вот 2 рабочих варианта.
Код:
#include <windows.h>
const int storona = 2;
char szTitle[] = "Драконова ломаная";
void drakon(HDC hdc, int d, int *n, int p, int *x, int *y)
{
if (d == 0)
{
// 1-N 2-S 3-W 4-E
MoveToEx(hdc, *x, *y, NULL);
if (*n == 1)
*y -= storona; // Шаг на север
if (*n == 2)
*y += storona; // Шаг на юг
if (*n == 3)
*x -= storona; // Шаг на запад
if (*n == 4)
*x += storona; // Шаг на восток
LineTo(hdc, *x, *y);
}
else
{
drakon(hdc, d - 1, n, 0, x, y); // Правый дракон порядка d-1
switch (p)
{
case 0: //поворот направо
if (*n == 1)
*n = 4;
else if (*n == 2)
*n = 3;
else if (*n == 3)
*n = 1;
else if (*n == 4)
*n = 2;
break;
case 1: // ... или поворот налево
if (*n == 1)
*n = 3;
else if (*n == 2)
*n = 4;
else if (*n == 3)
*n = 2;
else if (*n == 4)
*n = 1;
break;
}
drakon(hdc, d - 1, n, 1, x, y); // Левый дракон порядка d-1
}
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
static int x, y;
int N = 1;
switch (msg)
{
case WM_SIZE:
x = LOWORD(lParam) * 0.3;
y = HIWORD(lParam) * 0.8;
break;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
drakon(hdc, 19, &N, 0, &x, &y);
EndPaint(hwnd, &ps);
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszMenuName = NULL;
wc.lpszClassName = "myWindowClass";
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
RegisterClassEx(&wc);
hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 640, 480,
NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
Код:
#include <windows.h>
const int storona = 2;
char szTitle[] = "Драконова ломаная";
void drakon(HDC hdc, int d, char *n, char p, int *x, int *y)
{
if (d == 0)
{
MoveToEx(hdc, *x, *y, NULL);
if (*n == 'N')
*y -= storona; // Шаг на север
if (*n == 'S')
*y += storona; // Шаг на юг
if (*n == 'W')
*x -= storona; // Шаг на запад
if (*n == 'E')
*x += storona; // Шаг на восток
LineTo(hdc, *x, *y);
}
else
{
drakon(hdc, d - 1, n, 'P', x, y); // Правый дракон порядка d-1
switch (p)
{
case 'P': //поворот направо
if (*n == 'N')
*n = 'E';
else if (*n == 'S')
*n = 'W';
else if (*n == 'W')
*n = 'N';
else if (*n == 'E')
*n = 'S';
break;
case 'L': // ... или поворот налево
if (*n == 'N')
*n = 'W';
else if (*n == 'S')
*n = 'E';
else if (*n == 'W')
*n = 'S';
else if (*n == 'E')
*n = 'N';
break;
}
drakon(hdc, d - 1, n, 'L', x, y); // Левый дракон порядка d-1
}
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
static int x, y;
char N = 'N';
switch (msg)
{
case WM_SIZE:
x = LOWORD(lParam) * 0.3;
y = HIWORD(lParam) * 0.8;
break;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
drakon(hdc, 19, &N, 'P', &x, &y);
EndPaint(hwnd, &ps);
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszMenuName = NULL;
wc.lpszClassName = "myWindowClass";
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
RegisterClassEx(&wc);
hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "myWindowClass",
szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 640, 480,
NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
|