Не бывает совершенной красоты без некоторого нарушения пропорции.
Фрэнсис Бэкон (Francis Bacon)
Путем дробления отрезков прямых можно создать множество интересных кривых. При самом простом подходе к генерации таких кривых используется так называемый метод L-систем (L-Systems) рисования сложных кривых, основанный на простом наборе инструкций [Smith, 188, Prusinkiewicz, 173].
В главе 3 мы уже видели, что можно «управлять черепахой» с помощью символьной строки. Черепаха «читает» строку и интерпретирует каждый символ как команду на выполнение некоторой операции. Зададим черепахе следующий набор команд: Т' forward(l, 1) переместиться вперед на расстояние 1 в текущем направлении Ч' turn(A) повернуть направо на угол А градусов
turn(-A) повернуть налево на угол А градусов Если, например, дана строка "F-F++F-F" и значение угла А равно 60°, то черепаха нарисует первую генерацию Kt кривой Коха, изображенную на рис. 9.1.
Но как превратить простую строку вида "F-F++F-F" в более длинную, которая создаст более сложную кривую? Этот процесс основывается на наборе инструкций создания строк (string-production rules), который мы включим в определяемую нами подпрограмму produceStringO. Правило для кривой Коха имеет вид:
F' -> "F-F++F-F"
где знак означает, что каждый встреченный символ "F" замещается группой символов "F-F++F-F". Для символов '+' или '-' инструкции отсутствуют, поэтому эти символы передаются без изменений. На рис. 9.5, а представлены две стадии процесса создания строк. На первой стадии исходная строка, называ-
Приближение к бесконечности
емая атомом (atom), а в данном случае это "F", «генерирует» строку первого поколения S1-"F-F++F-F", затем эта строка подается на вход того же самого процесса, который генерирует строку второго поколения:
S2-F-F++F-F-F-F++F-F++F-F++F-F-F-F++F-F.
Видно, что в этой строке можно выделить четыре группы, или кластера (clusters), вида "F-F++F-F", разделенные символами '-'.затем '++' и наконец снова '-'. Если теперь черепаха интерпретирует данную строку, то она нарисует вторую генерацию кривой Коха К2\