Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Сложное движение каркасных моделей.




Любое сложное движений в трехмерном пространстве можно представить в виде последовательных переноса, поворота и масштабирования ( приближение или отдаление от объекта ). А для получения изображения оъекта на экране применяется преобразование проецирования.

Каркасную модель можно представить в виде набора точек и матрицы связанности. Для выполнения поворота и масштабирования фигуры или каркасной модели необходима точка, относительно которой будут выполняться эти действия (базовая точка). Удобно задать координаты вершин фигуры относительно этой точки. А при рисовании выполнять смещение на базовую точку. Перенос фигуры сведётся к смещению базовой точки.

Все операции по трехмерному преобразованию фигуры можно свести к умножению вектора на матрицу.

Матрицы для поворота запишутся так:

  1. Относительно оси X:

  1. Относительно оси Y:

  1. Относительно оси Z:

Матрица переноса:

Матрица масштабирования:

где  – коэффициент масштабирования.

Матрица для плоскопараллельного проецирования:

Структура данных для хранения фигуры запишется так:

value struct Figure

{

       Point3D Base;                               // базовая точка

       array<Point3D, 1> ^Vertices;       // массив вершин

       array<int, 2> ^Edges;                   // матрица связанности

       int Count;                                      // количество вершин

};

где Point3D:

value struct Point3D

{

       float X;

       float Y;

       float Z;

 

       Point3D(float x, float y, float z) {X = x; Y = y; Z = z;}

};

Функция рисования фигуры:

void DrawFig(PictureBox^ pBox, Figure %fig)

{

       Pen^ P = gcnew Pen(Color::Red);

       Graphics^ G = Graphics::FromImage(pBox->Image);

 

       for(int i = 0; i < fig.Count - 1; ++i)

                   for(int j = i + 1; j < fig.Count; ++j)

                              if(fig.Edges[i, j])

                              {

                                          G->DrawLine(P,

                                                      fig.Base.X + fig.Vertices[i].X,

                                                      fig.Base.Y + fig.Vertices[i].Y,

                                                      fig.Base.X + fig.Vertices[j].X,

                                                      fig.Base.Y + fig.Vertices[j].Y);

                              }

           

       pBox->Invalidate();

}

Структура данных для матрицы поворота:

value struct Matrix3D

{

       array<float, 2> ^M;

};

Функция инициализации матрицы поворота относительно оси Х:

Matrix3D Mx(float a)

{

       array<float, 2> ^M = {

                   {1, 0,       0,        0},

                   {0, Math::Cos(a), -Math::Sin(a), 0},

                   {0, Math::Sin(a), Math::Cos(a), 0},

                   {0, 0,       0,        1}};

           

       Matrix3D tmp = {M};

       return tmp;

}

Функции инициализации матриц поворота относительно остальных осей и матрицы масштабирования записываются аналогично.

Запишем функцию умножения вектора на матрицу:

Point3D Multiply(Point3D Pt, Matrix3D Ma)

{

       Point3D p;

       p.X = Pt.X * Ma.M[0, 0] + Pt.Y * Ma.M[0, 1] + Pt.Z * Ma.M[0, 2];

       p.Y = Pt.X * Ma.M[1, 0] + Pt.Y * Ma.M[1, 1] + Pt.Z * Ma.M[1, 2];

       p.Z = Pt.X * Ma.M[2, 0] + Pt.Y * Ma.M[2, 1] + Pt.Z * Ma.M[2, 2];

       return p;

}

Выполнение операции поворота фигуры можно выделить в самостоятельную функцию:

void Rotate(Figure %fig, float a, float b, float c)

