Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Mebius.cpp: определяет точку входа для приложения.
- //
- #include "stdafx.h"
- #include "Mebius.h"
- #define _USE_MATH_DEFINES
- #include <cmath>
- const int Z_SIZE = 2000;
- double z_buffer[Z_SIZE][Z_SIZE];
- #define MAX_LOADSTRING 100
- //#define ISOMETRIC
- void proj(double x, double y, double z, double &xx, double &yy) {
- #ifdef ISOMETRIC
- xx = (y - x) * sqrt(3) / 2.0;
- yy = (x + y) / 2.0 - z;
- #else
- xx = -x / (2.0 * sqrt(2)) + y;
- yy = x / (2.0 * sqrt(2)) - z;
- #endif
- }
- void Mebius(double u, double v, double R, double W, double &x, double &y, double &z) {
- x = (R + v / 2.0 * cos(u / 2.0)) * cos(u);
- y = (R + v / 2.0 * cos(u / 2.0)) * sin(u);
- z = v / 2.0 * sin(u / 2.0);
- }
- double n_x(double R, double u, double v) {
- double x_result;
- x_result = -1.0L / 2.0L*R*pow(sin(u), 2)*cos((1.0L / 2.0L)*u) - 1.0L / 2.0L*R*cos((1.0L / 2.0L)*u)*pow(cos(u), 2) - 1.0L / 4.0L*v*pow(sin(u), 2)*pow(cos((1.0L / 2.0L)*u), 2) - 1.0L / 4.0L*v*pow(cos((1.0L / 2.0L)*u), 2)*pow(cos(u), 2);
- return x_result;
- }
- double n_y(double R, double u, double v) {
- double y_result;
- y_result = (1.0L / 2.0L)*R*sin((1.0L / 2.0L)*u)*cos(u) - 1.0L / 8.0L*v*pow(sin((1.0L / 2.0L)*u), 2)*sin(u) + (1.0L / 4.0L)*v*sin((1.0L / 2.0L)*u)*cos((1.0L / 2.0L)*u)*cos(u) - 1.0L / 8.0L*v*sin(u)*pow(cos((1.0L / 2.0L)*u), 2);
- return y_result;
- }
- double n_z(double R, double u, double v) {
- double z_result;
- z_result = (1.0L / 2.0L)*R*sin((1.0L / 2.0L)*u)*sin(u) + (1.0L / 8.0L)*v*pow(sin((1.0L / 2.0L)*u), 2)*cos(u) + (1.0L / 4.0L)*v*sin((1.0L / 2.0L)*u)*sin(u)*cos((1.0L / 2.0L)*u) + (1.0L / 8.0L)*v*pow(cos((1.0L / 2.0L)*u), 2)*cos(u);
- return z_result;
- }
- // Глобальные переменные:
- HINSTANCE hInst; // текущий экземпляр
- TCHAR szTitle[MAX_LOADSTRING]; // Текст строки заголовка
- TCHAR szWindowClass[MAX_LOADSTRING]; // имя класса главного окна
- // Отправить объявления функций, включенных в этот модуль кода:
- ATOM MyRegisterClass(HINSTANCE hInstance);
- BOOL InitInstance(HINSTANCE, int);
- LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
- INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
- int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
- _In_opt_ HINSTANCE hPrevInstance,
- _In_ LPTSTR lpCmdLine,
- _In_ int nCmdShow)
- {
- UNREFERENCED_PARAMETER(hPrevInstance);
- UNREFERENCED_PARAMETER(lpCmdLine);
- // TODO: разместите код здесь.
- MSG msg;
- HACCEL hAccelTable;
- // Инициализация глобальных строк
- LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
- LoadString(hInstance, IDC_MEBIUS, szWindowClass, MAX_LOADSTRING);
- MyRegisterClass(hInstance);
- // Выполнить инициализацию приложения:
- if (!InitInstance (hInstance, nCmdShow))
- {
- return FALSE;
- }
- hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MEBIUS));
- // Цикл основного сообщения:
- while (GetMessage(&msg, NULL, 0, 0))
- {
- if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- }
- return (int) msg.wParam;
- }
- //
- // ФУНКЦИЯ: MyRegisterClass()
- //
- // НАЗНАЧЕНИЕ: регистрирует класс окна.
- //
- ATOM MyRegisterClass(HINSTANCE hInstance)
- {
- WNDCLASSEX wcex;
- wcex.cbSize = sizeof(WNDCLASSEX);
- wcex.style = CS_HREDRAW | CS_VREDRAW;
- wcex.lpfnWndProc = WndProc;
- wcex.cbClsExtra = 0;
- wcex.cbWndExtra = 0;
- wcex.hInstance = hInstance;
- wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MEBIUS));
- wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
- wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
- wcex.lpszMenuName = MAKEINTRESOURCE(IDC_MEBIUS);
- wcex.lpszClassName = szWindowClass;
- wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
- return RegisterClassEx(&wcex);
- }
- //
- // ФУНКЦИЯ: InitInstance(HINSTANCE, int)
- //
- // НАЗНАЧЕНИЕ: сохраняет обработку экземпляра и создает главное окно.
- //
- // КОММЕНТАРИИ:
- //
- // В данной функции дескриптор экземпляра сохраняется в глобальной переменной, а также
- // создается и выводится на экран главное окно программы.
- //
- BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
- {
- HWND hWnd;
- hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной
- hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
- CW_USEDEFAULT, 0, 1000, 1000, NULL, NULL, hInstance, NULL);
- if (!hWnd)
- {
- return FALSE;
- }
- ShowWindow(hWnd, nCmdShow);
- UpdateWindow(hWnd);
- return TRUE;
- }
- //
- // ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM)
- //
- // НАЗНАЧЕНИЕ: обрабатывает сообщения в главном окне.
- //
- // WM_COMMAND - обработка меню приложения
- // WM_PAINT -Закрасить главное окно
- // WM_DESTROY - ввести сообщение о выходе и вернуться.
- //
- //
- LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- int wmId, wmEvent;
- PAINTSTRUCT ps;
- HDC hdc;
- RECT rect;
- GetClientRect(hWnd, &rect);
- const int w = rect.right - rect.left;
- const int T = 2000;
- const int h = rect.bottom - rect.top;
- const int u_size = 30;
- const int v_size = 10;
- int X, Y, X0, Y0;
- double R = 2.0, W = .8;
- double u, v, x, y, z, xx, yy, nx, ny, nz;
- double prev_x, prev_y, prev_z;
- double const L = 3.0;
- double max_xx = L, max_yy = L, min_xx = -L, min_yy = -L;
- switch (message)
- {
- case WM_COMMAND:
- wmId = LOWORD(wParam);
- wmEvent = HIWORD(wParam);
- // Разобрать выбор в меню:
- switch (wmId)
- {
- case IDM_ABOUT:
- DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
- break;
- case IDM_EXIT:
- DestroyWindow(hWnd);
- break;
- default:
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
- break;
- case WM_PAINT:
- hdc = BeginPaint(hWnd, &ps);
- // TODO: добавьте любой код отрисовки...
- proj(0, 0, 0, xx, yy);
- X0 = w * (xx - min_xx) / (max_xx - min_xx);
- Y0 = h * (yy - min_yy) / (max_yy - min_yy);
- proj(1, 0, 0, xx, yy);
- X = w * (xx - min_xx) / (max_xx - min_xx);
- Y = h * (yy - min_yy) / (max_yy - min_yy);
- MoveToEx(hdc, X0, Y0, NULL); LineTo(hdc, X, Y);
- proj(0, 1, 0, xx, yy);
- X = w * (xx - min_xx) / (max_xx - min_xx);
- Y = h * (yy - min_yy) / (max_yy - min_yy);
- MoveToEx(hdc, X0, Y0, NULL); LineTo(hdc, X, Y);
- proj(0, 0, 1, xx, yy);
- X = w * (xx - min_xx) / (max_xx - min_xx);
- Y = h * (yy - min_yy) / (max_yy - min_yy);
- MoveToEx(hdc, X0, Y0, NULL); LineTo(hdc, X, Y);
- for (int j = 0; j <= T; j++) {
- for (int i = 0; i <= T; i++) {
- u = 2.0 * M_PI / (double)T * (double)i;
- v = 2.0 * W / (double)T * (double)j - W;
- Mebius(u, v, R, W, x, y, z);
- proj(x, y, z, xx, yy);
- X = w * (xx - min_xx) / (max_xx - min_xx);
- Y = h * (yy - min_yy) / (max_yy - min_yy);
- z_buffer[X][Y] = x;
- }
- }
- for (int j = 0; j <= T; j++) {
- for (int i = 0; i <= T; i++) {
- u = 2.0 * M_PI / (double)T * (double)i;
- v = 2.0 * W / (double)T * (double)j - W;
- Mebius(u, v, R, W, x, y, z);
- proj(x, y, z, xx, yy);
- X = w * (xx - min_xx) / (max_xx - min_xx);
- Y = h * (yy - min_yy) / (max_yy - min_yy);
- z_buffer[X][Y] = max(x, z_buffer[X][Y]);
- }
- }
- for (int j = 0; j <= v_size; j++) {
- for (int i = 0; i <= T; i++) {
- u = 2.0 * M_PI / (double)T * (double)i;
- v = 2.0 * W / (double)v_size * (double)j - W;
- Mebius(u, v, R, W, x, y, z);
- proj(x, y, z, xx, yy);
- X = w * (xx - min_xx) / (max_xx - min_xx);
- Y = h * (yy - min_yy) / (max_yy - min_yy);
- if (abs(z_buffer[X][Y] - x) < 0.1) {
- if (n_x(R, u, v) + 2.0 * sqrt(2.0) * n_y(R, u, v) + n_z(R, u, v) > 0)
- SetPixel(hdc, X, Y, RGB(0, 0, 255));
- else
- SetPixel(hdc, X, Y, RGB(0, 120, 0));
- }
- }
- }
- for (int i = 0; i <= u_size; i++) {
- for (int j = 0; j <= 2000; j++) {
- u = 2.0 * M_PI / (double)u_size * (double)i;
- v = 2.0 * W / (double)2000 * (double)j - W;
- x = (R + v / 2.0 * cos(u / 2.0)) * cos(u);
- y = (R + v / 2.0 * cos(u / 2.0)) * sin(u);
- z = v / 2.0 * sin(u / 2.0);
- proj(x, y, z, xx, yy);
- X = w * (xx - min_xx) / (max_xx - min_xx);
- Y = h * (yy - min_yy) / (max_yy - min_yy);
- if (abs(z_buffer[X][Y] - x) < 0.1) {
- if (n_x(R, u, v) + 2.0 * sqrt(2.0) * n_y(R, u, v) + n_z(R, u, v) > 0)
- SetPixel(hdc, X, Y, RGB(0, 0, 255));
- else
- SetPixel(hdc, X, Y, RGB(0, 120, 0));
- }
- }
- }
- EndPaint(hWnd, &ps);
- break;
- case WM_DESTROY:
- PostQuitMessage(0);
- break;
- default:
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
- return 0;
- }
- // Обработчик сообщений для окна "О программе".
- INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
- {
- UNREFERENCED_PARAMETER(lParam);
- switch (message)
- {
- case WM_INITDIALOG:
- return (INT_PTR)TRUE;
- case WM_COMMAND:
- if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
- {
- EndDialog(hDlg, LOWORD(wParam));
- return (INT_PTR)TRUE;
- }
- break;
- }
- return (INT_PTR)FALSE;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement