treenode torso_node, head_node, lua_node, rua_node, lll_node, rll_node, lla_node, rla_node, rul_node, lul_node;

В программе эти узлы можно сформировать либо в функции main(), либо в функции myinit( ). Рассмотрим, например, корневой узел дерева, представляющий компонент Корпус. Его ориентацию можно изменять, поворачивая вокруг оси у. В OpenGL формирование соответствующей матрицы поворота выполняется функцией glRotatef(), а затем элементы сформированной матрицы копируются в массив m структуры treenode. Реализующий эти операции фрагмент программного кода приведен ниже:

glLoadIdentity();
glRotatef(theta[0], 0.0, 1.0, 0.0); glGetFloatv(GL_MODELVIEW_MATRIX,torso_node.m);

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

torso_node.f = torso; torso_node.sibling = NULL; torso_node.child = &head_node;

Фрагмент программного кода, заполняющий структуру описания узла Левое плечо, выглядит так:

glLoadIdentity();
glTranslatef(-(TORSO_RADIUS+UPPER_ARM_RADIUS),
0.9*TORSO_HEIGHT, 0.0); glRotatef(theta[3], 1.0, 0.0, 0.0); glGetFloatv(GL_MODELVIEW_MATRIX,lua_node.m); lua_node.f = left_upper_arm; lua_node.sibling = &rua_node; lua_node.child = &lla_node;

Для этого узла матрица преобразования есть произведение матрицы сдвига левого плеча относительно фрейма корпуса и матрицы поворота на заданный угол в сочленении. Параметр сдвига фактически определяет положение сочленения с правым плечом на корпусе фигурки. Дочерним для этого узла является узел Левое предплечье, а очередным братом/сестрой - узел Правое плечо. Прочие узлы формируются аналогичными процедурами.

Обход дерева выполняется тем же способом прямого обхода (preorder traversal), что и в ранее рассмотренном примере, но на сей раз реализуем рекурсивную процедуру обработки узла:

8.5. Обход древовидных структур

void traverse(treenode* root) {
if(root==NULL) return; glPushMatrix() ; glMultMatrixf(root->m); root->f();

⇐ Предыдущая| |Следующая ⇒