С этой целью мы сохраняем в переменной order количество применений этой инструкции к строке; например, S2 - это строка 2-го порядка на базе атома 'F'.
Листинг 9.2. Подпрограмма создания строк
void produceString(char *st.int order) {
for(:st: st++) // scan through each character // считываем каждый символ switch(*st)
продолжение^
Приближение к бесконечности
Листинг 9.2 (продолжение)
{
case '+': CD -- angle: break: // right turn // правый поворот
case CD +- angle: break:
// left turn // левый поворот
case "F": if(order > 0)
produceString(Fstr. order - 1): else forward(length, 1): break: case X: if (order > 0)
produceString(Xstr. order - 1): break: case 'V: if(order > 0)
produceString(Ystr. order - 1):
}
}
В листинге 9.2 приведена функция produceStringO, которая символ за символом сканирует входную строку. Если символ равен '+ или то черепаха поворачивает в соответствующую сторону. Если же символы равны "F", 'X' или 'Y', то функция produceStringO вызывает сама себя с соответствующей строкой, однако при значении порядка order, меньшем на единицу. Если переменная order равна 0, то данная функция интерпретирует символ 'F' как команду для черепахи и рисует прямую в текущем направлении. В функции используются глобально доступные строки Fstr, Xstr, Ystr, а также переменные angl е и 1 ength.
Отметим, что здесь черепаха использует фиксированную длину шага length. Поскольку кривые более высоких порядков содержат больше шагов, чем кривые низших порядков, их изображения будут больше. До начала рисования можно задать окно нужного размера и в нужном месте экрана, которое вместило бы строящуюся кривую, однако очень трудно предсказать аналитически, какую область будет занимать эта кривая. В тематическом задании 9.1 в конце главы описывается метод решения этой задачи: на предварительной стадии черепаха проходит кривую «невидимкой», создавая при этом окно требуемого размера.
Пример 9.3.1. Кривые, построенные при генерации строк Приведем данные для нескольких кривых, сгенерированных строками. Кривая Коха (Koch curve):