При открытии файла программа отбрасывает указанное пользователем разширение, если оно есть, и добавляет к имени файла своё. Когда программа отбрасывает разрешение, она отбрасывает три символа, находящиеся после точки. Поэтому если пользователь указал разширение, важно, чтобы оно состояло не менее чем из трёх символов, иначе при открытии файла произойдёт ошибка.
Проектировать грани нужно с помощью задания трёх вершин, причём если задание проекций трёх вершин начато в одной плоскости проекций, то все эти три проекции должны быть заданы в этой плоскости, а не отдельно: одна проекция точки на фронтальной, другая на горизонтальной, третья на профильной. Все три проекции точки должны быть в одной плоскости проекций. Это связано, как уже сообщалось, с тем что проецируются не точки или линии, а грани.
Рабочее окно, которое выводит графическую информацию, может быть только квадратным, по этому изменяя длину или ширину рабочего окна, нужно учитывать, что программа уравняет эти оба параметра.
3. Нереализованные возможности
Самый главный элемент, который необходимо реализовать - это полное отсутствие ошибок. На данном этапе разработки ошибок не выявлено, но гарантии их отсутствия не существует.
Затем следовало бы увеличить количество примитивов: добавить к грани и кубу, возможность создания призмы, многоугольника, цилиндра, сферы, диска. Наличие этих фигур обеспечило бы лёгкость создания любых объёмных тел. Потому что, например призма, в основе которой правильный восьмиугольник содержит 32 треугольной грани. Естественно пользователю вручную очень проблематично создать эту фигуру, поэтому её наличие в коллекции примитивов существенно облегчило бы ему работу.
Так же можно было бы разработать методы наложения разных текстур на трёхмерные объекты. Текстуры - это двухмерные графические изображения, которые, наложив как фотографию на грань объекта, превращают обыкновенный куб в телевизор, дом с окнами, стиральную машину и другие кубические объекты.
Текстуры бывают: аффинные, точные (перспективно - корректные), параболические. Текстуры можно накладывать на все трёхмерные объекты.
Можно было бы реализовать прозрачность трёхмерных объектов. Например, если нужно было бы создать объёмное тело из стекла. В этом случае необходимо было бы использовать прозрачность. Трёхмерные объекты, как известно, создаются двухмерными точками. Поэтому чтобы создать прозрачность необходимо перед выводом каждой точки объекта в определённом месте получать цвет уже стоящей на этом месте точки, если она есть, затем вывести точку цвет которой будет средним между цветом точки, которая ставится и которая уже стоит. Таким образом, за выводимым трёхмерным объектом будет видно расположение другого объёмного тела. Это и есть прозрачность.
4. Основная форма
Основная форма содержит такие компоненты как:
MainMenu - Предназначен для добавления к главной программе главного меню. Является компонентом Standart. Компонент MainMenu не визуальный компонент. Редактор меню вызывается после выбора опции Items. В редакторе можно создавать пункты меню проименовывая их с помощь свойства Caption. Переходя от одной компоненте к другой можно с помощью того же свойства Caption отредактировать пункты меню. Чтобы вставить линию разделитель нужно в свойстве Caption первой позицией указать символ "-" (дефис). После окончания создания пунктов меню редактор меню надо закрыть.
BitBtn - Этот компонент предназначен для создания кнопки с картинкой. В системе имеется набор готовых шаблонов.
После размещения объекта на форме изображение, помещаемое на кнопку, задаётся в свойстве Glyph (Значок). При этом вызывается редактор, с помощью которого выбирается нужная картинка (в формате BMP). Каждая такая картинка может состоять из 4 частей, равных по ширине. Первая часть - изображение кнопки в обычном состоянии, вторая - изображение "отключённой" кнопки, третья - изображение кнопки после щелчка мыши, изображение на нажатой кнопке. Число составных частей задаётся в свойстве NumGlyph (от 1 до 4). Расстояние от картинки до границ кнопки (в пикселях) можно указать в свойстве Margin. В свойстве Kind задаётся реакция кнопки на щелчок.
Button - Компонент предназначен для создания кнопок на форме и обработки события нажатия кнопки. Расположен на панели Standart. Имя кнопки указывается в поле Name, а выводимый текст на кнопке в свойстве Caption.
ComboBox - Компонент Поле со списком. Представляет собой вариант списка, с присоединённым дополнительным полем, в котором отображается выбранный элемент списка. Это же поле может использоваться для ввода новых элементов или для быстрого поиска элементов по начальным символам. Если на экране отображается только присоединённое поле ("раскрывающийся список"), то для раскрытия списка можно использовать клавиатурную комбинацию Alt+Вниз.
OpenDialog - Компонент предназначен для выбора файла с целью последующего открытия; Свойства класса TOpenDialog приведены в табл. 1
Таблица 1 - Свойства класса TOpenDialog
Свойство | Назначение |
DefaultExt | Расширение имени, используемое по умолчанию. Добавляется в конец выбраного пользователем имени файла, если расширение не указано явно. |
FileName | Выбранное пользователем имя файла вместе с полным путём поиска |
Files | Список выбранных имён файлов. В свойстве Options должен быть включён флажок ofAllowMultiSelect |
Filter | Набор масок, в соответствии с которыми отбираются имена файлов для отображения в диалоговом окне. Каждая маска состоит из двух частей: названия и шаблона, - разделённых символом |. Одному названию могут соответствовать несколько шаблонов. Маски отделяются друг от друга символом | |
FilterIndex | Номер текущей маски. Нумерация начинается с 1 |
HistoryList | Список ранее выбранных файлов (тип Strings) |
InitialDir | Текущий каталог, содержимое которого отображается при первом открытии диалогового окна |
Options | Набор флажков, определяющих окна выбора файлов. |
Title | Заголовок диалогового окна |
SaveDialog - Этот компонент практически ничем не отличается от компонента OpenDialog за исключением нескольких настроек, специфичных для процесса сохранения файла.
Label - Компонент находится на панэле Standart. Предназначен для вывода текста на форме с помощью свойства Text.
TDXTimer - Компонент находится на панели DelphiX. В программах, выполняющих действия, связанные с моделированием или обработкой графики, предназначенных для общения с пользователем в реальном режиме времени или выполняющих продолжительные вычисления, необходима компонента TDXTimer.
С помощью компонента TDXTimer можно включить генерацию сообщений, поступающих от системного таймера Windows с заданной периодичностью (в миллисекундах) и выполнять определённую часть действий именно в обработчике этого события. Это одна из возможностей многозадачности приложений Windows.
TDXDraw - Этот компонент находится на вкладке DelphiX. Он предназначен для вывода двухмерной и трёхмерной графики, используя DirectDraw и DirectX. Разрешение выводимой графики задаётся в свойстве Display. Вид курсора задаётся в свойстве Cursor. Метод DXDraw.Surface.Fill(Color) - заполняет видеостраницу цветом Color. С помощью свойства DXDraw.Surface.pixels[x, y]:=Color - ставится точка на виртуальной видеостранице. С помощью метода DXDraw.Flip - невидимая видеостраница делается видимой. Схема обрисовки изображения на двух видеостраницах: видимой и не видимой делает возможной создать анимацию без мерцания изображения.
5. Методы создания программы
Для создания трёхмерных объектов необходимо уметь преобразовывать трёхмерную графику в двухмерную. Ведь процедура вывода точки имеет только две координаты, задающие положение точки (x, y), следовательно, реально имеется дело с двухмерной графикой. Для начала следует принять систему трёхмерных координат:
Рисунок 3
Здесь буквами x, y, z обозначены положительные направления осей Ox, Oy и Oz соответственно. Также предполагается, что камера неподвижна и находится в точке с координатами (0,0,-dist), ось зрения камеры направлена по оси Oz, а именно в точку (0,0,0) (т.е. camera target = (0,0,0)), ось Ox с точки зрения камеры направлена слева направо, ось Oy - снизу вверх, ось Oz - вглубь экрана. Размер экрана - xSize на ySize пикселей.
Здесь и далее используются обозначения:
sx, sy | координаты проекции точки на экране |
x, y, z | 3D координаты точки, |
Dist | расстояние от камеры (она находится в точке (0,0,-dist)) до начала координат, |
Для созданя трёхмерных объектов необходимы примитивы. Такими примитивами являются элементарные трёхмерные объекты - треугольные грани. У каждой треугольной грани есть три вершины - три точки, имеющие трёхмерные координаты. Чтобы спроецировать их на плоскость, т. е. из трёхмерных координат x,y,z получить двухмерные sx, sy надо пользоваться формулой:
sx = xSize/2+x*dist/(z+dist); sy = ySize/2-y*dist/(z+dist);
В этой главе кратко представлены элементарные понятия о матричных преобразованиях, являющихся составной частью линейной алгебры, и дискретной математики (см. раздел Группы).
Введем несколько терминов. n-мерный вектор, он же вектор размерности n, он же вектор размера n: упорядоченный набор n действительных чисел. Матрица размера m на n (будет обозначаться как m*n, mxn): таблица размера m на n, в каждой клетке которой - действительное число.
Вот пример матрицы 3x3:
[ 15 y*z 0.6 ]
[ 7 -3 91 ]
[ sin(x) 0.123 exp(t) ]
Вектор будем записывать в столбик и рассматривать его как матрицу размера n*1.
Операция скалярного произведения векторов: определена для двух векторов одинаковых размеров. Результат есть число, равное сумме произведений соответствующих элементов векторов. Пример:
[ 1 ] [ 4 ]
[ 2 ] * [ 5 ] = 1*4 + 2*5 + 3*6 = 32