Экспериментально-исследовательская часть




Курсовой проект

По машинной графике

Расчётно-пояснительная записка

Тема:

«Построение изображений ландшафта в реальном времени»


Оглавление

 

1. Введение

2. Конструкторская часть

2.1 Выбор, обоснование и описание используемых алгоритмов и понятий машинной графики

2.1.1 Равномерная сетка высот

2.1.2 Сглаживание ландшафта

2.1.3 Трехмерные аффинные преобразования

2.1.4 Проецирование

2.1.5 Отображение в окне

2.1.6 Алгоритм Z-буфера

2.1.7 Освещение

2.1.7.1 Однотонная закраска (метод гранения)

2.1.7.2 Метод Гуро

2.1.7.3 Метод Фонга

2.1.7.4 Анализ методов Гуро и Фонга

2.1.8 Последовательность действий при визуализации сцены

2.2 Типы, структуры данных и функции, использованные при реализации программного комплекса

2.2.1 Представление исходных данных

2.2.2 Программа «Редактор карт»

2.2.2.1 Изообласти высоты

2.2.2.2 Равномерная сетка высот и ландшафт

2.2.2.3 Тип и структура файла для хранения карт изообластей

2.2.2.4 Распределение программы по модулям

2.2.2.5 Связи между модулями программы

2.2.3 Программа «Просмотр ландшафта»

2.2.3.1 Процедуры манипуляции изображением ландшафта

2.2.3.2 Z-буфер

2.2.3.3 Буфер кадра

2.2.3.4 Процедуры визуализации ландшафта

2.2.3.2 Тип и структура файла для хранения ландшафта

2.2.3.3 Распределение программы по модулям

2.2.3.4 Связи между модулями программы

3. Технологическая часть

3.1 Выбор языка программирования

3.2 Описание программного комплекса

3.2.1 Программа «Редактор карт»

3.2.1.1 Общие сведения

3.2.1.2 Интерфейс программы

3.2.1.3 Работа программы

3.2.2 Программа «Просмотр ландшафта»

3.2.2.1 Общие сведения

3.2.2.2 Интерфейс программы

3.2.2.3 Работа программы

3.2.3 Системные требования

4. Экспериментально-исследовательская часть

4.1 Исследование № 1

4.2 Исследование № 2

4.3 Исследование № 3

5. Заключение

6. Список литературы


Введение

 

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

В свою очередь задача построения изображения ландшафта на основе карты изообластей включает в себя следующие задачи:

· преобразование данной карты в равномерную сетку высот;

· триангуляция полученной сетки высот;

· при необходимости – сглаживание триангулированной сетки для получения изображений ландшафтов, близких по очертаниям к реальным.

Требование к скорости построения изображений ландшафта (для комфортной работы необходима производительность порядка 30 кадров в секунду [1]) определяет выбор алгоритма машинной графики, используемого для визуализации сцены – алгоритм Z-буфера в наибольшей степени отвечает этому требованию, так как он является наиболее простым в своей группе и требует наименьшего количества вычислительных ресурсов.

Кроме этого, в данной работе затронуты другие алгоритмы машинной графики: преобразование координат, проецирование, освещение.

При работе с освещением реализованы следующие алгоритмы заполнения плоских граней (в данной работе - треугольников):

· метод гранения (однотонной закраски с учетом ориентации нормали к плоскости грани);

· метод Гуро – метод закрашивания граней трехмерных объектов, который использует билинейную интерполяцию интенсивности цвета в вершинах граней;

· метод Фонга – метод, основанный на билинейной интерполяции векторов нормалей в вершинах граней.

Цель данной работы – реализовать перечисленные алгоритмы в разрабатываемом программном комплексе.

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

 


2. Конструкторская часть

 

2.1 Выбор, обоснование и описание используемых
алгоритмов и понятий машинной графики

 

2.1.1 Равномерная сетка высот

Существует большое количество моделей описания поверхностей. Наиболее распространенными из них являются:

· аналитическая модель – для описания поверхности используются математические формулы, например функции от двух аргументов z = f(x, y);

