· 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) – освобождение памяти, занимаемой буфером.
Кроме того, необходим и буфер кадра. Буфер кадра в данной работе представлен статическим массивом (это ограничение обусловлено использованием функции 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.1 Выбор языка программирования
При разработке программного комплекса использовался язык программирования высокого уровня Object Pascal в составе среды визуального программирования Borland Delphi 7.
Выбор был остановлен именно на этом языке программирования, так как он позволяет создавать программы с четкой модульной организацией, позволяющей реализовывать строгое разделение уровней абстракции. Кроме того, среда Delphi предоставляет программисту обширную библиотеку визуальных компонентов, позволяющих создавать качественный интерфейс произвольной сложности.
3.2 Описание программного комплекса
В состав программного комплекса входят два приложения: «Редактор карт» и «Просмотр ландшафта».