Г4.3. Простейшая форма итерации с использованием оператора repeat

Мы будем рассматривать различные способы управляемого повтора процедур в разделе Г.5.3, однако один такой оператор настолько удобен, что мы решили представить его уже теперь. Оператор repeat заставляет процедуру выполняться заданное число раз. Он выталкивает из стека два верхних аргумента, чтобы получить: (1) - требуемое число итераций, (2) - процедуру, подлежащую повторению.

num proc repeat -» -

Г4. Определение новых переменных и процедур

1025

Например, код б }5 0 translate box{ repeat % draw 6 boxes in a row % рисуем б прямоугольников в ряд выполняет указанную процедуру (box) шесть раз и рисует в ряд шесть закрашенных прямоугольников.

Пример. Рисуем пентаграмму

Звезду, изображенную на рис. Г. 18, можно нарисовать посредством пяти повторений рисования горизонтальной прямой, обозначенной на рисунке как «theLine», перемежаемых последовательными поворотами системы координат на 72°. То есть если процедура drawStarEdge рисует «theLine», то код

5 { drawStarEdge 72 rotate} repeat % draw the star % рисуем звезду

нарисует звезду целиком. Использование оператора repeat облегчает понимание этой процедуры. (Чему равен полный поворот системы координат, когда процесс полностью завершен?) Теперь конечные точки «theLine» равны (.Rcos(a), #sin(a)), где а - 18°. (Почему?) Пусть радиус R хранится в переменной starRad. Создадим внутри процедуры drawStarEdge переменные tmpX и tmpY для хранения соответственно #cos(18°) и #sin(18°), после чего нарисуем желаемую прямую. (Напомним, что аргументы функций cos и sin измеряются в градусах.) Собирая все эти идеи вместе, получим следующую процедуру:

/drawStarEdge {
/tmpX starRad 18 cos mul def % tmpX=Rcos(18°)
/tmpY starRad 18 sin mul def % tmpY=Rsin(18°)
tmpX tmpY moveto % draw "theLine"

% рисуем "theLine"

tmpX neg tmpY lineto stroke }def
Г.18. Рисование звезды как пяти повернутых прямых линий

Рис. Г.18. Рисование звезды как пяти повернутых прямых линий Практическое упражнение Г11. Альтернативная звезда


⇐ Предыдущая| |Следующая ⇒