Файл: Теоретическая часть.doc

ВУЗ: Не указан

Категория: Методичка

Дисциплина: Программирование

Добавлен: 30.10.2018

Просмотров: 1120

Скачиваний: 7

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.


Поворот тел


Поворот трехмерного тела осуществляется путем задания углов поворота вокруг каждой из координатных осей относительно заданного центра.

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



Уравнения для решения прямоугольных треугольников



При этом угол поворота расcчитывается в плоскости, перпендикулярной заданной оси поворота. Т.е., если поворот тела осуществляется вокруг оси X, новые координаты раcсчитываются в плоскости ZY; если вокруг оси Y – в плоскости ZX; если вокруг оси Z – в плоскости XY. При этом для последующих вычислений горизонтальная ось принимается как ось X, а вертикальная – как ось Y.


Центр поворота O задается путем определения трехмерных координат соответствующей точки. При задании оси поворота центр поворота O и вершины P тела проецируются на соответствующую плоскость.


Угол между радиусом, соединяющим центр поворота O и проекцию вершины P, и осью X вычисляется как arctg(Px/Py)


Положительные значения углов отсчитываются при повороте против часовой стрелки вокруг заданного центра относительно горизонтальной оси. Поэтому при определении реального текущего угла α, который образует заданная вершина P относительно центра поворота O и оси X, необходимо учитывать квадрант, в котором находится точка вершины. При этом возможны следующие варианты:


1 . Px=Ox и Py<Oy, α=90;

2. Px=Ox и Py>Oy, α=270;

II I 3. Px<Ox и Py=Oy, α=180;

O 4. Px>Ox и Py=Oy, α=0;

x 5. Px>Ox и Py>Oy (IV квадрант), α=360- α;

III IV 6. Px>Ox и Py<Oy (I квадрант), α=α;

7. Px<Ox и Py<Oy (II квадрант), α=180- α;

Y 8. Px<Ox и Py>Oy (III квадрант), α=270- α;


Масштабирование тел


Масштабирование трехмерного тела – это перерасчет координат всех вершин тела с учетом коэффициента масштабирования относительно центра масштабирования.


Порядок действий при масштабировании следующий:


1. Рассчитываются расстояния от центра до каждой вершины в пространстве.

2. Данные расстояния умножаются на коэффициент масштабирования.

3. Вычисляются новые координаты по теореме Пифагора на основе измененных расстояний.


В результате, если коэффициент масштабирования больше 1, происходит пропорциональное увеличение размеров тела, если от 0 до 1 – уменьшение.


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



Практическая работа №7


Исследование алгоритмов определения граней и принадлежности точек граням




Для отображения трехмерных тел на экране компьютера требуется построение проекций тел на плоскость экрана.


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


При отображении необходимо обеспечивать реалистичность получаемых проекций. Это достигается путем удаления с изображения проекции невидимых вершин и ребер. Отправной точкой для решения данной задачи является задача определения множества вершин, образующих грани заданного трехмерного тела. Определение граней производится на этапе задания трехмерного тела. Далее для каждой новой проекции тела определяются невидимые вершины и невидимые ребра либо сегменты ребер, которые исключаются при отображении проекции на экран.



Алгоритм определения граней


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


Выходные данные


В результате выполнения алгоритма формируется массив списков номеров вершин для каждой определенной грани заданного тела.


Алгоритм определения принадлежности точек граням


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


Выходные данные


Результатом выполнения алгоритма является значение “Истина” или “Ложь”. Первое означает, что заданная точка лежит внутри заданного контура.


Практическая работа №8


Определение невидимых вершин проекции трехмерного тела




Для отображения трехмерных тел на экране компьютера требуется построение проекций тел на плоскость экрана.


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


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


Алгоритм определения невидимых вершин заданной проекции заданного тела


Требуется разработать алгоритм, определяющий множество вершин заданного трехмерного тела, которые не видны на заданной проекции данного тела в плоскости экрана.


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

Для определения положения текущей вершины относительно текущей грани на заданной проекции необходимо выполнить следующие действия:


1. Для любых трех вершин текущей грани рассчитать коэффициенты уравнения плоскости грани в пространстве, проходящей через данные вершины.


2. Вычислить точку пересечения перпендикуляра к плоскости экрана, восстановленного в текущей вершине, с плоскостью грани.

3. Определить принадлежность текущей вершины контуру текущей грани на заданной проекции тела.

4. Если текущая вершина находится в пределах контура проекции текущей грани, сравнить координаты по оси Z точки пересечения и текущей вершины. Если значение координаты текущей вершины меньше соответствующей координаты точки пересечения, данная вершина является невидимой, т.к. находится за текущей гранью на данной проекции.

5. Выполнить данные действия для всех граней и всех вершин.


Выходные данные


Результатом выполнения алгоритма является массив невидимых вершин для текущей проекции заданного трехмерного тела.





Практическая работа №9


Определение невидимых граней проекции трехмерного тела



Для отображения трехмерных тел на экране компьютера требуется построение проекций тел на плоскость экрана.


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


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


Алгоритм определения невидимых граней заданной проекции заданного тела


Требуется разработать алгоритм, определяющий множество ребер заданного трехмерного тела, которые не видны на заданной проекции данного тела в плоскости экрана, либо множество невидимых сегментов ребер, которые видны на данной проекции частично.


Алгоритм основывается на анализе видимости вершин и срединных точек сегментов ребер. Если обе вершины какого-либо ребра видимы, ребро также видимо. Если обе вершины невидимы, данное ребро также невидимо. Если одна вершина видима, а другая нет, определяются точки пересечения данного ребра с другими ребрами. Для каждого сегмента текущего ребра между точками пересечения определяются срединные точки. Для каждой срединной точки проверяется ее видимость. Если данная срединная точка видима, то и сегмент, которому она принадлежит, так же видим. Если срединная точка невидима, то и соответствующий сегмент тоже невидим.


