Оглавление
Введение. 3
1 Постановка задачи. 4
2 Выбор решения. 5
2.1 Определение структуры данных программы. 6
3 Описание разработки программы.. 7
4 Отладка и тестирование. 12
5 Описание программы.. 13
6 Руководство пользователя. 15
Заключение. 17
Список используемых источников. 18
Приложение А.. 19
Приложение А.1. Листинг программы.. 19
Приложение А.2. Модель дивана (файл «my.txt») 27
Приложение B.. 29
Снимки экрана. 29
Введение
Компьютерная графика — область деятельности, в которой компьютеры используются в качестве инструмента как для создания изображений, так и для обработки визуальной информации, полученной из реального мира.
Компьютерная графика появилась достаточно давно - уже в 1960-ых годах существовали полноценные графические системы. Сегодня принято пользоваться терминами компьютерная графика и компьютерная анимация. Понятие компьютерная графика включает все виды работ со статическими изображениями, компьютерная анимация имеет дело с динамически изменяющимися изображениями.
Понятие компьютерной графики связано с понятием каркасной модели. Каркасная модель — модель объекта в трёхмерной графике, представляющая собой совокупность вершин и рёбер, которая определяет форму отображаемого многогранного объекта. Каркасная модель так же называет проволочной.
Каркасная модель представляет собой форму детали в виде конечного множества линий, лежащих на поверхностях детали. Для каждой линии известны координаты концевых точек и указана их инцидентность ребрам или поверхностям.
В компьютерной графике так же используется понятие матрицы поворота. Матрицей поворота (или матрицей направляющих косинусов) называется матрица, которая используется для выполнения собственного ортогонального преобразования в евклидовом пространстве. При умножении любого вектора на матрицу поворота длина вектора сохраняется. Определитель матрицы поворота равен единице. Любое вращение в трехмерном пространстве может быть представлено как композиция поворотов вокруг трех ортогональных осей (например, вокруг осей декартовых координат).
1 Постановка задачи
Необходимо разработать программу на языке Си (С++), реализующую процесс построения и визуализации экранного отображения каркасной модели трехмерного объекта. Объект моделирования: каркасная модель трехмерного объекта (модель дивана).
Необходимо составить геометрическую модель трехмерного объекта, включающего описание координат вершин и ребер, сложностью не менее 50 вершин.
Необходимо написать и отладить программу, выполняющую преобразования. В результате работы программы должно строиться каркасное отображение трехмерного объекта. Программа должно позволять интерактивно с клавиатуры изменять значение расстояния до объекта и углов. Программа должна иметь дружественный интерфейс, меню и меню помощи.
Требуется создать анимационный роли, где демонстрируется работа программы.
2 Выбор решения
Перед созданием программы была продумана модель дивана, координаты его точек и связи между ними. Так же было решено, как будут храниться исходные данные.
Модель дивана состоит из 66 точек. Эти точки хранятся в исходном файле «my.txt» (см. приложение А.2). В этом файле так же хранятся номера точек, которые необходимо, чтобы программа соединила. Тогда на экране появится графическое изображение объекта.
При построении фигуры программа считывает из файла количество точек, выделяет динамическую память для хранения этих точек. Далее программа считывает число связей, так же выделяя динамическую память. Связи хранятся в отдельной структуре. Следует отметить, что был придуман алгоритм, позволяющий построить фигуру, используя структуру со связями.
При выводе изображения на экран происходит перевод из трехмерных координат в двумерные с помощью проецирования. Это действие записано отдельной процедурой и вызывается при каждом изменении координат искомой фигуры.
Поворот объекта осуществляется изменением координат, а именно умножением координат фигуры на матрицу поворота.
В программе используется две матрицы поворота: по оси Х и по оси У. Матрицы поворота имеют следующий вид:
В программе предусмотрена анимация объекта. Она демонстрирует возможности программы, поворачивая объект, приближая и отдаляя его.
В программе было создано диалоговое окно, которое показывает пользователю клавиши, которые управляют вращением фигуры, масштабированием и изменением угла поворота и коэффициента масштабирования.
2.1 Определение структуры данных программы.
Для структурирования данных внутри программы используются динамические массивы структур. Они имеют следующий вид:
struct coord_3d { // Трехмерные координаты
float x;
float y;
float z;
} *coor_3d, *copycoor_3d;
struct coord_2d { // Двумерные координаты
float sx;
float sy;
} *coor_2d;
struct sctlinks { // Для построения фигуры (точки, которые нужно соединить, соединить one с two)
int one;
int two;
} *links;
struct sctmatrix { // Умноженная матрица
float x;
float y;
float z;
} matrix[3];
Программа умеет делать следующее:
1. Строить исходную фигуру
2. Вращать фигуру с помощью клавиш-стрелок.
3. Приближать и отдалять объект.
4. Изменять значения угла поворота и коэффициента масштабирования.
5. Показывать анимацию.
3 Описание разработки программы
Для создания этой программы были использованы языки программирования Си и С++. Они являются распространенными языками программирования и позволяют создавать интерактивные программы.
В качестве среды программирования был выбран программный продукт Visual Studio 2005.
Интерфейс программы представлен в виде меню, т.к. такой интерфейс является наиболее удобным и обеспечивает наименьшее время доступа к данным. Такая реализация позволяет удобно использовать программу, даже если пользователь до этого с ней не работал.
При запуске программы пользователю в меню необходимо выбрать пункт «Файл» - «Построить фигуру». Тогда на экране отобразится каркасная модель трехмерного объекта.
Для просмотра анимации необходимо во вкладке «Файл» выбрать пункт «Анимация».
Для просмотра меню помощи нужно нажать вкладку «Помощь» - «О программе».
Для выхода можно нажать крестик и выбрать соответствующий пункт в меню.
Алгоритм построения фигуры имеет следующий вид:
Формулы проецирования записаны в программе:
i = 0; i < c_number; i++
i
где coor_2d[i].sx и coor_2d[i].sy – двумерные координаты по х и по у, coor_3d[i].x , coor_3d[i].y, coor_3d[i].z – трехмерные координаты, dist – дистанция от камеры до начала координат.
Вывод фигуры на экран осуществляется следующим образом:
i = 0; i < links_number; i++
i
Ниже представлена структурная схема алгоритма.
4 Отладка и тестирование
В качестве среды разработки был выбран программный продукт Microsoft Visual Studio 2005. Программа предоставляет все средства, необходимые для разработки программы и ее отладки. Для отладки использовались такие инструменты, как точка останова, выполнение программы по шагам, анализ содержимого переменных.
Тестирование проводилось в процессе создания функций программы и после завершения разработки всей программы. В ходе тестирования была выявлена и исправлена проблема построения фигуры и выполнения анимации. В программу была добавлена возможность проверки ввода некорректных данных. Это значит, что фигура при вращении и масштабировании не выходит за пределы экрана.
5 Описание программы
Разработанная программа состоит из нескольких функций. Такое разбиение позволяет более эффективно работать с кодом программы, быстрее находить и исправлять возникшие ошибки.
Программа строит на экране каркасное изображение дивана и позволяет вращать и масштабировать фигуру. Программа имеет возможность изменять значение угла вращения и коэффициента масштабирования.
Сам поворот фигуры реализован следующим способом. В программе написана функция, которая умножает исходные трехмерные координаты на матрицу поворота. В матрице поворота есть значение угла поворота. Изначально он равен единице, но это значение можно изменять. В описанной функции проверяется значение координат. Это значит, что фигура не выходит за пределы экрана.
Масштабирование объекта достигнуто путем умножения исходных координат на коэффициент масштабирования, который можно интерактивно изменять. Масштабирование реализовано таким способом, что объект не выходит за пределы экрана.
В результате мы получаем на экране трехмерное изображение заданного объекта, с которым мы можем осуществлять вышеописанные действия.
Ниже представлены чертежи трех проекций объекта.
6 Руководство пользователя
Программа предназначена для реализации видовых, перспективных и экранных преобразований. После запуска программы пользователю необходимо нажать «Файл» - «Построить фигуру». Тогда на экране построится искомая фигура.
Далее пользователь может вращать объект с помощью клавиш-стрелок. Так же в программе возможен поворот одновременно в две стороны. За это действие отвечают клавиши:
Num1 – поворот вниз и влево
Num2 – поворот вправо и вниз
Num3 – поворот влево и вверх
Num4 – поворот вправо и вверх
Изначально угол поворота в программе задан равным единице. Это видно в левом верхнем углу. Его можно увеличить нажатием клавиши F1 и уменьшить клавишей F2. Угол может принимать значение от 1 до 89. Когда угол поворота равен 90, фигура не вращается. Если угол больше 90 градусов, то объект вращается в обратную сторону. В этом случает действие, закрепленное за клавишей, может не соответствовать происходящему на экране.
Масштабирование осуществляется нажатием клавиш «+» и «-». Здесь фигурирует коэффициент масштабирования. Его значение так же выведено в левом верхнем углу. Пользователь может его увеличить нажатием клавиши F3 и уменьшить клавишей F4. Коэффициент может принимать значение от 1,01 до 1,99. При больших значениях фигура выходит за пределы экрана. При коэффициенте равном единице, программа не масштабирует.
В программе реализована возможность просмотра анимации, демонстрирующей возможности данного ПО. Для просмотра необходимо выбрать вкладку «Файл» - «Анимация».
При возникновении сложностей пользователь может воспользоваться помощью, выбрав вкладку «Помощь» - «О программе». На экран выведется следующее сообщение:
Заключение
При выполнении данной курсовой работы были получены навыки разработки программ реализующих видовые, перспективные и экранные преобразования. Был изучен математический аппарат, позволяющий реализовать вращение трехмерного объекта.
В рамках выполнения курсовой работы была написана программа, позволяющая строить каркасную модель, вращать и масштабировать ее. В дальнейшем программу можно улучшить путем добавления возможности вращения фигуры мышью.
Список используемых источников
1. Касюк С.Т. Курс программирования на языке Си. 2010 г.
2. MSDN.
3. Свободная энциклопедия Википедия.
4. Методические материалы по заданию.
Приложение А
Приложение А.1. Листинг программы
#include "stdafx.h"
#include "KG.h"
#define MAX_LOADSTRING 100
////////////////////////////////////////////////////////////////////////////
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
HWND hWnd;
HPEN hPen;
FILE * my;
int i, j;
int c_number; // Количество координат в структуре трехмерных координат
int links_number; // Количество соединений
int dist = 1500; // Расстояние от камеры до начала координат
float Pi = 3.14159265358979323846;
int flag;
int alpha; //угол поворота
float k; //коэффциент масштабирования
char buf[1], buf1[1], buf3[1], buf4[4]; //Перменные для вывода значений угла и коэффициента на экран
LPCWSTR str, str1, str2, str3; //Преобразуются itoa в char
int a = 1, b = 0, c = 0, d = 1;
struct coord_3d { // Трехмерные координаты
float x;
float y;
float z;
} *coor_3d, *copycoor_3d;
struct coord_2d { // Двумерные координаты
float sx;
float sy;
} *coor_2d;
struct sctlinks { // Для построения фигуры (точки, которые нужно соединить, соединить one с two)
int one;
int two;
} *links;
struct sctmatrix { // Умноженная матрица
float x;
float y;
float z;
} matrix[3];
////////////////////////////////////////////////////////////////////////////
// Global Variables:
HINSTANCE hInst; // current instance
TCHAR szTitle[MAX_LOADSTRING]; // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING]; // the window class name
// Forward declarations of functions included in this code module:
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(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
// TODO: Place code here.
MSG msg;
HACCEL hAccelTable;
// Initialize global strings
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_KG, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
// Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_KG));
// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int) msg.wParam;
}
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_KG));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_KG);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
return RegisterClassEx(&wcex);
}
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance; // Store instance handle in our global variable
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
void draw() { // Вывод двумерных координат на экран
for(i = 0; i < c_number; i++) { // Процедура преобразования трехмерных координат в двумерные
coor_2d[i].sx = coor_3d[i].x * dist/(coor_3d[i].z + dist);
coor_2d[i].sy = coor_3d[i].y * dist/(coor_3d[i].z + dist);
}
InvalidateRect(hWnd, NULL, TRUE);
UpdateWindow(hWnd);
hdc = BeginPaint(hWnd, &ps);
TextOut(hdc, 10, 10, L"alpha:", 6); // Вывод значения угла поворота на экран
str = (LPCWSTR)itoa(b, buf, 10);
TextOut(hdc, 60, 10, str, strlen(buf));
str1 = (LPCWSTR)itoa(a, buf1, 10);
TextOut(hdc, 68, 10, str1, strlen(buf1));
//Вывод значения коэфициента масштабирования
TextOut(hdc, 85, 10, L"k: 1.", 5);
str2 = (LPCWSTR)itoa(c, buf3, 10);
TextOut(hdc, 111, 10, str2, strlen(buf3));
str3 = (LPCWSTR)itoa(d, buf4, 10);
TextOut(hdc, 120, 10, str3, strlen(buf4));
//hPen = CreatePen(PS_DOT,1,RGB(0,60,255)); // PS_SOLD - сплошная линия
//SelectObject(hdc, hPen);
for(i = 0; i < links_number; i++) { // Количество соединений
MoveToEx(hdc, coor_2d[links[i].one].sx, coor_2d[links[i].one].sy, NULL);
LineTo(hdc, coor_2d[links[i].two].sx, coor_2d[links[i].two].sy);
}
EndPaint(hWnd, &ps);
}
void spinmatrix(int alpha, int axis) { // Осуществить вращения на угол "alpha" вокруг оси "axis"
float radian;
radian = (alpha * Pi) / 180;
if(axis == 1) { // Вокруг оси X
matrix[0].x = 1;
matrix[0].y = 0;
matrix[0].z = 0;
matrix[1].x = 0;
matrix[1].y = cos(radian);
matrix[1].z = (-1)*sin(radian);
matrix[2].x = 0;
matrix[2].y = sin(radian);
matrix[2].z = cos(radian);
} else
if(axis == 2) { // Вокруг оси Y
matrix[0].x = cos(radian);
matrix[0].y = 0;
matrix[0].z = sin(radian);
matrix[1].x = 0;
matrix[1].y = 1;
matrix[1].z = 0;
matrix[2].x = (-1)*sin(radian);
matrix[2].y = 0;
matrix[2].z = cos(radian);
}
}
void scalematrix(float k, int type) { // Осуществить масштабирование в k раз
if(type == 1) { // Увеличение
matrix[0].x = k;
matrix[0].y = 0;
matrix[0].z = 0;
matrix[1].x = 0;
matrix[1].y = k;
matrix[1].z = 0;
matrix[2].x = 0;
matrix[2].y = 0;
matrix[2].z = k;
} else
if(type == 2) { // Уменьшение
matrix[0].x =1/k;
matrix[0].y = 0;
matrix[0].z = 0;
matrix[1].x = 0;
matrix[1].y = 1/k;
matrix[1].z = 0;
matrix[2].x = 0;
matrix[2].y = 0;
matrix[2].z = 1/k;
}
}
void multiply() { // Осуществить умножение трехмерной матрицы на матрицу проеобразования
copycoor_3d = new coord_3d[c_number]; // Выделение памяти на "c_number" элементов
flag = 1;
for(i = 0; i < c_number; i++) {
copycoor_3d[i].x = ((coor_3d[i].x - 675) * matrix[0].x + (coor_3d[i].y - 362) * matrix[1].x + (coor_3d[i].z - 150) * matrix[2].x) + 675;
copycoor_3d[i].y = ((coor_3d[i].x - 675) * matrix[0].y + (coor_3d[i].y - 362) * matrix[1].y + (coor_3d[i].z - 150) * matrix[2].y) + 362;
copycoor_3d[i].z = ((coor_3d[i].x - 675) * matrix[0].z + (coor_3d[i].y - 362) * matrix[1].z + (coor_3d[i].z - 150) * matrix[2].z) + 150;
if((copycoor_3d[i].x < 0) || (copycoor_3d[i].y < 0)) {
flag = 0; // Проверка допустимых значений
}
}
if(flag == 1) {
for(i = 0; i < c_number; i++) {
coor_3d[i].x = copycoor_3d[i].x;
coor_3d[i].y = copycoor_3d[i].y;
coor_3d[i].z = copycoor_3d[i].z;
}
}
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_KEYDOWN:
switch (wParam) {
////////////////////////////////////////////////////////////////////////////
case VK_UP: // Стрелка вверх
spinmatrix(alpha, 1); // Задание угла и оси вращения
multiply(); // Перемножить матрицы
draw(); // Вывод двумерных координат на экран
break;
case VK_DOWN: // Стрелка вниз
spinmatrix(-alpha, 1); // Задание угла и оси вращения
multiply(); // Перемножить матрицы
draw(); // Вывод двумерных координат на экран
break;
case VK_LEFT: // Стрелка влево
spinmatrix(alpha, 2); // Задание угла и оси вращения
multiply(); // Перемножить матрицы
draw(); // Вывод двумерных координат на экран
break;
case VK_RIGHT: // Стрелка вправо
spinmatrix(-alpha, 2); // Задание угла и оси вращения
multiply(); // Перемножить матрицы
draw(); // Вывод двумерных координат на экран
break;
case VK_ADD: // +
scalematrix(k, 1); // Задание коэф-та и типа масштабирования
multiply(); // Перемножить матрицы
draw(); // Вывод двумерных координат на экран
break;
case VK_SUBTRACT: // -
scalematrix(k, 2); // Задание коэф-та и типа масштабирования
multiply(); // Перемножить матрицы
draw(); // Вывод двумерных координат на экран
break;
case VK_F1: // Увеличить узначение угла вращения
if(alpha < 89){
alpha++;
}
if(alpha > 9) {
b = alpha/10;
a = alpha%10;
}
else {
a = alpha;
b = 0;
}
draw();
break;
case VK_F2: // Уменьшить узначение угла вращения
if(alpha > 1) {
alpha--;
if(alpha > 9) {
b = alpha/10;
a = alpha%10;
}
else {
a = alpha;
b = 0;
}
draw();
}
break;
case VK_F3: // Увеличить узначение коэффициента масштабирования
if((k >= 1) &&((c < 9) || (d < 9))) {
k = k + 0.01;
c = k*10 - 10;
d = (int)(k * 100) % 10;
draw();
}
break;
case VK_F4: // Уменьшить узначение коэффициента масштабирования
if((k > 1) &&((c <= 9) || (d <= 9))) {
k = k - 0.01;
c = k*10 - 10;
d = (int)(k * 100) % 10;
draw();
}
break;
case VK_NUMPAD1: // Num 1
spinmatrix(alpha, 2); // Задание угла и оси вращения
multiply(); // Перемножить матрицы
spinmatrix(-alpha, 1); // Задание угла и оси вращения
multiply(); // Перемножить матрицы
draw(); // Вывод двумерных координат на экран
break;
case VK_NUMPAD3: // Num 3
spinmatrix(-alpha, 2); // Задание угла и оси вращения
multiply(); // Перемножить матрицы
spinmatrix(-alpha, 1); // Задание угла и оси вращения
multiply(); // Перемножить матрицы
draw(); // Вывод двумерных координат на экран
break;
case VK_NUMPAD4: // Num 4
spinmatrix(alpha, 2); // Задание угла и оси вращения
multiply(); // Перемножить матрицы
spinmatrix(alpha, 1); // Задание угла и оси вращения
multiply(); // Перемножить матрицы
draw(); // Вывод двумерных координат на экран
break;
case VK_NUMPAD6: // Num 6
spinmatrix(-alpha, 2); // Задание угла и оси вращения
multiply(); // Перемножить матрицы
spinmatrix(alpha, 1); // Задание угла и оси вращения
multiply(); // Перемножить матрицы
draw(); // Вывод двумерных координат на экран
break;
////////////////////////////////////////////////////////////////////////////
break;
}
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_about:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
////////////////////////////////////////////////////////////////////////////
case ID_FILE_VIEW: // Построить фигуру
alpha = 1;
k = 1.01;
my = fopen("my.txt", "r");
if(my != NULL) { // Считывание в массив трехмерных координат coor_3d[c_number]
fscanf(my, "%d ", &c_number);
coor_3d = new coord_3d[c_number]; // Выделение памяти на "c_number" элементов
coor_2d = new coord_2d[c_number]; // Выделение памяти на "c_number" элементов
for(i = 0; i < c_number; i++){
fscanf(my, "%f %f %f ", &coor_3d[i].x, &coor_3d[i].y, &coor_3d[i].z);
}
}
fscanf(my, "%d ", &links_number); // Количество соединений
links = new sctlinks[links_number]; // Выделение памяти на "links_number" элементов
for(i = 0; i < links_number; i++){
fscanf(my, "%d %d ", &links[i].one, &links[i].two);
}
fclose(my);
draw(); // Вывод двумерных координат на экран
break;
////////////////////////////////////////////////////////////////////////////
case ID_FILE_ANIMATION: // Начать анимацию
for(j = 1; j < 200; j++){
spinmatrix(-3, 2); // Задание угла и оси вращения
multiply(); // Перемножить матрицы
scalematrix(1.01, 2); // Задание коэф-та и типа масштабирования
multiply(); // Перемножить матрицы
spinmatrix(2, 1); // Задание угла и оси вращения
multiply(); // Перемножить матрицы
draw(); // Вывод двумерных координат на экран
j++;
Sleep(20);
}
for(j = 1; j < 200; j++){
spinmatrix(-2, 2); // Задание угла и оси вращения
multiply(); // Перемножить матрицы
scalematrix(1.01, 1); // Задание коэф-та и типа масштабирования
multiply(); // Перемножить матрицы
spinmatrix(-3, 1); // Задание угла и оси вращения
multiply(); // Перемножить матрицы
draw(); // Вывод двумерных координат на экран
j++;
Sleep(20);
}
break;
////////////////////////////////////////////////////////////////////////////
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT: // При запуске программы
ShowWindow(hWnd,SW_MAXIMIZE); // Развернуть окно на весь экран
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// Message handler for about box.
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;
}
Приложение А.2. Модель дивана (файл «my.txt»)
66
432 301 53
481 301 53
481 382 53
868 382 53
868 301 53
917 301 53
917 479 53
432 479 53
432 301 246
481 301 246
481 382 246
868 382 246
868 301 246
917 301 246
917 479 246
432 479 246
481 382 182
481 220 182
868 220 182
868 382 182
481 220 246
868 220 246
481 350 53
868 350 53
481 350 182
868 350 182
675 382 182
675 220 182
675 220 246
675 382 246
610 382 53
610 350 53
610 350 182
739 382 53
739 350 53
739 350 182
610 382 182
739 382 182
432 495 53
449 495 53
449 479 53
432 495 69
449 495 69
432 479 69
449 479 69
900 479 53
900 495 53
917 495 53
900 495 69
900 479 69
917 479 69
917 495 69
432 495 246
449 495 246
449 479 246
432 495 230
432 479 230
449 479 230
449 495 230
900 479 246
900 495 246
917 495 246
900 495 230
900 479 230
917 479 230
917 495 230
91
0 1
0 7
1 2
2 3
3 4
4 5
5 6
6 7
0 8
8 9
9 1
8 15
15 7
9 10
9 12
2 10
10 11
11 3
11 12
12 13
12 4
13 5
13 14
14 15
14 6
16 17
17 18
18 19
16 19
17 20
20 9
20 21
21 18
21 12
22 23
22 24
24 24
24 25
25 23
26 27
27 28
28 29
29 26
30 31
31 32
33 34
34 35
32 36
35 37
36 30
37 33
7 38
40 39
38 41
39 42
38 39
41 42
41 43
42 44
43 44
44 40
45 46
46 47
6 47
46 48
47 51
48 51
48 49
50 51
45 49
49 50
15 52
54 53
56 55
57 58
52 53
53 58
55 58
52 55
54 57
56 57
59 60
63 62
14 61
64 65
60 61
61 65
62 65
60 62
59 63
63 64
Приложение B
Снимки экрана
Приложение B.1 – Начало программы
Приложение B.2 – Работа программы
Приложение В.3 – Навигация
Приложение B.4 – Помощь