Вопрос:

2. Допишите строки вспомогательного алгоритма рисования домика.

Ответ:

Решение:

Чтобы дописать строки вспомогательного алгоритма, нужно проанализировать уже существующий код и рисунок. Алгоритм домик состоит из команд опустить перо, сместиться на вектор (X, Y) и поднять перо. Эти команды используются для рисования отдельных элементов дома.

Из рисунка видно, что дом состоит из:

  • Основания (квадрат).
  • Крыши (треугольник).
  • Окна (прямоугольник внутри квадрата).

Алгоритм домик, вероятно, рисует один из этих элементов. Программа, вызывающая домик три раза, смещаясь каждый раз, предполагает, что домик рисует что-то, что потом перемещается. Если предположить, что домик рисует само здание без крыши (квадрат), то три вызова с разными смещениями могли бы означать рисунок трех одинаковых домов в разных местах. Однако, рисунок показывает один дом.

Наиболее вероятный сценарий: каждая команда сместиться на вектор в основном алгоритме задает начальную точку для отрисовки домика. А сам алгоритм домик рисует один стандартный элемент, например, квадрат.

Чтобы нарисовать дом, как показано на картинке, нам нужно:

  1. Нарисовать квадрат (основу дома).
  2. Нарисовать треугольник (крышу).
  3. Нарисовать прямоугольник (окно).

Предположим, что алгоритм домик рисует квадрат 5x5 единиц.

алг домик
нач
опустить перо
сместиться на вектор (5, 0)
сместиться на вектор (0, 5)
сместиться на вектор (-5, 0)
сместиться на вектор (0, -5)
поднять перо
кон

Тогда, чтобы нарисовать дом с окном и крышей, можно использовать вложенные алгоритмы или нарисовать их внутри основного.

Алгоритм для окна:

алг окно
нач
опустить перо
сместиться на вектор (1, 1)
сместиться на вектор (3, 0)
сместиться на вектор (0, 2)
сместиться на вектор (-3, 0)
сместиться на вектор (0, -2)
поднять перо
кон

Алгоритм для крыши:

алг крыша
нач
опустить перо
сместиться на вектор (2.5, 2) // Вершина треугольника
сместиться на вектор (-2.5, -2)
сместиться на вектор (5, 0)
сместиться на вектор (-2.5, 2)
поднять перо
кон

Полная программа:

алг нарисовать_дом
нач
использовать Чертежник
алг домик // Рисует квадрат 5x5
нач
опустить перо
сместиться на вектор (5, 0)
сместиться на вектор (0, 5)
сместиться на вектор (-5, 0)
сместиться на вектор (0, -5)
кон
алг окно // Рисует прямоугольник 3x2 внутри квадрата
нач
опустить перо
сместиться на вектор (1, 1)
сместиться на вектор (3, 0)
сместиться на вектор (0, 2)
сместиться на вектор (-3, 0)
сместиться на вектор (0, -2)
кон
алг крыша // Рисует треугольник над квадратом
нач
опустить перо
сместиться на вектор (2.5, 5) // Верхний угол крыши, относительно начала координат квадрата
сместиться на вектор (-2.5, -5) // В левый нижний угол квадрата
сместиться на вектор (5, 0) // В правый нижний угол квадрата
сместиться на вектор (-2.5, 5) // Снова в верхний угол крыши
кон
// Основная часть программы
домик // Рисуем квадрат
окно // Рисуем окно внутри
крыша // Рисуем крышу
кон

Но, если следовать заданию, нужно дописать строки основного алгоритма, а не создавать новые.

Вот предполагаемые строки для основного алгоритма, если домик рисует только квадрат:

алг домик // Рисует квадрат 5x5
нач
опустить перо
сместиться на вектор (5, 0)
сместиться на вектор (0, 5)
сместиться на вектор (-5, 0)
сместиться на вектор (0, -5)
поднять перо
кон

Алгоритм рисования дома:

алг рисунок_дома
нач
использовать Чертежник
// Рисуем квадрат
сместиться в точку (0, 0) // Начало координат
домик
// Рисуем окно
сместиться в точку (1, 1) // Начало окна
алг окно // Рисует прямоугольник 3x2
нач
опустить перо
сместиться на вектор (3, 0)
сместиться на вектор (0, 2)
сместиться на вектор (-3, 0)
сместиться на вектор (0, -2)
кон
// Рисуем крышу
сместиться в точку (0, 5) // Нижний левый угол квадрата, начало для крыши
алг крыша // Рисует треугольник
нач
опустить перо
сместиться на вектор (2.5, 5) // Верхняя точка крыши
сместиться на вектор (5, 0) // Нижний правый угол квадрата
сместиться на вектор (-2.5, -5) // Обратно в нижний левый угол квадрата
кон
кон