Выходные данные


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


Определение видимости конкретных точек на заданной проекции производится в соответствие с алгоритмами, полученными в предыдущих практических работах.


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


1. Для всех связей между вершинами определить видимость связанных вершин на заданной проекции и отобрать связи, в которых одна вершина видима, а другая нет.

2. Для каждого ребра, соответствующего отобранным в шаге 1 связям найти множество точек пересечений с другими ребрами.


3. Для каждого сегмента между точками пересечения определить срединную точку.

4. Для каждой срединной точки уставить ее видимость.

5. Сохранить координаты начала и конца тех сегментов, срединные точки которых являются видимыми.

6. Отобразить на экране видимые ребра и видимые сегменты частично невидимых ребер.





Практическая работа №10


Создание классов трехмерных тел в VBA



Трехмерные тела представляют собой геометрические объекты, для которых могут создаваться компьютерные модели с использованием средств объектно-ориентированного программирования (ООП).


ООП основывается на трех принципах:


  1. Инкапсуляция - это использование объединения данных и инструкций по их обработке в единую сущность - класс. Во время написания программ на одном из языков ООП происходит разграничение между информацией внутри сущности и снаружи. Таким образом достигается обеспечение безопасности данных и методов их реализации от внешних воздействий, например, со стороны других классов, не относящихся к этому объекту. Внутри сущности данные успешно взаимодействуют друг с другом, но надежно защищены от несанкционированного доступа извне.

  2. Наследование - это возможность дочернего класса использовать свойства, методы и события родительского класса без повтороного их описания и реализации.

  3. Полиморфизм – это возможность однообразного вызова одних и тех же методов разных объектов, в каждом из которых вызываемые методы реализуют различные функции.


ООП базируется на использовании классов.


Класс – это сложный тип данных, в котором описываются свойства, методы и события объектов, создаваемых в качестве экземпляров данного класса. Класс может рассматриваться как составной пользовательский тип данных.


Объект – это экземпляр какого-либо класса. Объекты объявляются в программе также как переменные, но в качестве типа данных указывается имя класса. При этом в оперативной памяти резервируется область для всех свойств, методов и событий, описанных в соответствующем классе. От одного класса может быть произведено сколько угодно объектов, и все они будут иметь отдельные области памяти для хранения их содержимого.


Класс имеет следующую структуру:


Поле – элемент класса для хранения данных, представляющий собой обычную переменную элементарного или составного типа, объявленную внутри класса.

Свойство – элемент класса, позволяющий производить считывание или запись полей с заданием какой-либо предварительной обработки. При этом сами поля могут быть нелоступными для прямого доступа извне.

Метод –процедура или функция, созданные внутри класса и являющиеся доступными извне.

Событие – сигнал, генерируемый объектом в зависимости от каких-либо условий, который перехватывается в каком-либо модуле программы, в котором был создан данный объект. Таким образом, программа способна реагировать на события, генерируемые объектами, и производить немедленную обработку таких событий.



В VBA имеются следующие инструменты создания классов:


  1. Создание модулей типа Класс (Главное меню\Insert\Class Module). После создания модуля класса необходимо задать имя класса в окне свойств модуля. Это имя будет использоваться в программе при объявлении объектов данного класса.

  2. Создание полей производится так же как создание переменных в программе. При этом, если нужно задать полный доступ к данному полю извне, необходимо использовать ключевое слово Public.

  3. Создание свойства. Свойства могут быть типа “Чтение” и “Запись”. Для этого в VBA используются следующие конструкции:


Свойство типа Чтение:


Public Property Get <Имя свойства>([<Параметры>]) As <Тип>

....................

операции

....................

<Имя свойства>=<Поле или выражение>

End Property


Свойство типа “Запись”:


Public Property Let <Имя свойства>([<Параметры>])

....................

операции

....................

<Имя поля>=<переменная или выражение>

End Property


  1. Создание события. Для этого необходимо сделать следующее:


1) в начале класса поместить объявление события с помощью конструкции:


Public Event <Имя события>([<Параметры>])


2) внутри метода, где должен генерироваться сигнал события, вставить команду возбуждения события:


RaiseEvent <Имя события>([<Параметры>])


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



Практическая работа №11


Создание объектов трехмерных тел в VBA



Трехмерные тела представляют собой геометрические объекты, для которых могут создаваться компьютерные модели с использованием средств объектно-ориентированного программирования (ООП).


ООП базируется на использовании классов.


Класс – это сложный тип данных, в котором описываются свойства, методы и события объектов, создаваемых в качестве экземпляров данного класса. Класс может рассматриваться как составной пользовательский тип данных.


Объект – это экземпляр какого-либо класса. Объекты объявляются в программе также как переменные, но в качестве типа данных указывается имя класса. При этом в оперативной памяти резервируется область для всех свойств, методов и событий, описанных в соответствующем классе. От одного класса может быть произведено сколько угодно объектов, и все они будут иметь отдельные области памяти для хранения их содержимого.


Класс имеет следующую структуру:


Поле – элемент класса для хранения данных, представляющий собой обычную переменную элементарного или составного типа, объявленную внутри класса.

Свойство – элемент класса, позволяющий производить считывание или запись полей с заданием какой-либо предварительной обработки. При этом сами поля могут быть нелоступными для прямого доступа извне.

Метод –процедура или функция, созданные внутри класса и являющиеся доступными извне.

Событие – сигнал, генерируемый объектом в зависимости от каких-либо условий, который перехватывается в каком-либо модуле программы, в котором был создан данный объект. Таким образом, программа способна реагировать на события, генерируемые объектами, и производить немедленную обработку таких событий.