· векторная полигональная модель – для описания пространственных объектов используются такие элементы, как вершины, векторы, полилинии, полигоны, полигональные поверхности;

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

· неравномерная сетка – в этой модели поверхность описывается в виде множества отдельных точек, принадлежащих поверхности.

В данной работе в качестве модели описания поверхности (ландшафта) используется равномерная сетка высот. Эта модель описывает координаты отдельных точек поверхности способом, показанным на рисунке:

 

Рис. 2.1.1.1. Общий вид равномерной сетки высот

Каждому узлу сетки с индексами (i, j) приписывается значение высоты Zij. Индексам (i, j) отвечают определенные значения координат (x, y). Расстояние между узлами одинаковое – dX по оси X и dY по оси Y.

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

Следует отметить, что не каждая поверхность может быть представлена с помощью этой модели, так как если в каждом узле записывается только одно значение высоты, то это означает, что поверхность описывается однозначной функцией z = f(x, y). Кроме того, невозможно моделирование вертикальных граней.

В случае представления ландшафта в виде равномерной сетки высот эти ограничения являются незначительными и вполне допустимыми. Равномерная сетка часто используется для описания рельефа земной поверхности [2].

Следует выделить следующие положительные черты модели равномерной сетки:

· простота описания поверхностей;

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

Но эта модель также имеет и недостатки:

· для описания сложных поверхностей необходимо большое количество узлов, которое может быть ограничено объемом памяти компьютера;

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

Но в данной работе равномерная сетка используется опосредованно – сразу же при получении она разбивается на треугольники (производится ее триангуляция), поскольку реализация необходимых в процессе работы алгоритмов машинной графики для этого примитива наиболее проста. Разбиение на треугольники производится путем проведения диагонали из точки (i, j) в точку (i – 1, j + 1).

 

2.1.2 Сглаживание ландшафта

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

Его суть заключается в следующем. В процессе сглаживания в цикле производится усреднение высот 4 соседних пикселей. Для повешения качества и эффективности сглаживания, оно производится в 4 последовательных циклах – “слева направо”, “справа налево”, “сверху вниз” и “снизу вверх”.

 

Рис. 2.1.2.1. Циклы сглаживания ландшафта

 

Пиксели для усреднения высот выбираются следующим образом: на K-ой итерации цикла производится усреднение высот пикселей с индексами (i – 1, j - 1), (i – 1, j), (i, j - 1) и (i, j), на (K + 1)-ой же, в зависимости от номера цикла, усредняются высоты следующих пикселей:

· в I цикле – пиксели тех же двух строк с индексами столбцов, увеличенными на 1;

· во II цикле – пиксели тех же двух строк с индексами столбцов, уменьшенными на 1;

· в III цикле – пиксели тех же столбцов со строчными индексами, увеличенными на 1;

· в IV цикле – пиксели тех же столбцов со строчными индексами, уменьшенными на 1.

Ниже приведена иллюстрация, демонстрирующая результаты сглаживания тестового ландшафта:

 

Рис. 2.1.2.2. Результаты сглаживания – без сглаживания, 1 цикл, 10 циклов.

 

2.1.3 Трехмерные аффинные преобразования

В процессе работы программы может возникать необходимость преобразования объектов сцены – их сдвига, масштабирования, поворота.

Для трехмерного пространства любое аффинное преобразование может быть представлено последовательностью простейших операций [3].

Ниже приводятся уравнения и матрицы преобразований:

· сдвиг точки вдоль координатных осей на dx, dy, dz:

 

;

· масштабирование относительно начала координат с коэффициентами kx, ky, kz:

 

;

 

· поворот относительно осей x, y, z на угол :

o ось x:

 

 

o ось y:

 

 

o ось z:

 


2.1.4 Проецирование

В настоящее время наиболее распространены устройства отображения, которые синтезируют изображение на плоскости, например – экране монитора. Устройства, которые создают по-настоящему объемные изображения, пока достаточно редки. Но все чаще появляются сведения о подобных разработках, например, об объемных мониторах [2].

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

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

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

В компьютерной графике распространены параллельная и центральная (перспективная) проекции.

 

Рис. 2.1.4.1. Параллельная и центральная проекции

 

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

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

