Смекни!
smekni.com

Построение изображений ландшафта в реальном времени (стр. 5 из 8)

· procedure SaveAsHeightsMap(Image : TImage; Colors : THeightColors; FileName : string) – процедура для сохранения разметки карты в файл HCL. Разметка считывается из Image, соответствия «Цвет-высота» из массива Colors, эта информация помещается в файл c именем FileName.

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

Таблица 2.2.2.4.1. Распределение программы «Редактор карт» по модулям

Имя модуля Описанные типы Назначение модуля
AboutUnit.pas - Модуль формы «О программе»
ColorUnit.pas - Модуль формы определения соответствия «Цвет-высота»
HelpUnit.pas - Модуль формы «Помощь»
MainUnit.pas - Главный модуль программы
ME_ExtRegUnit.pas - Модуль регистрации расширения HCL
ME_FileUnit.pas - Модуль работы с файлами
ME_GraphicsUnit.pas - Модуль реализации процедур визуализации
ME_MathUnit.pas TRGBColor, TPoint3, TTriangle, TTriangles, THeightColor, THeightColors, TZBitMap Модуль реализации вычислений
MLEditorUnit.pas - Модуль инструментальной формы «Обработка карт»
NewPictureUnit.pas - Модуль формы определения размеров новой карты
SectionUnit.pas - Модуль формы «Разрез»

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

Рис. 2.2.2.5.1. Связи между модулями программы «Редактор карт»

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

В программе «Просмотр ландшафта» также используется тип TTriangle. Он полностью аналогичен типу TTriangle, используемому в программе «Редактор карт». Ландшафт, как уже говорилось, представляется как совокупность треугольников, поэтому для его хранения в программе предусмотрен тип, представляющий собой динамический массив:

TTriangles = array of TTriangle.

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

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

· function GetScale(Triangles : TTriangles; Width, Height : Integer) : Single;

Необходимо пояснить значения аргументов представленной функции:

Triangles – треугольники ландшафта;

Width, Height – размеры области вывода.

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

· function MulTrianglesScale(Triangles : TTriangles; dX, dY : Integer; Scale : Real) : TTriangles;

Значения аргументов:

Triangles – исходные треугольники сцены;

dX, dY – экранные смещения по горизонтали и по вертикали;

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

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

· function RotatePointX(P, Center : TPoint3; Alpha : Real) : TPoint3;

· function RotatePointY(P, Center : TPoint3; Alpha : Real) : TPoint3;

· function RotatePointZ(P, Center : TPoint3; Alpha : Real) : TPoint3;

· function RotateTriangleX(T : TTriangle; Center : TPoint3; Alpha : Real) : TTriangle;

· function RotateTriangleY(T : TTriangle; Center : TPoint3; Alpha : Real) : TTriangle;

· function RotateTriangleZ(T : TTriangle; Center : TPoint3; Alpha : Real) : TTriangle;

· function RotateTrianglesX(Triangles : TTriangles; Center : TPoint3; Alpha : Real) : TTriangles;

· function RotateTrianglesY(Triangles : TTriangles; Center : TPoint3; Alpha : Real) : TTriangles;

· function RotateTrianglesZ(Triangles : TTriangles; Center : TPoint3; Alpha : Real) : TTriangles;

Аргументы всех функций однотипны: первый – объект, который должен быть повернут, второй – центр поворота; третий – угол поворота.

2.2.3.2 Z-буфер

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

TBuffer = array of array of Single.

Для работы с Z-буфером используются следующие процедуры:

· procedure CreateBuffer(out Buffer : TBuffer) – процедура для выделения памяти для Z-буфера;

· procedure ClearBuffer(var Buffer : TBuffer) – очистка буфера – его заполнение минимальным значением глубины;

· procedure FreeBuffer(var Buffer : TBuffer) – освобождение памяти, занимаемой буфером.

2.2.3.3 Буфер кадра

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

sWidth = 500;

sHeight = 650;

TScreen = array [0..sWidth - 1, 0..sHeight - 1] of Integer.

Перед выводом очередного кадра буфер кадра должен быть очищен. Для этого предназначена процедура

· procedure ClearScreenBuffer;

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

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

· procedure FillTriangleNormal (T : TTriangle; var Buffer : TBuffer; dX, dY : Integer; Scale : Real; LightPos : TPoint3) – закрашивание треугольника T методом гранения. Используется Z-буфер Buffer, используются экранные смещения dX и dY, коэффициент масштабирования Scale, положение источника света задается точкой LightPos;

