// draw the untransformed house first
// вначале рисуем непреобразованный домик
cvs.translate2D(32. 25);
// СТ now includes translation
// теперь CT включает в себя перемещение
cvs.rotate2D(-30.0):
// СТ now includes translation and rotation //теперь CT включает в себя перемещение и поворот houseO:
// draw the transformed house // рисуем преобразованный домик
Преобразования объектов
Отметим, что домик можно любым образом масштабировать, поворачивать и перемещать и при этом нет никакой необходимости «влезать внутрь» подпрограммы гюизеО или изменять ее. (Более того, исходный код поизеОнам и не понадобится.)
Рис. 5.37. То же самое преобразование, рассматриваемое как последовательность изменений систем координат
Некоторые авторы находят более естественным рассуждать в терминах преобразования системы координат, а не самого домика. Как показано на рис. 5.37, первое перемещение системы координат на (32, 25) образует систему № 2, а затем поворот этой системы на -30° превращает ее в систему № 3. Поскольку OpenGL применяет преобразования в том же порядке, в каком изменяются системы координат, код, выполняющий такое суммарное преобразование, вызовет вначале cvs.transiate2D(32. 25) и затем cvs. rotate2D( - ЗО .0). Разумеется, это идентично коду, выполняющему данное преобразование другим способом, однако мы пришли к нему, рассуждая иным путем.
Далее приводятся несколько примеров, демонстрирующих, насколько просто управлять текущим преобразованием СТ для произведения различных эффектов.
Пример 5.5.1. Использование осевой симметрии На рис. 5.38, а показана звезда, созданная из полосок, которые выглядят переплетенными друг с другом. Такая фигура легко может быть нарисована с помощью подпрограммы rotate2D(). Пусть подпрограмма starMotifO рисует часть данной звезды - полигон, показанный на рис. 5.38, б. (Определение положения вершин этого полигона достаточно сложно и вынесено в тематическое задание 5.2.) Теперь для того, чтобы нарисовать звезду целиком, мы просто рисуем данный мотив пять раз, каждый раз поворачивая его на 72°.