Исходя из предоставленного формата, нужно заполнить пустые строки в алгоритме домик, который вызывается из основной программы.

Предполагаем, что домик рисует квадрат.

алг домик

нач

опустить перо

сместиться на вектор (5, 0)

сместиться на вектор (0, 5)

сместиться на вектор (-5, 0)

сместиться на вектор (0, -5)

поднять перо

кон

Теперь заполним основную программу:

алг отрисовка

нач

использовать Чертежник

// Рисуем квадрат

сместиться в точку (0,0) // Начало координат для квадрата

домик

// Рисуем окно внутри квадрата. Оно имеет размер 3x2 и смещено на (1,1) от угла квадрата.

сместиться в точку (1,1)

алг окно // Рисует прямоугольник 3x2

нач

опустить перо

сместиться на вектор (3, 0)

сместиться на вектор (0, 2)

сместиться на вектор (-3, 0)

сместиться на вектор (0, -2)

кон

// Рисуем крышу. Крыша - это треугольник над квадратом.

сместиться в точку (0,5) // Нижний левый угол квадрата, откуда начинаем рисовать крышу

алг крыша // Рисует треугольник

нач

опустить перо

сместиться на вектор (2.5, 5) // Верхняя точка крыши

сместиться на вектор (5, 0) // Нижний правый угол квадрата

сместиться на вектор (-2.5, -5) // Возвращаемся в нижний левый угол квадрата

кон

кон

Если задача заключается в том, чтобы заполнить пропуски в уже существующем алгоритме домик, то это будет зависеть от того, что именно должен рисовать домик. Исходя из рисунка, домик рисует сам дом. А вызовы сместиться в точку (x, y) перед домик задают начальную позицию для всего дома.

Предположим, что домик рисует только квадратную часть дома, а окно и крыша рисуются отдельно.

алг домик

нач

опустить перо

сместиться на вектор (5, 0) // Рисует нижнюю сторону квадрата

сместиться на вектор (0, 5) // Рисует правую сторону квадрата

сместиться на вектор (-5, 0) // Рисует верхнюю сторону квадрата

сместиться на вектор (0, -5) // Рисует левую сторону квадрата

поднять перо

кон

Теперь заполним главную программу, которая использует этот домик:

алг дом_полный

нач

использовать Чертежник

// Первая позиция дома

сместиться в точку (1, 4)

домик // Рисуем квадрат

// Рисуем окно внутри квадрата

сместиться в точку (1+1, 4+1) // Смещение окна внутри квадрата (1,1 от нижнего левого угла)

алг окно // Рисует прямоугольник 3x2

нач

опустить перо

сместиться на вектор (3, 0)

сместиться на вектор (0, 2)

сместиться на вектор (-3, 0)

сместиться на вектор (0, -2)

кон

// Рисуем крышу

сместиться в точку (1, 4+5) // Нижний левый угол квадрата (1,4) + высота квадрата (5) = начало крыши (1,9)

алг крыша // Рисует треугольник

нач

опустить перо

сместиться на вектор (2.5, 5) // Верхняя точка крыши, относительно начальной точки крыши (1,9). Абсолютная координата будет (1+2.5, 9+5) = (3.5, 14) - это неверно.

// Давайте переделаем алгоритм крыши, чтобы он был относительным.

алг крыша_относительная

нач

опустить перо

сместиться на вектор (2.5, 5) // Рисуем наклонную влево от начала (0,5) -> (2.5, 10). Относительно (1,9) -> (3.5, 14).

сместиться на вектор (2.5, -5) // Рисуем наклонную вправо от (2.5, 10) -> (5, 5). Относительно (3.5, 14) -> (6, 9).

сместиться на вектор (-5, 0) // Рисуем основание от (5,5) -> (0,5). Относительно (6,9) -> (1,9).

кон

// Применяем смещения

сместиться в точку (1, 4) // Начало квадрата

домик

сместиться в точку (1+1, 4+1) // Начало окна

окно

сместиться в точку (1, 4+5) // Начало крыши (нижний левый угол квадрата)

крыша_относительная

кон

Это слишком сложно. Вернемся к исходной задаче. Нужно ДОПИСАТЬ строки вспомогательного алгоритма. И даны три вызова сместиться в точку (x,y) перед домик. Это значит, что домик должен быть простым, и его вызывают трижды в разных местах.

алг домик

нач

опустить перо

// Рисуем квадрат 5x5

сместиться на вектор (5, 0)

сместиться на вектор (0, 5)

сместиться на вектор (-5, 0)

сместиться на вектор (0, -5)

// Поднять перо, если домик должен быть нарисован, но потом перемещен.

// Если домик рисует только квадрат, а окно и крыша - это отдельные команды, то это возможно.

// Но вопрос