/Arc {newpath rad rad rad 180 270 arc stroke} def
/tile { Arc gsave -1 -1 scale Arc grestore} def
Г.20. Построение мозаик Труше

Рис. Г.20. Построение мозаик Труше: а) мозаичный мотив; б) повернутый мозаичный мотив; в) орнамент

Количество рядов и столбцов записывается в num. Орнамент рисуется внутри двух циклов repeat: во внешнем цикле рисуются num рядов, для каждого из которых вложенный цикл рисует ряд из num мотивов. После рисования каждого ряда начало отсчета системы координат переносится обратно на левую

Г5. Команды решений и итераций

1029

сторону с помощью оператора grestore, а затем начало поднимается на ширину мотива для подготовки к рисованию следующего ряда:

/пит 20 def % number of rows and columns % количество рядов и столбцов 72 72 translate % set initial origin % устанавливаем исходное начало отсчета num{ gsave

num{ rand 2 mod 0 eq % true or false with equal likelihood % truevim false с равной вероятностью

{tile}

{gsave 90 rotate tile grestore}ifelse width 0 translate % move to the right % перемещаемся вправо } repeat grestore

0 width translate % move up a row

% перемещаемся вверх на один ряд }repeat showpage

Каждый элемент выбирается посредством «бросания монеты»: оператор rand 2 mod генерирует случайную величину 0 или 1 с одинаковой вероятностью, а оператор 0 eq помещает в стек соответственно true vim false. Если в вершине стека находится true, то команда ifelse выполняет процедуру {tile}; в противном случае этот оператор вначале поворачивает элемент на 90° и только затем рисует его.

Г5.3. Итерация Мы уже видели простейшую форму итерации, использующей команду repeat:

repeat выталкивает из стека два верхних элемента в качестве числа N и процедуры, после чего выполняет эту процедуру N раз.

Пример

При создании снежинки, изображенной на рис. Г.21, оператор repeat используется для рисования шести повернутых версий простой формы, которая, в свою очередь, нарисована некоторой процедурой moti f. Код имеет следующий вид:

6 {motif 60 rotate} repeat
Г.21. Использование операторов repeat и rotate

Рис. Г.21. Использование операторов repeat и rotate


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