Часть Б

В разделе 9.4 был описан метод рисования рептилий - с использованием функции вроде doTrioO, которая рекурсивно вызывает сама себя и передает при этом информацию о размере, что позволяет рисовать рептилии все меньшего размера внутри одной большой. Существует и альтернативный метод: рисовать каждого потомка посредством управления системой координат и СТ (Current Transformation - текущим преобразованием). Как показано на рис. 9.52, для того чтобы нарисовать каждого потомка тримино, мы соответствующим образом изменяем систему координат и рисуем потомка в новой системе. Назовем опорным элементом (pivot) фигуры угол, отмеченный на рисунке буквой р. Рисование каждого потомка осуществляется посредством переноса системы координат в вершину его собственного опор9.10. Тематические задания ного элемента и соответствующего поворота осей. Кроме того, система координат масштабируется множителем 0,5, поскольку потомки вдвое меньше своих родителей.

Рис. 9.52. Изменение системы координат для рисования тримино При каждом вызове подпрограммы drawTrioO копия СТ сохраняется и восстанавливается перед выходом из подпрограммы (так что drawTrioO не оказывает глобального влияния на систему координат). Однако следует отметить, что потомки «чувствуют» эффект от изменений системы координат - чего мы и добиваемся, - поскольку рекурсивные вызовы drawTrioO происходят до восстановления СТ.

Листинг 9.11. Рисование тримино

void drawTrio(int depth) {
// Draw a triomino manipulating the CT

// Рисуем тримино посредством манипуляций с СТ

if(depth >= maxDepth) // draw the outline // рисуем контур

{
moveTo(0. 0): lineTo(0. 4): lineTo(2. 4): lineT0(2. 2): lineTo(4, 2): lineTo(4. 0): HneToCO. 0): return:
}

saveCTO: // make a copy for later // делаем копию для дальнейшего

depth++:

// update for the next generation // обновляем для следующего поколения

scaled).5. 0.5):

drawTrio(depth); // Draw В // рисуем В

translated.2): // to pivot of С // к опорному элементу в С

drawTrio(depth): // Draw С // рисуем С

translated.-2):

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