Саита для обучения программированию.
Простой способ удержать мотивы в вертикальном положении, как это показано на рис. 5.41, б, заключается в том, чтобы поворачивать каждый мотив до его перемещения. Например, если какой-либо мотив должен в конечном счете расположиться под углом 120°, то он сначала поворачивается (когда еще находится в начале координат) на -120°, затем перемещается вверх на Я единиц и затем поворачивается на 120°. Какие изменения в вышеприведенном коде приведуткэтому эффекту?
5.5.1. Сохранение СТ для дальнейшего использования Программа может включать в себя весьма длинные последовательности вызовов функций rotate2D(), scale2D() и transiate2D(). Эти функции вносят «дополнительные» или «относительные» изменения в СТ, но иногда нам может понадобиться «вернуться» к какому-нибудь предшествующему СТ, чтобы следовать по другому пути преобразований для следующего экземпляра рисунка. Для того чтобы «запомнить» желаемое СТ, нужно сделать его копию и записать ее в удобном месте. Тогда в дальнейшем мы сможем восстановить это СТ и быстро вернуться к преобразованию, которое имело место в тот момент. Мы даже можем хранить целую коллекцию прежних СТ и возвращаться к любым из них в нужные моменты. Для того чтобы осуществить это, можно работать со стеком преобразований (stack of transformations), как это предлагается на рис. 5.42.
Верхняя матрица в стеке - это фактическое СТ, и операции вида rotate2D() компонуют с ним свои преобразования описанным ранее способом. Для того чтобы сохранить это СТ для дальнейшего использования, делается его копия и «вталкивается» в стек с помощью подпрограммы pushCTO. После этого два верхних элемента стека становятся идентичными. Теперь верхний элемент может быть изменен с помощью дополнительных вызовов seal e2D( ) и подобных ей подпрограмм. Для того чтобы вернуться к прежнему СТ, верхний элемент просто «выталкивается» из стека с помощью' подпрограммы рорСТО и затем отбрасывается. Таким способом можно вернуться к самому последнему СТ, затем к следующему самому последнему СТ и т. д., в порядке «последним вошел, первым вышел» («last-in, first-out»).