{

       if(a != 0.0)

       {

                   Matrix3D Mxa = Mx(a);

                   for(int i = 0; i < fig.Count; ++i)

                              fig.Vertices[i] = Multiply(fig.Vertices[i], Mxa);

       }

       if(b != 0.0)

       {

                   Matrix3D Myb = My(b);

                   for(int i = 0; i < fig.Count; ++i)

                              fig.Vertices[i] = Multiply(fig.Vertices[i], Myb);

       }

       if(c != 0.0)

       {

                   Matrix3D Mzc = Mz(c);

                   for(int i = 0; i < fig.Count; ++i)

                              fig.Vertices[i] = Multiply(fig.Vertices[i], Mzc);

       }

}

где a, b и c – углы поворота относительно осей X, Y и Z соответственно.

 

 

  1. Типовые задания для лабораторных работ
  1. Разработка программы «Калькулятор»

Программа должна выполнять следующие операции:

- ввод чисел с помощью цифровых кнопок (объект Button) и их отображение в окне  TextBox;

- многократное выполнение основных арифметических действий над числами (сложение, вычитание, умножение и деление) и отображение результата;

- очистка окна редактирования перед выполнением новых вычислений.

2. Разработка программы вычисления определенного интеграла с заданной погрешностью.

Программа должна выполнять следующие действия:

- ввод исходных данных (нижний и верхний пределы интегрирования, погрешность) в соответствующих окнах TextBox;

- выбор метода интегрирования (метод прямоугольников, трапеций, Симпсона) с помощью объектов CroupBoxи RadioButton;

- выбор подинтегральной функции с помощью объекта ComboBox.

3. Программа упорядочения сводной экзаменационной ведомости в соответствии с заданным критерием. Экзаменационная ведомость представляется в виде таблицы (объект DataGridView),столбцы которой имеют следующие наименования: фамилия, группа. экзамен1, экзамен2, экзамен3.

Программа должна выполнять следующие действия:

- ввод данных в таблицу вручную и из файла;

- сортировка данных по алфавиту или в порядке возрастания среднего бала в зависимости от выбора пункта меню;

- коррекция таблицы вручную.

Для выполнения указанных действий организовать меню.

4.Разработка программы выполнения операций над односвязным списком общего вида.

Программа должна выполнять следующие операции:

- создание с информационным полем, заданным преподавателем;

- добавление, поиск, вставка и удаление элементов;

- очистка списка.

Отображение информационных полей списка производится в объекте ListBox.

Для выполнения указанных действий организовать меню.

5. Разработка программы построения секторной диаграммы и гистограммы. Построение диаграммы (гистограммы) производится в объекте PictureBox.

Программа должна выполнять следующие действия:

- ввод процентного содержания каждого сектора (столбца), кроме последнего, процентное содержание которого должно определяться автоматически, т.к. сумма всех процентных данных должна быть равна 100%;

- построение диаграммы или гистограммы в зависимости от выбора пункта меню;

- очистка содержимого объекта PictureBox.

Для выполнения указанных действий организовать меню.

6. Разработка программы построения графика функции на координатной сетке. Построение графика производится в объекте PictureBox.

Программа должна выполнять следующие действия:

- выбор функции с помощью объекта ComboBox;

-осей координат и координатной сетки;

- указание значений, соответствующих линиям сетки на осях Х и Y;

- построение графика выбранной функции.

Для выполнения указанных действий организовать меню.

7. Разработка программы преобразования заданной фигуры на плоскости.

Программа должна выполнять следующие действия:

- рисование раскрашенной фигуры, заданной преподавателем;

- выполнение стандартных преобразований фигуры (параллельный перенос, поворот на заданный угол, вращение).

Для выполнения указанных действий организовать меню.

8. Разработка программы моделирования одного из трех видов движения:

- поступательное движение раскрашенного круга по квадратной рамке;

- вращение раскрашенного круга по или против часовой стрелке по окружности заданного радиуса;

- периодическое сжатие и растяжение раскрашенного квадрата относительно его центра.

Для выполнения указанных действий организовать меню.

9. Разработка программы моделирования движения по сложному фону. Программа описывает движение раскрашенной фигуры по графику заданной функции. Необходимо предусмотреть кнопку «Пуск/стоп» для запуска и остановки движения.

