моделирование каркасной модели трехмерного объекта (модель дивана).

Описание:
Необходимо разработать программу на языке Си (С++), реализующую процесс построения и визуализации экранного отображения каркасной модели трехмерного объекта. Объект моделирования: каркасная модель трехмерного объекта (модель дивана).
Доступные действия
Введите защитный код для скачивания файла и нажмите "Скачать файл"
Защитный код
Введите защитный код

Нажмите на изображение для генерации защитного кода

Текст:

 

 



Оглавление

Введение. 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 – Помощь


Информация о файле
Название файла моделирование каркасной модели трехмерного объекта (модель дивана). от пользователя z3rg
Дата добавления 17.2.2016, 2:00
Дата обновления 17.2.2016, 2:00
Тип файла Тип файла (zip - application/zip)
Скриншот Не доступно
Статистика
Размер файла 1 мегабайт (Примерное время скачивания)
Просмотров 3201
Скачиваний 147
Оценить файл