Как правило, расположение плоскости проецирования задается с помощью двух углов - и .

 

Рис. 2.1.4.2. Аксонометрическая проекция

 

Для того, чтобы найти соотношения между координатами (x, y, z) и (X, Y, Z) для любой точки в трехмерном пространстве, рассмотрим преобразование системы координат (x, y, z) в систему (X, Y, Z). Такое преобразование может быть задано двумя шагами:

· поворот системы координат относительно оси z на угол . Такой поворот описывается матрицей

 

;

 

· поворот новой системы координат (x, y, z) относительно оси x на угол - получение координаты (X, Y, Z). Матрица поворота:

.

 

Преобразование координат выражается произведением матриц

 

 

Это же преобразование можно записать в формульном виде:

 

 

2.1.5 Отображение в окне

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

Пусть (Xэ, Yэ, Zэ) – это экранные координаты объектов в графическом устройстве отображения. Координаты проецирования обозначим как (X, Y, Z).

Преобразование координат проекции в экранные координаты можно представить как растяжение/сжатие и сдвиг:

 

.

Такое преобразование сохраняет пропорции объектов благодаря одинаковому коэффициенту растяжения/сжатия k для всех координат. Следует отметить, что для плоского отображения координату Z можно отбросить.

Алгоритм Z-буфера

После получения треугольников ландшафта (триангуляции равномерной сетки) и проецирования их на экранную плоскость следует построение изображения ландшафта. В процессе его построения для удаления невидимых поверхностей используется алгоритм Z-буфера.

Это один из простейших алгоритмов удаления невидимых поверхностей. Работает этот алгоритм в пространстве изображения. Идея Z-буфера является простым обобщением идеи о буфере кадра. Буфер кадра используется для запоминания атрибутов (интенсивности) каждого пикселя в пространстве изображения, Z-буфер - это отдельный буфер глубины, используемый для запоминания координаты Z (глубины) каждого видимого пикселя в пространстве изображения. В процессе работы глубина или значение Z каждого нового пикселя, который нужно занести в буфер кадра, сравнивается с глубиной того пикселя, который уже занесен в Z-буфер. Если это сравнение показывает, что новый пиксель расположен впереди пикселя, находящегося в буфере кадра, то новый пиксель заносится в этот буфер и, кроме того, производится корректировка Z-буфера новым значением Z. Если же сравнение дает противоположный результат, то никаких действий не производится. По сути, алгоритм является поиском по x и y наибольшего значения функции Z(x, у). Блок-схема алгоритма выглядит следующим образом:


Рис. 2.1.6.1. Блок-схема алгоритма Z-буфера

 

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

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

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

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

 

 

Для сканирующей строки , поэтому глубина пикселя на этой строке, у которого , равна

 

 

или

 

,

 

но , поэтому .

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

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

 

;

 

· затем для каждой стороны находится параметр t при пересечении с горизонталью :

 

;

 

· если , то рассчитывается абсцисса точки пересечения горизонтали со стороной треугольника:

 

.

 

Рис. 2.1.6.2. Поиск абсцисс точек пересечения горизонтали со сторонами треугольника

 

2.1.7 Освещение

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

Обычно освещённость некоторой точки, принадлежащей грани в пространстве, складывается из рассеянной освещённости и диффузного отражения — потока света, отражающегося от поверхности объекта. Иногда к ним добавляют зеркальное отражение — поток света, отражающийся от внешней поверхности объекта под тем же углом, под которым он падал на эту поверхность. Однако в данной работе зеркальное отражение света не учитывается, так как расчёт интенсивности зеркального отражения, например по модели Фонга, требует немалых вычислительных затрат. Для него требуется рассчитывать угол между вектором наблюдения и вектором отражения и возводить косинус этого угла в некоторую степень, зависящую от свойств поверхности.

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

 

 

Рис. 2.1.7.1. Матовая поверхность

 

,

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

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

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

 

,

 

где R – расстояние от источника света до рассматриваемой точки поверхности, k – произвольная константа, предотвращающая деление на 0.

