Описанные идеи можно применять в моделях рекурсивно. Если, например, желательно сформировать более сложную форму головы фигурки - выделить в ней нос, глаза, уши и т.п.,- все эти компоненты можно описывать и отображать отдельно. В результате объект Голова будет иметь собственную иерархию, а программный код формирования изображения головы также будет включать обращения к функциям записи в стек и извлечения из стека матриц преобразования и атрибутов.
Если дерево включает два или несколько идентичных поддеревьев, то его можно преобразовать в ориентированный ациклический граф. Запись в стек и восстановление из стека позволяют изолировать процесс выполнения отдельных фрагментов программного кода. В графической системе OpenGL один дисплейный список может вызывать другой дисплейный список, и эта возможность позволяет программисту использовать еще один метод обработки деревьев и ориентированных ациклических графов.
8.4. Обход деревьев В системе PHIGS используется аналогичный, но менее мощный метод для работы с деревьями и ориентированными ациклическими графами. В этой системе данные помещаются в группы - структуры, - которые в первом приближении можно считать аналогами дисплейных списков. Одни структуры могут вызываться из других структур функцией execute_structure( ). Такой механизм позволяет формировать ориентированные ациклические графы. PHIGS поддерживает как локальные, так и глобальные матрицы преобразования, оперируя с которыми прикладная программа может эмулировать те же процедуры обращения к стеку матриц и атрибутов, что и в системе OpenGL. И в OpenGL, и в PHIGS используется фиксированный порядок обхода графов. В других API, включая и JAVA, поддерживаются древовидные структуры, которые можно обходить в разном порядке, формируя при этом одно и то же изображение, которое не зависит от порядка обхода узлов графа.
Тот подход, который был рассмотрен выше, позволяет создавать работоспособные программы, но имеет известные ограничения. Структура модели представлена неявно в программном коде в виде последовательности операторов записи в стек и извлечения из стека, а это не позволяет гибко модифицировать модель. Чтобы избежать этого, следует отделить описание структуры модели от программного кода ее обработки. Мы рассматривали метод "жесткого" программирования модели с единственной целью - дать читателям наглядное представление о процессе обхода дерева. В следующем разделе мы рассмотрим более общий метод описания иерархических моделей и обхода их графов.