Использование циклов в JS на примере Canvas
Циклы - это простой способ сделать какое-то действие несколько раз. Существует несколько различных видов циклов, но все они по сути делают одно и тоже: повторяют какое-либо действие несколько раз. При построении графических сцен операторы цикла играют ключевую роль, поскольку позволяют создавать повторяющиеся элементы изображения, обходить вершины и ребра сложных фигур, использовать различные алгоритмы.
Цикл for
Цикл for повторяет действия, пока не произойдёт какое-либо специальное событие завершения цикла. Объявление оператора for выглядит следующим образом:
for ([начало]; [условие]; [шаг]) [операторы]
При его выполнении происходит следующее:
- Выполняется выражение [начало], если оно указано. Это выражение обычно инициализирует один или несколько счётчиков, но синтаксис позволяет выражению быть любой сложности. Также используется для объявления переменных.
- Выполняется [условие]. Если условие истинно, то выполняются выражения. Если оно ложно, цикл for прерывается. Если же условие полностью пропущено, то оно считается истинным.
- Выполняются [операторы]. Чтобы выполнить несколько операторов, используются блок в фигурных скобочках { ... }.
- Обновляется [шаг], если он есть, а затем управление возвращается к шагу 2.
Мы попробуем отобразить ряд из елок. Давайте отобразим верхушки елей с помощью данного цикла.
for (var i = 0; i < obj.width - 50; i+=40) { context.fillStyle = "green"; context.beginPath(); context.moveTo(30 + i, 20); context.lineTo(10 + i, 40); context.lineTo(50 + i, 40); context.closePath(); context.fill(); }
Результат представлен ниже.
Цикл do...while
Цикл do...while повторяется пока заданное условие истинно. Оператор do...while имеет вид:
do [операторы] while ( [условие] );
Операторы выполняются пока условие истинно. Чтобы использовать несколько операторов, используется блок { ... }. Если условие истинно, выражения выполнятся снова. В конце каждого прохода условие проверяется. Если условие ложно, выполнение приостанавливается и управление передаётся следующему оператору после do...while.
Цикл do...while - это цикл с постусловием, т.е. хотя бы один раз операторы внутри этого цикла выполнятся, а затем будет проверено условие, определяющее необходимо ли повторить или закончить операции.
Давайте отобразим основу елей с помощью данного цикла.
i = 0; do { context.fillStyle = "green"; context.beginPath(); context.moveTo(30 + i, 40); context.lineTo(10 + i, 60); context.lineTo(50 + i, 60); context.closePath(); context.fill(); i=i+40; // шаг приращения } while(i < obj.width - 50)
Результат представлен ниже.
Цикл while
Цикл while выполняет операторы пока условие истинно. Выглядит он так:
while ([условие]) [операторы]
Если условие становится ложным, операторы в цикле перестают выполняться и управление переходит к операторам после цикла.
Условие проверяется на истинность до того, как выполняются операторы в цикле. Если условие истинно, выполняются операторы, а затем условие проверяется снова. Если условие ложно, выполнение приостанавливается и управление переходит к операторам после while. Чтобы использовать несколько операторов внутри цикла, используется блок { ... }.
Цикл while отличается от do...while лишь тем, что операторы внутри него могут не выполняться вообще.
Давайте отобразим последний слой с помощью данного цикла.
while(i < obj.width - 50) { context.fillStyle = "green"; context.beginPath(); context.moveTo(30 + i, 60); context.lineTo(10 + i, 80); context.lineTo(50 + i, 80); context.closePath(); context.fill(); i=i+40; // шаг приращения }
Результат представлен ниже.
И, наконец, выведем ствол для каждой ели:
i = 0; while(i < obj.width - 50) { context.fillStyle = "brown"; context.fillRect(25 + i, 80, 10, 15); i=i+40; // шаг приращения }
Результат представлен ниже.
Ниже представлен итоговый результат.