{
glViewportCi * 64. j * 44. 64. 44): // set the next viewport // устанавливаем следующий порт просмотра
drawPolyli neFi1е("dino.dat"): // draw it again // рисуем динозавра снова }
(Здесь проще использовать gl ViewportO, чем setViewportO. Какие аргументы следовало бы взять для setViewportO, если бы мы все-таки использовали эту функцию?) Отметим, что каждая копия рисуется в порте просмотра размером 64 на 44 пиксела с форматным соотношением (64/44), что совпадает с форматным соотношением мирового окна. Поэтому каждый динозавр нарисован без искажений.
Рисунок 3.8, б изображает другое мозаичное покрытие, здесь каждый второй мотив перевернут вверх ногами для создания любопытного эффекта. Это было сделано с помощью зеркального отражения
Дополнительные инструменты для рисования
каждого второго окна сверху вниз, а именно изменением порядка параметров top и bottom в функции setWindowQ1. (Удостоверьтесь, что такое зеркальное отражение окна правильно влияет на значения В и D в уравнении 3.13, описывающем преобразование окно - порт просмотра; это преобразование и является нашим инструментом зеркального отражения картинки в порте просмотра). Затем код для двойного цикла был изменен следующим образом:
forCint i-0: i < 5: i++) for(int j = 0: j < 5: j++) (
if((i+j) % 2 - 0) // if (i+j) is even // для четного (i+j)
setwindow(0.0. 640.0. 0.0. 440.0): // right-side-up window // правое верхнее окно else
setWindow(0.0. 640.0. 440.0. 0.0): // upside-down window // перевернутое окно
glViewportti * 64. j * 44. 64. 44): // set the next viewport // устанавливаем следующий порт просмотра
drawPolylineFi leCdino.dat"): // draw it again // рисуем динозавра снова }
а б Рис. 3.8. Мозаичное покрытие дисплея копиями динозавра Пример 3.2.5. Отсечение частей рисунка Изображение также может быть отсечено посредством соответствующей установки окна. OpenGL автоматически отсекает части объекта, расположенные за пределами мирового окна. Крайнее левое изображение на рис. 3.9 состоит из множества шестиугольников разных размеров, каждый из которых слегка повернут по отношению к соседнему. Предположим, что эти шестиугольники нарисованы в результате выполнения некоторой функции hexSwirlO (завихрение гексагонов). (В разделе «Фигуры на основе правильных многоугольников» мы увидим, как написать функцию hexSwirl ().) На рисунке показаны два наложенных на шестиугольники квадрата, которые демонстрируют различные способы выбора окна. Среднее и правое изображения на рис. 3.9 показывают, что будет нарисовано, если эти квад-