140.00K
Category: softwaresoftware

Операторы цикла

1.

4 Операторы цикла

2.

В языке PostScript имеется несколько видов циклов.
Рассмотрим два основных:
• простой;
• индексируемый.
Простой цикл реализуется с помощью оператора repeat, который
берет из стека 2 операнда: счетчик цикла и повторяемая
процедура, т.е. набор операторов. Счетчик цикла указывает, сколько
раз должна выполниться повторяемая процедура.
Например, с помощью оператора
6 {0 40 rlineto 30 -40 rmoveto} repeat
построено изображение

3.

Индексируемый цикл реализуется с помощью оператора for,
который берет из стека 4 операнда:
начальное значение счетчика цикла;
приращение значения счетчика цикла;
конечное значение счетчика цикла;
повторяемая процедура.
На каждый шаг работы цикла формируется текущее значение
счетчика. Сначала оно равно начальному значению, затем изменяется
после очередного шага цикла на величину приращения. Цикл
завершается, если текущее значение счетчика становится больше
конечного значения при положительном приращении. При отрицательном
приращении цикл завершается, если текущее значение становится
меньше конечного.
ВАЖНО: непосредственно перед выполнением повторяемой
процедуры for помещает в стек текущее значение счетчика и, если оно
не используется, то его следует оттуда явным образом удалять
командой pop.
Начальное значение, приращение и конечное значение могут быть
целыми или вещественными величинами.

4.

Пример 1. Рисуем «забор»
% процедура построения одного столбика
/palka {0 40 rlineto 30 -40 rmoveto} def
newpath
10 10 moveto
1 1 6 {palka} for
stroke

5.

Пример 2. Рисуем «неравномерный забор»
Координатой Х для основания очередного столбика может служить
текущее значение счетчика цикла.
/palka_c_param {0 40 rlineto
newpath
10 10 moveto
30 30 180 {palka_c_param} for
stroke
-40 rmoveto} def
Текущее значение
счетчика цикла

6.

Пример 3. Рисуем «падающий забор»
Каждый следующий столбик отклонен от оси X на 15° меньше
предыдущего столбика. Если текущее значение счетчика цикла будет
равно углу наклона, то направление рисования линии можно рассчитать по
формулам:
d
d * cos(α)
d * sin(α)
Угол наклона α

7.

% процедура построения одного столбика
/palka_sincos

угол наклона столбика над осью X
{currentpoint
% α x y координаты текущей точки - в стек
3 -1 roll
%x yα
dup
%x yαα
cos 40 mul
% x y α xn=cos(α)*40
exch
% x y xn α
sin 40 mul
% x y xn yn=sin(α)*40
rlineto
% x y отрезок из текущей точки в (x+xn, y+yn)
moveto
%
перемещение текущей точки в (x, y)
30 0 rmoveto} def
%
cмещение текущей точки в (x+30, y+0)
% падающий забор
newpath
10 10 moveto
90 -15 0 {palka_sincos} for
stroke
% α =90,75,60,45,30,15,0

8.

Пример 4. Рисуем «забор с аркой»
По координате Х оснований первого и последнего столбиков можно
рассчитать координаты центра арки.
/palka {0 40 rlineto 30 -40 rmoveto} def
newpath
10 10 moveto
1 1 6 {palka} for
-30 0 rmoveto
currentpoint
exch
10 add 2 div
exch
stroke
newpath
40 0 180 arc
stroke
% Где текущая точка?
% Нужно выполнить вычисления с
% координатами первой и последней точек
% Особенности выполнения оператора arc

9.

Рисование более длинного забора
1 1 6 {palka} for
1 1 10 {palka} for

10.

Пример 3. Текущее значение удаляется из стека
English     Русский Rules