- •Пугачев а.И.
- •1.1. Растровые изображения
- •1.2. Графические устройства ввода-вывода
- •1.3. Видеоадаптеры
- •2.1. Двумерные примитивы
- •2.2. Визуализация на дискретной области вывода
- •2.3. Визуализация отрезков прямых
- •2.5. Кривые Безье
- •2.7. Алгоритм закрашивания ориентированных многоугольников
- •2.8. Теоретико-множественные операции над двумерными областями
- •2.9. Построчный алгоритм тмо
- •2.10. Программная организация данных для представления сложных объектов
- •3.1. Двумерные геометрические преобразования
- •3.2. Совмещение преобразований. Преобразование относительно заданного центра
- •3.4. Непрерывные геометрические преобразования
- •3.5. Линейные преобразования фрагментов изображения
- •4.1. Трехмерные примитивы
- •4.2. Аппроксимация криволинейных поверхностей
- •4.3. Многогранники и сложные объекты
- •4.4. Свет и цвет
- •4.5. Диффузная модель распространения света
- •4.6. Зеркальное отражение света
- •4.7. Трехмерные геометрические преобразования
- •4.8. Проецирование трехмерных объектов
- •4.9. Ориентация и потенциальная видимость поверхностей
- •4.10. Удаление невидимых точек поверхностей
- •4.11. Метод визуального сглаживания Гуро
- •4.12. Метод визуального сглаживания Фонга
- •4.13. Системы координат в пространственной сцене
- •4.14. Алгоритмы трехмерной визуализации
- •4.15. Построение изображения с тенями
- •Основы компьютерной графики
2.10. Программная организация данных для представления сложных объектов
ТМО позволяют синтезировать сложные фигуры из более простых, что приводит к появлению объектов с иерархической структурой. Объектами нижнего уровня являются используемые примитивы, а объектами верхнего – конечные сложные фигуры (рис. 2.18). Число уровней иерархии в принципе не ограничивается.
Рис. 2.18
Для представления таких объектов в программных модулях должны быть созданы соответствующие структуры данных. Наиболее гибким решением по реализации произвольных сложных структур данных является использование ссылок.
Примеры записи структур данных, приведенные ниже, даны на языке Pascal. Тип TColor считается определенным и назначается для переменных, задающих коды цветов.
Примитивы с фиксированным числом параметров описываются объектами с соответствующими полями. Например, для отрезков (векторов) можно использовать структуру вида
Type
Vector = record
x1, y1, x2, y2: Integer;
Color: TColor;
End;
Для описания правильных многоугольников можно использовать следующую структуру:
Type
TrPoligon = record
Name: String; {наименование многоугольника}
N: Integer; {количество сторон}
xс, yс: Integer; {центр описанной окружности}
R: Integer; {радиус описанной окружности}
Color: TColor;
End;
Для примитивов с переменным числом параметров, таких, как произвольные многоугольники или сплайны, переменную часть – список вершин – удобно представлять кольцевой списковой структурой на основе ссылок (рис. 2.19).
Рис. 2.19
Достоинством списковой структуры является простота реализации операций по добавлению в любое место списка новых элементов и удалению любых элементов из списка.
Более сложные графические объекты, синтезируемые с помощью ТМО, удобнее представить в едином формате, не зависящем от конкретных операндов и вида ТМО.
Type
GrObject = record
Name: String; {наименование объекта}
TMO: byte; {код ТМО}
P1, P2: Pointer; {указатели на операнды ТМО}
Color: TColor;
End;
Поскольку число конечных графических объектов в процессе работы программы может меняться, их также целесообразно объединить в общий список. Для этого в приведенную выше структуру данных необходимо добавить дополнительную ссылку Next для связывания объектов.
Type
PGrObject: ^GrObject; {тип указателей на элементы списка объектов}
GrObject = record {геометрический объект}
Name: String; {наименование объекта}
TMO: byte; {код ТМО или типа примитива}
P1, P2: Pointer; {указатели на операнды ТМО}
Next: PGrObject; {указатель на следующий объект в списке}
Color: TColor;
End;
Приведенный тип позволяет объединить в единый список и отдельные примитивы и фигуры любой сложности, полученные с помощью ТМО. Для примитивов один из указателей, например P1, необходимо использовать для ссылки на описание примитива, а второй – не использовать.
На рис. 2.20 в качестве примера организации сложной структуры приведена структура данных для объекта Fig1, иерархическая структура которого приведена на рис. 2.18, и еще одного объекта Fig2, созданного из двух примитивов. На рис. 2.20 переменная FirstPt типа PGrObject является указателем на начало списка фигур.
Рис. 2.20
Обычно над фигурами, полученными с помощью ТМО, также выполняются геометрические преобразования. Если для их реализации используется интегральная форма, то параметры геометрических преобразований, например, матрицу результирующего преобразования, следует размещать в дополнительном поле каждого объекта типа GrObject.
Лекция 3. Геометрические преобразования на плоскости