10.  Разработка программы преобразования куба в пространстве с использованием каркасной модели.

Программа должна выполнять следующие действия:

- построение куба;

- выполнение одного из преобразований (параллельный перенос, поворот, масштабирование, проецирование)

Для выполнения указанных действий организовать меню.

Данная задача предлагается для «сильных» студентов по желанию.

 

Контрольные вопросы

1. Для чего предназначено окно формы?

2. Какую информацию содержит окно Properties?

3. Какие основные файлы входят в состав проекта?

4. Как создать шаблон обработчика события?

5. Для чего предназначены визуальные компоненты ListBox и ComboBox?

6.Какую возможность предоставляет свойство SelectedIndex компонента ListBox ?

7. Для чего используется компонент GroupBox?

8. Как задать структуру таблицы, создаваемой с помощью компонента DataGridView?

9. Какие существуют способы заполнения ячеек таблицы на основе компонента DataGridView?

10. Что такое класс, для чего он предназначен?

11. Для чего используются конструкторы и деструкторы?

12. Что такое стек и очередь, для чего они используются?

13. Как организовать линейный список общего вида (прямого доступа)?

14. Понятие итератора, для чего он используется?

15. Для чего используется компонента PictureBox?

16. Как реализовать следующие преобразования объектов: параллельный перенос, поворот, масштабирование?

17. Каков основной принцип организации движения объектов?

18. В чем заключается особенность реализации движения по сложному фону?

Заключение

Учебное пособие содержит подробное описание визуальной среды программирования CLR Windows Form Application. Демонстрирует на большом числе примеров приемы работы с визуальными компонентами среды. Показывает разные типы компонентов и описывает соответствующие им способы действия. Большое внимание уделено написанию обработчиков событий, реализующих основную функциональности программного обеспечения. В результате изучения пособия и реализации отдельных заданий студент получит навыки конструирования интерфейса приложения на основе использования стандартных визуальных компонентов среды, а также навыки разработки ПО на основе событийной синхронизации.

 

    

 

Список рекомендуемой литературы

1. Г.Шилдт. Самоучитель С++. – БХВ-Петербург, 2003, 688 с.

2. Б.И.Пахомов. С/С++ и MS Visual Studio 2008 для начинающих. БХВ-Петербург, 2009, 624 с.

3.А.Хортон. Visual Studio 2005: Базовый курс. М.: Вильямс, 2007, 1154 с.

Оглавление

Введение …………………………………………………………………………………………. 3

1. Создание проекта в среде Windows Form …………………………………………………….3

  1.1 Описание среды Windows Form …………………………………………………………4

   1.2 Разработка проекта …………………………………………………………….……….6

   1.3 Сохранение, сборка и выполнение проекта ……………………………………….....10

2. Визуальные компоненты среды Windows Form ……………………………………………..11

   2.1 Визуальные компоненты Label, TextBox и Button ……………………………………11

   2.2 Визуальные компоненты ListBox, ComboBox, RadioButton и GroupBox …………...15

   2.3 Матрица ячеек DataGridView …………………………………………………………..20

3. Материалы для самостоятельной проработки……………………………………………......25

   3.1 Краткое введение в объектно-ориентированное программирование (ООП)………...25

   3.2 Динамические структуры данных………………………………………………………29

   3.3 Итераторы...................……………………………………………………………………32

   3.4 Примеры  с использованием списка прямого доступа и итераторов.…......................37

   3.5 Графика……………………….........……………………………………………………..38

   3.6 Реализация «движения» по однородному и сложному фону.......................................42

   3.7 Сложное движение каркасных моделей.....................................................................….43

   4. Типовые задания для лабораторных работ………………………………………………46

   5. Контрольные вопросы ……………………………………………………………………47

       Заключение ………………………………………………………………………………..48

Список рекомендованной литературы …………………………………………………………..49

 










Последнее изменение этой страницы: 2018-06-01; просмотров: 260.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...