Глава 5. Преобразования объектов

Френсис Хилл

а б в г Рис. 5.42. Управление стеком СТ: а) до преобразованией; б) после pushCT(); в) после rotate2D(); г) после рорСТ()

Реализация подпрограмм pushCTO и рорСТО с использованием OpenGL проста, так как в нем имеются подпрограммы glPushMatnxO и glPopMatrixO, управляющие различными стеками из матриц. В листинге 5.2 приведены нужные функции. Отметим, что каждая из них должна информировать OpenGL о том, в каком из матричных стеков происходят изменения.

Листинг 5.2. Подпрограммы для сохранения и восстановления преобразований СТ

void Canvas:: pushCT(void) {

glMat ri xMode(GL_M0DELVIEW):

glPushMatrixO; // push a copy of the top matrix // вталкиваем в стек копию верхней матрицы }

void Canvas:: popCT(void) {

glMatri xMode(GL_MODELVIEW):

gl PopMatrixO : // pop the top matrix from the stack // выталкиваем верхнюю матрицу из стека Пример 5.5.5. Простой способ выкладывания мозаики Множество красивых узоров, называемых мозаикой (tiling), украшают стены, посуду и ткани. Они основываются на повторении основного мотива - как по горизонтали, так и по вертикали. Рассмотрим мозаичное выкладывание окна каким-нибудь мотивом, как предложено на рис. 5.43. Мотив нарисован в центре своей системы координат, как показано на рис. 5.43, а, с помощью некоторой подпрограммы motif ( ). Копии этого мотива рисуются с отступом в L единиц в направлении х и в D единиц в направлении у, как показано на рис. 5.43, б.

В листинге 5.3 показано, как просто можно манипулировать системой координат в двойном цикле при рисовании этой мозаики. После прорисовки каждого ряда преобразование СТ восстанавливается таким образом, что оно возвращается в начало этого ряда, готовое подняться наверх для начала следующего ряда. Кроме того, весь блок кода заключен между подпрограммами pushCTC ) и рорСТ( ), поэтому после завершения всей мозаики СТ возвращается к своему начальному значению - на тот случай, если понадобится рисовать еще.

Листинг 5.3. Рисование шестиугольной мозаики

cvs.pushCTO :

// so we can return here


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