Книга: Выразительный JavaScript
Хранение и очистка преобразований
Хранение и очистка преобразований
Преобразования накапливаются. Всё, что мы рисуем после рисования отзеркаленного персонажа, также будет зеркальным. Это может стать проблемой.
Возможно сохранить текущее преобразование, порисовать что-то, а затем вернуть старое состояние. Так должна поступать функция, делающая временное преобразование системы координат. Сначала мы сохраняем то преобразование, которое использовал код, вызвавший эту функцию. Затем функция отрабатывает на основе преобразований, проведённых на этот момент, и, возможно, добавляет новые. И в конце мы возвращаем преобразования к началу.
Этим занимаются методы save
и restore
двумерного холста. По сути, они хранят стек состояний преобразований. При вызове save
в стек добавляется текущее состояние, а при restore
берётся состояние сверху стека и применяется в качестве текущего контекста всех преобразований.
Функция branch
в примере показывает, что можно сделать с функцией, которая выполняет преобразования и вызывает другую функцию (в данном случае, саму себя), которая продолжает рисовать с заданными преобразованиями.
Функция рисует древовидную структуру, рисуя линию, потом передвигая центр координат на конец линии, и вызывая себя затем дважды – сначала, повернув влево, а затем вправо. Каждый вызов уменьшает длину ветви, и рекурсия останавливается, когда длина падает меньше 8.
<canvas width="600" height="300"></canvas>
<script>
var cx = document.querySelector("canvas").getContext("2d");
function branch(length, angle, scale) {
cx.fillRect(0, 0, 1, length);
if (length < 8) return;
cx.save();
cx.translate(0, length);
cx.rotate(-angle);
branch(length * scale, angle, scale);
cx.rotate(2 * angle);
branch(length * scale, angle, scale);
cx.restore();
}
cx.translate(300, 0);
branch(60, 0.5, 0.8);
</script>
Если бы не было вызовов save
и restore
, второй рекурсивный вызов branch
начинал бы с позиции и поворота, созданных первым. Он был бы соединён не с текущей веткой, а внутренней правой веткой, нарисованной первым вызовом. В результате получается тоже интересная форма, но уже не древовидная.
- Сохранение информации о пользователях при миграции
- Сохранение информации из Интернета
- Хранение конфигурации в системном реестре
- Сохранение рабочей книги с именем, представляющим собой текущую дату
- Сохранение и использование шаблона узла
- Сохранение внесенных изменений
- Сохранение информации в реестре Windows
- 4.11.8. Сохранение фильтра
- 13.3. Хранение резервных копий
- Сохранение документов
- Практическая работа 4. Создание, сохранение и редактирование текстов
- Сохранение результатов поиска