Включение в правило операторов записи в стек и извлечения из стека позволяет формировать побочные ответвления образа. Рассмотрим правило

f-» F[RF]F[LF]F,

для которого установлен угол поворота 27° (рис. 11.14). Учтите, что отрисовка кривой начинается с нижней точки, а угол измеряется относительно текущего направления "вперед".

После применения правила к единственному линейному сегменту получим образ, представленный на рис. 11.14. Далее можно поступать по-разному. Например, применить правило повторно ко всем символам F в последовательности. В этом случае получится образ, показанный на рис. 11.15. Одновременно можно изменить масштаб единичного шага черепахи и таким образом уменьшить длину последующих отростков. После нескольких итераций получим нечто, напоминающее сухой кустарник с массой колючек (какой-нибудь саксаул). Все, кажется, прекрасно, но если с помощью этого правила попытаться изобразить на экране заросли саксаула, то получатся не хаотические дебри, а выстроившиеся, как на параде, "ветвистые витязи", ибо "все равны, как на подбор".

Заполняющие кривые

Рис. 11.13. Заполняющие кривые: а - кривая Коха; б - снежинка Коха

11.6. Языковые модели

Можно устранить это однообразие, так милое людям в погонах, введя случайность в отбор тех символов F, по отношению к которым применяется правило на очередном шаге итерации. В результате с помощью одного и того же правила можно получить разные варианты образа саксаула (рис. 11.16). Если ввести в набор еще несколько порождающих правил и случайно выбирать, какое из них применять на очередном цикле итерации, то можно сформировать на экране довольно правдоподобное изображение лесных дебрей. Незначительно модифицировав правила, можно и "приклеить" листочки на концы ветвей - саксаул превратится в сакуру.

Привлекательность этой стратегии состоит в том, что обходясь минимумом средств - буквально двумя-тремя правилами и несколькими параметрами, - мы получаем возможность определить целый класс объектов подобной и в то же время разнообразной формы. Предположим, что для оживления пейзажа или для создания "среды обитания" персонажей в сцену требуется включить деревья. Можно, конечно, просто сформировать в программе такие объекты, используя привычную методику их описания в виде множества примитивов - отрезков, многоугольников и канонических кривых. В некоторых случаях деревьев может потребоваться не единицы, а десятки (а может, и сотни). Но даже не это самое неприятное. Как правило, одна и та же сцена "по ходу действия" может рассматриваться в разном ракурсе и в разном масштабе, причем только малая часть из того множества деревьев, на формирование которого в программе ушло так много труда, появится в каждом конкретном изображении - виде сцены. Остальные будут либо вне поля зрения, либо иметь такой мелкий масштаб, что ни о какой проработке деталей образа и говорить не приходится. В результате складывается впечатление, что громадная работа по формированию деревьев ушла впустую. Совсем по-другому складывается ситуация, если для формирования образов деревьев использовать описанный процедурный метод. В программе присутствует только алгоритм формирования обобщенного дерева, а собственно создание образа происходит только тогда, когда такой образ действительно должен присутствовать в изображении. Причем степенью детализации образа, которая зависит от его масштаба на экране, также можно управлять программно.


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