Листинг 9.3. Скелет программы для рисования тримино
void doTrio(double size, int depth) {
int i:
if (depth - 1) drawTrioO:
else for(i =0: i < 4: i++) // draw four children // рисуем четырех потомков {
set up for the i-th child: II подготавливаемся для i- го потомка
doTrio(size / 2. depth - 1): // draw child // рисуем потомка }
}
Текущее рисование в подпрограмме doTrioO, а также выполнение операторов, обозначенных словами «set up for the i-th child», может быть выполнено несколькими способами. Для некоторых форм более предпочтительна черепашья графика; такие формы рассматриваются ниже. Для других форм проще изменять систему координат путем управления текущим преобразованием, как это сделано в тематическом задании 9.2.
На рис. 9.24 показано тримино со своими четырьмя потомками; каждый из которых для удобства помечен. (Украшение в виде дерева сделано просто для ориентировки глаза.) На рисунке проиллюстрировано применение черепашьей графики: «каркас» тримино рисуется с помощью последовательности инструкций forwardO и turnO, начиная с правого нижнего угла, что показано зачерненным значком, обозначающим черепаху. Если же вначале требуется нарисовать потомков, то группа операторов «set up for the i-th child» вначале перемещает невидимую черепаху (без рисования) к одной из четырех начальных точек и затем поворачивает ее в нужном направлении. В ниже приведенных упражнениях будет дано задание реализовать такую подпрограмму.
Рис. 9.24. Рисование тримино
9.4. Замощение плоскости
Рис. 9.25. Примеры тримино: а) глубина = 3; б) глубина = 4; в) глубина = б На рис. 9.25 показаны примеры тримино, сгенерированные посредством кода, приведенного в листинге 9.3. Для случая depth - 6 окно выбрано так, что оно целиком лежит внутри объекта, поэтому это окно выглядит заполненным мозаикой.
Практические упражнения
9.4.6. Нахождение рептилий Для того чтобы поближе познакомиться с рептилиями, докажите каждое из приведенных ниже утверждений (позаимствовано из [Clason, 42]):