· procedure FillTriangleGouraud(T : TTriangle; var Buffer : TBuffer; dX, dY : Integer; Scale : Real; LightPos : TPoint3) – процедура, реализующая метод закраски Гуро. Аргументы аналогичны аргументам предыдущей процедуры;

· procedure FillTrianglePhong(T : TTriangle; var Buffer : TBuffer; dX, dY : Integer; Scale : Real; LightPos : TPoint3) – процедура, реализующая метод закраски Фонга. Аргументы аналогичны аргументам предыдущей процедуры;

· procedure DrawLightSource(P : TPoint3; dX, dY : Integer; Scale : Real; Buffer : TBuffer) – процедура для вывода окружности (по алгоритму Брезенхема), обозначающей положение источника света. Положение источника цвета задается точкой P. Остальные параметры аналогичны параметрам предыдущих функций;

· procedure DrawLine(S, E : TPoint; Color : TRGBColor) – процедура вывода линии по алгоритму ЦДА. Аргументы S и E – точки начала и конца отрезка, Color определяет цвет отрезка;

· procedure DrawTriangle(T : TTriangle) – вывод каркаса треугольника в буфер кадра;

· procedure DrawWireTriangles(Triangles : TTriangles; dX, dY : Integer; Scale : Real) – вывод треугольников ландшафта в каркасном режиме;

· procedure DrawSolidTriangles(Triangles : TTriangles; var Buffer : TBuffer; dX, dY : Integer; Scale : Real; Light : TLightType; LightPos : TPoint3; ShowLightSource : boolean) – вывод треугольников ландшафта в режиме сплошной закраски. Параметры процедуры:

o Triangles – треугольники ландшафта;

o Buffer – Z-буфер, используемый при визуализации;

o dX, dY – экранные смещения по горизонтали и вертикали;

o Scale – коэффициент масштабирования;

o Light – определяет метод закраски треугольников. TLightType - перечисляемый тип, он определяется следующим образом:
TLightType = (Normal, Gouraud, Phong);

o LightPos – точка, задающая положение источника света;

o ShowLightSource – логическая переменная, определяющая, отображается ли источник света;

· procedure DrawScene(Triangles : TTriangles; View : TViewType; Light : TLightType; LightPos : TPoint3; ShowLightSource : boolean; var Buffer : TBuffer; dX, dY : Integer; Scale : Real; DC : Integer; NHDC : HDC; HBMP : HBITMAP) – основная процедура, объединяющая в себе все методы м режимы вывода сцены.

Аргументы, которые не были описаны в процедуре DrawSolidTriangles:

o View – переменная определяющая режим отображения треугольников - каркасный или сплошной. TViewType – перечисляемый тип, его описание - TViewType = (Wire, Solid);

o DC, NHDC, HBMP – переменные, используемые при выводе изображения с помощью функции BitBlt.

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

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

В программе файлы ландшафтов описываются следующим образом: File of TTriangle;

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

function LoadTrianglesFromFile(FileName : string) : TTriangles;

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


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

Таблица 2.2.3.3.1. Распределение программы «Просмотр ландшафта» по модулям

Имя модуля Описанные типы Назначение модуля
AboutUnit.pas - Модуль формы «О программе»
HelpUnit.pas - Модуль формы «Помощь»
L_ExtRegUnit.pas - Модуль регистрации расширения LND
L_FileUnit.pas - Модуль работы с файлами
L_GraphicsUnit.pas TBuffer, TScreen, TViewType, TLightType Модуль реализации процедур визуализации
L_MathUnit.pas TRGBColor, TPoint3, TTriangle, TTriangles Модуль реализации вычислений
LandscapePositionUnit.pas - Модуль формы «Положение ландшафта»
LightParamsUnit.pas - Модуль формы «Параметры источника света»
MainUnit.pas - Главный модуль программы
StatisticsUnit.pas - Модуль формы «Статистика»
ViewParamsUnit.pas - Модуль формы «Визуальные параметры»

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

Рис. 2.2.3.4.1. Связи между модулями программы «Просмотр ландшафта»


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

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

При разработке программного комплекса использовался язык программирования высокого уровня Object Pascal в составе среды визуального программирования Borland Delphi 7.

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

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

В состав программного комплекса входят два приложения: «Редактор карт» и «Просмотр ландшафта».