В дальнейшем мы увидим, насколько существенно формировать структуру данных описания объекта таким образом, чтобы геометрия объекта в ней была отделена от его топологии.
В данном примере для описания геометрии объекта используется список, или массив вершин- vertices[8]. Объектом верхнего уровня иерархии является куб. Мы рассматриваем его как совокупность шести граней, а каждая грань, в свою очередь, описана четырьмя упорядоченными вершинами. Доступ к определенной вершине из списка вершин осуществляется по ее индексу в этом списке. Такая структура данных схематически представлена на рис. 4.24. Одно из ее достоинств состоит в том, что каждая геометрическая позиция определяется только в одном месте и не повторяется в спецификации каждой из трех граней, пересекающихся в соответствующей точке. Таким образом, если по ходу выполнения программы потребуется изменить значения координат точки, это придется сделать только в одном месте, не отслеживая все грани, пересекающиеся в ней.
6Термины вперед и назад в этой книге рассматриваются по отношению к положительному направлению базисного вектора г.
7Мы не будем принимать во внимание особые случаи (их принято называть вырожденными случаями - singularities/ которые проявляются, если три или более вершин лежат на одной прямой или если вершины расположены таким образом, что грани не пересекаются.
4.4. Модель разноцветного куба Многогранник Грани Списки вершин Вершины
Cube
В
Рис 4.24. Структура данных описания куба С D Е F
-2-і
ft!
7.,, 6 | |
*2' Ъ ъ.
х3' Уз
4.4.4. Цвет куба Список вершин можно использовать и для того, чтобы хранить информацию, необходимую для раскрашивания куба. С вершинами в данном примере будут ассоциированы чистые цвета вершин цветового куба, о котором шла речь в главе 2 (черный, белый, красный, зеленый, синий, голубой, фиолетовый, желтый). Функция quad() вычерчивает четырехугольник, заданный точками в его списке вершин, а функция colorcube() задает шесть граней таким образом, чтобы все они были внешними, typedef GLfloat point3[3);