Для определения косинуса угла между вектором нормали к поверхности и вектором, определяющим положение источника света в пространстве, следует воспользоваться скалярным произведением. Пусть имеется вектор нормали и две точки – , принадлежащая поверхности, и , определяющая положение источника. Вектор, направленный от точки поверхности к источнику света, имеет следующие координаты: . Тогда

 

,

,

,

 

или

 

.

 

Следовательно

 

.

 

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

 

,

 

или, более развернуто,

 

.

 

Далее рассматриваются методы закрашивания поверхности, реализованные в данной работе.

 

2.1.7.1 Однотонная закраска (метод гранения)

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

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

· источник света находится на большом расстоянии от объекта;

· наблюдатель находится на большом расстоянии от объекта;

· каждая грань тела является гранью многогранника, а не аппроксимирующей поверхностью;

· поверхность аппроксимирована большим числом небольших плоских граней.

 

Рис. 2.1.7.1.1. Изображение, полученное методом гранения

 

2.1.7.2 Метод Гуро

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

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

· вычисляются нормали к каждой грани;

· определяются усредненные нормали в вершинах - производится усреднение нормалей примыкающих граней. На иллюстрации приведен пример – вектор нормали в вершине a равен ;

·

Рис. 2.1.7.2.1. Нормаль в вершине

 

· на основе усредненных нормалей в вершинах вычисляются значения интенсивностей в вершинах согласно принятой модели отражения;

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

Определение интерполированных значений интенсивности отраженного света в каждой точке грани (и, следовательно, цвет каждого пикселя) удобно выполнять во время цикла заполнения полигона (например, совместить его с реализацией алгоритма Z-буфера). Далее рассматривается заполнение грани горизонталями в экранных координатах.


Рис. 2.1.7.2.2. Интерполяция значений интенсивности

 

Интерполированная интенсивность I в точке (X, Y) определяется исходя из пропорции

 

.

 

Отсюда

 

.

 

Значения интенсивностей I1 и I2 на концах горизонтального отрезка представляет собой интерполяцию интенсивности в вершинах:

 

; или

, .

 

Рис. 2.1.7.2.3. Изображение, получено методом Гуро

2.1.7.3 Метод Фонга

Этот метод закраски аналогичен методу Гуро, но при использовании метода Фонга для определения цвета в каждой точке интерполируются не интенсивности отраженного света, а векторы нормалей.

Последовательность действий такова:

· определяются нормали к граням;

· по нормалям к граням определяются усредненные нормали в вершинах. В каждой точке закрашиваемой грани определяется интерполированный вектор нормали;

· по направлению векторов нормали определяется цвет точек грани в соответствии с принятой моделью отражения цвета.

Как уже было сказано, метод заключается в интерполяции вектора нормали. Для интерполяции будут использоваться векторы , исходящие из начала координат плоскости проецирования и параллельными соответствующим нормалям в вершинах a, b и c.

 

Рис. 2.1.7.3.1. Интерполяция векторов нормалей

 

Нахождение и производится следующим образом:


,

.

где – координаты векторов . Теперь необходимо найти координаты вектора :

 

.

 

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

 

Рис. 2.1.7.3.2. Изображение, полученное методом Фонга

 

2.1.7.4 Анализ методов Гуро и Фонга

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

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

 

 

Рис. 2.1.7.4.1. Отличия закрашивания Фонга и Гуро

 

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

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

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


2.1.8 Последовательность действий при визуализации сцены

План действий, необходимых для визуализации сцены приведен на следующей схеме:

 

Рис. 2.1.8.1. Схема визуализации сцены

 

2.2 Типы, структуры данных и функции, использованные при реализации программного комплекса

 

2.2.1 Представление исходных данных

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

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

Разработанные типы данных и форматы файлов подробно описаны в последующих разделах.

 

2.2.2 Программа «Редактор карт»

2.2.2.1 Изообласти высоты

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

THeightColor = record

Color: TRGBColor;

Height: Single;

end;

Поля этой записи имеют следующее значение:

· Color – цвет изообласти;

· Height – представляемая высота.

Размер записи – 8 байт (компилятор Delphi производит выравнивание полей в записи, поэтому размер записи оказывается равным 8 байтам, а не 7, как должно быть).

