sicp.io
2.2.5 · Язык изображений · преобразования и композиция

Композиция рисователей через преобразование кадра

Преобразование рисователя меняет переданный кадр, поэтому beside, below, повороты и разбиения комбинируют процедуры, а запуск дает список отрезков.

Вопрос для размышления

Как всего несколько преобразований кадра позволяют создать язык повторно используемых комбинаций изображений?

  • Преобразование рисователя путем построения вложенного кадра
  • Определение beside и below как комбинаторов процедур
  • Выражение отражений и поворотов через один и тот же примитив преобразования
  • Построение композиции из четырех частей без изменения базового рисователя
  • Создание рекурсивного разбиения с ростом числа отрезков по мере увеличения глубины
  • Связывание отрисованного SVG с трассой отрезков выбранного запуска

Процедура transform-painter не переписывает данные отрезков рисователя. Она отображает три опорные точки единичного квадрата через внешний кадр и строит новый вложенный кадр. Исходный рисователь затем выполняется внутри этого вложенного кадра. Процедуры beside и below создают двух преобразованных рисователей и объединяют их списки отрезков, тогда как отражения и повороты представляют собой лишь разный выбор трех опорных точек.

Первый запуск размещает четыре преобразованных шеврона в квадрате. Второй запуск рекурсивно определяет right-split: левая половина сохраняет исходный рисователь, а правая половина объединяет по вертикали две уменьшенные копии. На глубине 3 базовый рисователь из трех отрезков порождает 45 отображенных отрезков. Средство визуализации отрисовывает в точности те строки SEG, которые выводит Lispex, и ограничивает только рендеринг в браузере, а не собственные пределы выполнения среды.

Код SICP4,491 из 1,048,576 байт UTF-8
Примеры
Результат
Вывод
Значение
Диагностика
Трасса выполнения0 / 0 событий
    Запуски происходят внутри браузера с отображением результата программы и трассы выполнения.
    Язык изображенийОтрисовка отрезков, созданных программой.
    Загрузка среды выполнения
    При этом запуске не было получено корректных строк SEG.
    Отрисовано 0 отрезков из вывода программы.
    SVG отрисовывает строки SEG, выведенные при запуске в браузере.
    Ожидаемый результат

    Композиция из четырех частей выводит двенадцать строк SEG и возвращает (segments 12). Рекурсивное разбиение right-split глубины 3 выводит сорок пять строк SEG и возвращает (segments 45). Оба изображения SVG формируются из выбранной трассы Lispex.

    На что обратить внимание в трассе

    Найдите каждый вызов transform-painter, создающий вложенный кадр перед тем, как базовый рисователь отобразит свои отрезки. В right-split проследите за возвращаемыми процедурами рисователей по всей глубине рекурсии, затем проведите различие между композицией процедур и последующим созданием конечного списка отрезков во время отрисовки.

    Попробуйте сами

    Измените программу и сравните результат.

    Определите up-split, разместив исходный рисователь под двумя уменьшенными копиями, расположенными рядом друг с другом. Отрисуйте глубину 3 и определите количество отрезков перед запуском.

    Показать подсказку

    Используйте вызов below painter (beside smaller smaller). Рекуррентная формула для числа отрезков совпадает с right-split, поскольку на каждой положительной глубине создаются одна текущая копия и две уменьшенные копии.

    Завершить этот урок

    В этой главе пройдено 0 из 20 уроков0%