Тип TRGBColor используется для хранения RGB-цвета. Представим его структуру:

TRGBColor = record

R, G, B: Byte;

end;

Размер записи – 3 байта (по неизвестным причинам в этом случае выравнивания не произошло).

В процессе создания каждой карты создается динамический массив, для хранения информации обо всех типах изообластей:

THeightColors = array of THeightColor;


2.2.2.2 Равномерная сетка высот и ландшафт

Для хранения узлов исходной равномерной сетки (с шагом 1) используется динамический массив элементов типа Single:

 

TZBitMap = array of array of Single;

 

Тип Single использован для экономии оперативной памяти и дискового пространства, точность этого типа – 8 знаков после запятой, что вполне достаточно в рамках этой работы, при этом переменная этого типа занимает в памяти 4 байта, вдвое меньше, чем переменная типа Real.

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

TTriangle = record

P: array [0..2] of TPoint3

N: TPoint3

pD: Single;

aN: array [0..2] of TPoint3;

Color: TRGBColor;

end;

Поля этой записи имеют следующие значения:

· P – массив точек треугольника;

· N – нормаль к плоскости треугольника;

· pD – свободный член уравнения плоскости, несущей треугольник;

· aN – массив усредненных нормалей в вершинах треугольника;

· Color – базовый цвет треугольника.

Поля N и pD в совокупности образуют уравнение плоскости, несущей треугольник.

Размер записи – 92 байта (реальный размер, без выравнивания – 91 байт).

Необходимо привести описания типов, использованных в записи TTriangle:

TPoint3 = record

X, Y, Z: Single;

end; - запись служит для хранения координат точки.

Размер записи – 12 байт.

Для работы с равномерной сеткой высот предусмотрены следующие процедуры и функции:

· function CreateZBitMap(Width, Height: Integer): TZBitMap – выделение памяти для первичной сетки высот, ее размеры - Width и Height, совпадают с размерами области вывода;

· procedure FreeZBitMap(var ZBMP: TZBitMap) – освобождение памяти, занимаемой первичной сеткой высот;

· function FillZBitMap(Image: TImage; Colors: THeightColors): TZBitMap - заполнение первичной сетки высот на основе изображения, хранимого в Image и соответствий «Цвет-высота», содержащихся в массиве Colors;

· function DivideZBitMapIntoTriangles(BitMap: TZBitMap; StepX, StepY: Integer): TTriangles – функция преобразования первичной равномерной сетки BitMap в более разреженную сетку с шагами StepX и StepY по горизонтали и вертикали соответственно. После этого преобразования полученная сетка разбивается на треугольники, на основе которых будет построен ландшафт;

· procedure SmoothMap(var BitMap: TZBitMap) – процедура для проведения одного цикла сглаживания первичной сетки высот;

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

· procedure FillTrianglesNormals(var Triangles: TTriangles) – расчет и заполнение всех полей записи TTriangle, кроме координат точек и цвета;

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

· function GetNormal(T: TTriangle): TPoint3 – процедура для вычисления координат вектора нормали к плоскости треугольника;

· function CorrectNormal(N: TPoint3): TPoint3 – процедура нормализации вектора нормали;

· procedure AddNormal(var N: TPoint3; NAdd: TPoint3; var Count: Integer), procedure DivideNormal(var N: TPoint3; Count: Integer) – эти процедуры в совокупности служат для вычисления усредненной нормали в вершине треугольника;

 

2.2.2.3 Тип и структура файла для хранения карт изообластей

Файл для хранения информации о разметке карты изообластей высот является текстовым. Он имеет расширение HCL и разбит на секции, разделенные строками–маркерами. Ниже приведена его структура:

· заголовок файла – строка 'Landscape heights map';

· заголовок секции высот – строка ‘[ColorHeights Start]’;

o последовательность записей типа THeightColor;

· окончание секции высот – строка '[ColorHeights End]';

· заголовок секции пикселей – строка '[Pixels Start]';

o ширина и высота карты в пикселях;

o информация о пикселях карты, сжатая с помощью метода группового кодирования (последовательность па



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-06-03 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: