Как сделать циклический рисунок
При составлении программы рисования квадрата вы заметили, что в ней несколько раз повторялась последовательность команд:
Хотелось бы сказать исполнителю, чтобы он сделал эти команды ровно 4 раза. При этом будет нарисован квадрат и Черепаха вернется в исходное положение. В программировании в таких случаях используется специальная команда (оператор), которая говорит исполнителю, что какую-то часть программы надо сделать несколько раз.
Цикл — это многократное исполнение последовательности команд.
Правила использования оператора цикла
- Цикл повтори используется тогда, когда число повторений цикла заранее известно или может быть вычислено.
- Оператор цикла начинается заголовком цикла - ключевым словом повтори, за которым в скобках указывается нужное количество повторений цикла.
- Тело цикла начинается открывающей фигурной скобкой < и заканчивается закрывающей >.
- В цикле выполняются все операторы, заключенные в скобки.
Для нашей задачи программа с использованием оператора цикла выглядит так:
Квадрат
покажись;
опусти_перо;
повтори ( 4 ) /* заголовок цикла */
/* начало цикла */
вперед ( 40 );
вправо ( 90 );
> /* конец цикла */
Вложенные циклы
Рассмотрим более сложную задачу, когда требуется нарисовать цепочку из пяти одинаковых квадратов, разделенных интервалом в 10 шагов:
Здесь явно напрашивается использование циклов, поскольку мы видим одинаковые элементы в рисунке и можно сказать исполнителю что-то вроде "Сделай 5 раз следующую операцию: нарисуй квадрат и переместись к левому нижнему углу следующего". С другой стороны, сам квадрат рисуется с помощью цикла. Поэтому один цикл повтори будет расположен внутри другого. Вложенный цикл — это цикл, расположенный внутри другого цикла
Решение задачи выглядит так:
ПятьКвадратов покажись; повтори ( 5 ) /* заголовок цикла */ /* начало цикла */ опусти_перо; повтори ( 4 ) /* заголовок вложенного цикла */ /* начало вложенного цикла */ вперед ( 40 ); вправо ( 90 ); > /* конец вложенного цикла */ вправо ( 90 ); подними_перо; вперед ( 50 ); влево ( 90 ); > /* конец цикла */ > |
Вложенный цикл рисует квадрат, после Черепашка переходит в точку для рисования следующего квадрата. Это повторяется 5 раз.
Использован материал из книги "Алгоритмы и исполнители", автор Поляков К.
Рис. 1. Принцип работы варио изображения (красным цветом обозначен первый кадр, бирюзовым — второй).
Рассмотрим создание анимированного изображения из серии кадров (Рис. 2).
Рис. 2. Набор кадров, любезно предоставлен Guillaume d’Hubert — 3dgh.fr
На компьютере движение выглядит замечательно (Рис.3).
Рис. 3 — Последовательность кадров, объединена в одно gif-изображение.
Изготовим лентикулярное изображение на основе этих кадров.
Возьмем линзовый растр 50 lpi c широким углом обзора — специально для анимации.
Для печати используем принтер Canon с разрешением 600 PPI (пикселов на дюйм, не путать с точками на дюйм).
Теоретически в него можно было бы закодировать 12 кадров, чтобы каждый кадр получил хотя бы один полноценный пиксел (600/50=12).
Далее исследуем, что же происходит при печати.
Используем USB-камеру-микроскоп для того чтобы разглядеть в деталях, как выглядит напечатанное закодированное изображение на бумаге и оценить работу линзового растра.
Рассмотрим питч-тест 50LPI в микроскоп (Рис.4).
Рис. 4. Используем цифровой USB-микроскоп, чтобы рассмотреть отпечаток.
При наблюдении кодовых полос питч-теста через растр под разными углами мы видим разные полосы кодированного изображения (Рис.5). Таким же образом работает линзовый растр при выделении разных кадров из закодированного изображения.
Рис. 5 При изменении угла наблюдения через линзу видны разные полоски кодового изображения.
Посмотрим теперь, что происходит при печати кодированных изображений с разным количеством исходных кадров — видео 1.
Видео 1. Исследование печати анимированного изображения с использованием растра 50 LPI и струйного принтера с разрешением 600 PPI.
Увеличенные фрагменты напечатанных на принтере кодированных изображений с разным количеством кадров показаны на Рис. 6. Видно, что при 12 исходных кадрах изображение хоть и присутствует, но кодовая полоска единственного кадра отпечатана слабо — при просмотре через линзу её изображение едва заметно. При 6 кадрах ситуация чуть получше, при 2-х кадрах — уже видно полноценную смену двух изображений.
Рис.6. Увеличенные фрагменты отпечатков закодированного изображения с разным числом кадров. Печать 600 PPI, принтер Canon, бумага фото глянцевая, кодирование 50 LPI.
Вывод такой, что разрешение печати (не только заявленное в характеристиках принтера, но и реальное — на бумаге) должно быть намного выше, чем LPI растра (количество линз на дюйм), для того, чтобы получить четкое разделение кадров. Это означает, что надо использовать растр с бо’льшим шагом.
Вот пример печати анимированного (морфинг — меняются контуры и цвет объекта) изображения на линзовом растре 20 LPI и принтере Mimaki с разрешением 720 PPI (видео 2).
Видео 2. Печать лентикулярного изображения с эффектом морфинга на растре 20 LPI, разрешение 720 PPI.
При создании этого морфинг изображения было использовано 15 отдельных кадров, сформированных в серию из 30 кадров (с 1 по 15 и с 15 до 1). Надо отметить также, высокую точность печати на этом принтере. Печать выполняется прямо по пластику и нет впитывания/растекания чернил в поры бумаги. В результате получили качественное изображение.
Анимация — это сложный вид изделия, требующий высокого разрешения печати и качества линз.
При печати на принтере по бумаге и растру, например, 75 LPI не получится хорошего результата просто потому, что чернила растекаются, бумага имеет волокна и четкого разделения между кадрами внутри кодовой полосы не добиться.
Для получения качественной анимации нужно выполнить условия:
- Шаг растра должен существенно (в 30-40 раз) превосходить разрешение печати.
- Желательно использовать растр с широким углом обзора (40 и более градусов), предназначенный для создания анимации (flip).
- В дизайне исходных изображений желательно избежать перемещения контрастных деталей, например, черного предмета на белом фоне.
Советы по дизайну
1. Количество кадров анимации надо подбирать с учетом требуемой плавности перемещения.
Можно воспользоваться формулой N=R/L
R — разрешение печати, L — LPI растра.
Однако, надо учитывать и сказанное выше, — принимать во внимание реальное качество печати.
3. Если не получается качественного разделения изображений — уменьшайте количество кадров.
Пусть лучше анимированное изображение будет из двух кадров, но переключается четко — это позволит сделать более качественное изделие.
4. Используйте морфинг. Как правило на морфинг-изображениях происходит плавное изменение формы, это позволяет получить лучший визуальный эффект.
Усвоить понятия: алгоритм как фундаментальное понятие информатики, способы описания, основные типы алгоритмов, освоить принципы решения задач с использованием основных алгоритмических конструкций.
Задачи лабораторной работы
- знать назначение алгоритма и его определение;
- знать формы представления алгоритма;
- уметь работать с основными алгоритмическими конструкциями;
- уметь представлять алгоритм в виде блок-схемы;
- уметь приводить примеры алгоритмов и применять их для построения блок-схем;
- уметь составлять и записывать алгоритм одним из способов.
Перечень обеспечивающих средств
Общие теоретические сведения
Решение любой задачи на ЭВМ можно разбить на следующие этапы: разработка алгоритма решения задачи, составление программы решения задачи на алгоритмическом языке, ввод программы в ЭВМ, отладка программы (исправление ошибок), выполнение программы на ПК, анализ полученных результатов.
Алгоритм – это точная конечная система правил, определяющая содержание и порядок действий исполнителя над некоторыми объектами (исходными и промежуточными данными) для получения после конечного числа шагов искомого результата.
- словесным (пример в начале раздела);
- графическим (виде специальной блок-схемы);
- с помощью специальных языков программирования.
Блок-схема – распространенный тип схем, описывающий алгоритмы или процессы, изображая шаги в виде блоков различной формы, соединенных между собой стрелками.
- Линейный алгоритм – это такой алгоритм, в котором все операции выполняются последовательно одна за другой.
- Алгоритмы разветвленной структуры применяются, когда в зависимости от некоторого условия необходимо выполнить либо одно, либо другое действие.
- Алгоритмы циклической структуры .
Циклом называют повторение одних и тех же действий (шагов). Последовательность действий, которые повторяются в цикле, называют телом цикла .
Циклические алгоритмы подразделяют на алгоритмы с предусловием, постусловием и алгоритмы с конечным числом повторов. В алгоритмах с предусловием сначала выполняется проверка условия окончания цикла и затем, в зависимости от результата проверки, выполняется (или не выполняется) так называемое тело цикла.
Представьте себе клетчатое поле (как лист из тетради в клеточку) на котором находится некий объект, который мы назовем Робот. Используя специальные команды Кумир, мы можем этим Роботом управлять — перемещать его по клеткам, закрашивать клетки. И в большинстве случаев наша задача будет заключаться в том, чтобы написать такую программу для Робота, выполняя которую он будет закрашивать определенные клетки.
Видео на тему: КуМир. Робот. Знакомство
Настройка среды Кумир для исполнителя Робот.
Запущенная программа Кумир выглядит так.
Первым делом мы должны раскоментировать первую строку нашей программы, убрав символ |
Таким образом, программа станет выглядеть так:
использовать Робот
алг
нач
кон
Но перед началом, нам необходимо задать стартовую обстановку Робота и познакомиться с простыми командами исполнителя Робот.
Стартовая обстановка Робота
Перед началом выполнения программы необходимо задать исполнителю Робот стартовую обстановку . Это значит установить Робота в нужную позицию, расставить стены, закрасить нужные клетки и т. п. Этот шаг очень важен. Если его проигнорировать, то программа может работать неправильно или вообще завершится аварийно.
Что такое стартовая обстановка?
Наш Робот находится в некой среде — это клетчатое поле, размер которого известен. Так же на этом поле могут находится стены и закрашенные клетки, а сам Робот может находится в любой клетке. Так вот — стартовая обстановка задает положение Робота на поле и расположение всех остальных элементов — стен, закрашенных клеток. И перед тем, как писать алгоритм для Робота необходимо задать стартовую обстановку. Насколько это важно давайте рассмотрим на примере. Пусть есть две стартовые обстановки:
Отличаются они только тем, что в стартовой обстановке 2 справа от Робота находится стена.
Если наша программа начнется с команды, которая переместит Робота на одну клетку вправо (о простых командах Робота), то в первом случае (стартовая обстановка 1) Робот выполнит эту команду, а во втором программа завершится аварийно, так как Робот не может ходить сквозь стены. Получается, что одна и та же программа в первом случае работает, а во втором приводит к ошибке. Именно поэтому так важно задавать стартовую обстановку для Робота.
Как задать стартовую обстановку в Кумир?
Запустив среду Кумир в меню Инструменты выбираем пункт Редактировать стартовую обстановку Робота.
Откроется окно с синим фоном. Это и есть стартовая обстановка Робота. И мы ее можем изменить.
По-умолчанию, размер окна 10 на 15 клеток. Если нам необходимо изменить количество строк и столбцов, то щелкаем Обстановка -> Новая обстановка и задаем необходимые значения
- чтобы переместить Робота в новую позицию, щелкаем по нему левой кнопкой мыши и не отпуская ее тащим Робота в нужное место.
- чтобы добавить/удалить стену, щелкаем левой кнопкой мыши по границе клетки.
- чтобы закрасить/очистить клетку, щелкаем по ней левой кнопкой мыши
- чтобы добавить или убрать точку в клетку щелкаем по клетке, удерживая клавишу Ctrl
После того, как мы задали нужную стартовую обстановку, ее необходимо сохранить (Обстановка -> Сохранить или Обстановка -> Сохранить как). После этого закрываем окно Обстановка и в основном окне программы выбираем Робот -> Сменить стартовую обстановку
Находим сохраненную ранее обстановку и загружаем ее. После этого убедимся, что загрузили правильную стартовую обстановку, щелкнув по кнопке Показать окно Робота
Если в окне с зеленым фоном (текущая обстановка Робота) вы увидите вашу обстановку, то можно переходить к написанию алгоритма, используя простые команды Робота.
Исполнитель Робот. Простые команды.
У нашего Робота тоже есть система команд. Сегодня мы рассмотрим простые команды Робота. Всего их 5:
вверх
влево
вправо
закрасить
Результат выполнения этих команд понятен из их названия:
вверх — переместить Робота на одну клетку вверх
вниз — переместить Робота на одну клетку вниз
влево — переместить Робота на одну клетку влево
вправо — переместить Робота на одну клетку вправо
закрасить — закрасить текущую клетку (клетку в которой находится Робот).
Эти команды можно писать с клавиатуры, а можно использовать горячие клавиши (нажав их команды будут вставляться автоматически):
вверх — Escape, Up (стрелка вверх)
вниз — Escape, Down (стрелка вниз)
влево — Escape, Left (стрелка влево)
вправо — Escape, Right (стрелка вправо)
закрасить — Escape, Space (пробел)
Обратите внимание, что набирать нужную комбинацию горячих клавиш нужно не привычным нам способом! Мы привыкли нажимать клавиши одновременно, а здесь их нужно нажимать последовательно.
Теперь мы готовы написать первый алгоритм для Робота. Предлагаю начать с простого — нарисуем квадрат со стороной 3 клетки. Поехали!
Запускаем Кумир, настраиваем его. Можно начинать писать программу? Конечно нет! Мы же не задали стартовую обстановку! Делаем это. Предлагаю использовать вот такую:
Вот теперь все готово. Начинаем писать программу. Пока она выглядит так
Предлагаю рисовать квадрат, двигаясь по часовой стрелке. Для начала закрасим текущую клетку, дав команду закрасить. Потом делаем шаг вправо и опять закрашиваем клетку. И еще раз шаг вправо и закрасить.
Попробуем запустить программу и посмотреть что же получилось. Для запуска нажимаем F9 или же кнопку на панели инструментов
В результате мы должны увидеть вот такую картину
Теперь мы будем двигаться вниз и закрашивать правую сторону квадрата:
Потом пойдем влево, закрашивая нижнюю границу квадрата
У нас осталась одна не закрашенная клетка. Закрасим ее
Все готово! В итоге наша программа выглядит так:
использовать Робот
алг Квадрат
нач
закрасить
вправо
закрасить
вправо
закрасить
вниз
закрасить
вниз
закрасить
влево
закрасить
влево
закрасить
вверх
закрасить
кон
А результат ее работы вот так
Итак, сегодня мы с вами написали программу, используя простые команды Робота. Рекомендую попрактиковаться самостоятельно — придумать себе задание и написать программу. Это могут быть самые различные фигуры, узоры, буквы. К примеру, попробуйте написать программу, рисующую букву П, Р, Ш, Щ, М. А если получится и захотите поделиться — комментируйте и прикрепляйте результат к комментарию.
Исполнитель Робот. Циклы.
Итак, что такое цикл? Представьте, что мы находимся на уроке физической культуры и перед нами стоит задача сделать 7 приседаний. Это задание можно оформить в виде линейного алгоритма и тогда оно будет выглядеть примерно так:
То есть мы повторили команду сделай приседание 7 раз. А есть ли смысл писать 7 одинаковых команд? Может проще дать команду сделай 7 приседаний? Конечно проще и правильнее. Это и есть цикл. Вы можете сами вспомнить примеры циклов из жизни — их довольно много.
Таким образом линейный алгоритм, где повторяются одни и те же команды мы можем оформить в виде циклического алгоритма — примерно так:
Вот так, на придуманном нами языке мы оформили цикл. У исполнителя Робот тоже есть возможность записывать циклы. Причем, циклы бывают разные. Тот вариант, который мы только что рассмотрели называется цикл со счетчиком или цикл с параметром.
Виды циклов.
Цикл со счетчиком.
Цикл со счетчиком применяется когда заранее известно сколько повторений необходимо сделать. В примере выше с приседаниями именно такой случай.
Для того, чтобы написать цикл со счетчиком для исполнителя необходимо знать его синтаксис. А он такой:
Здесь мы должны указать количество повторений (число) и команды, которые будут повторяться. Команды, которые повторяются в цикле называют телом цикла.
Давайте рассмотрим это на примере.
Закрасим 7 клеток, как на рисунке. Рекомендую почитать про стартовую обстановку Робота и про его простые команды.
Изначально Робот находился в левой верхней клетке.
Давайте для начала решим задачу линейно. В этом случае мы будет закрашивать текущую клетку и перемещаться на 1 клетку вправо и программа будет выглядеть так:
использовать Робот
алг
нач
Как видим, команды закрасить и вправо повторяются 7 раз. Давайте теперь перепишем программу с использованием цикла. Кстати, чтобы вставить цикл в свою программу можно в меню Вставка выбрать пункт нц-раз-кц или нажать одну из комбинаций клавиш Esc, Р (русская буква Р) или Esc, H (латинская буква H). Причем клавиши надо нажимать последовательно — сначала Esc, отпустить ее и только потом Р или H.
Так вот, наша программа с циклом будет выглядеть так:
использовать Робот
Если мы ее запустим, то увидим, что в результате получится тоже самое — 7 закрашенных клеток. Однако программа стала короче и значительно грамотней с алгоритмической точки зрения!
В качестве разминки и закрепления предлагаю самостоятельно написать программу для Робота, которая нарисует квадрат со стороной 7 клеток. Естественно, используя цикл. Жду решения в комментариях.
Цикл с условием
Вернемся к физкультуре и изменим задачу. Ведь кто-то может и не сделать 7 приседаний, а другой способен сделать 27. Можно ли учесть это при создании цикла? Конечно. Только теперь мы будем использовать не счетчик (количество повторений), а условие. К примеру, пока не устал, делай приседания. В этом случае человек будет делать не конкретное число приседаний, а приседать до тех пор, пока не устанет. И наш цикл на абстрактном языке примет такой вид:
пока не устал
Слова не устал в нашем случае — это условие. Когда оно истинно, цикл выполняется. Если же оно ложно (устал) тело цикла не будет выполнено. У исполнителя Робот есть несколько условий
сверху свободно
снизу свободно
слева свободно
справа свободно
сверху стена
снизу стена
слева стена
справа стена
Теперь давайте решим следующую задачу для Робота — нарисовать вертикальную линию от левой до правой границы поля использую цикл с условием. Изначально Робот находится в левом верхнем углу.
Давайте сначала сформулируем словесный алгоритм — т. е. опишем словами что нужно делать Роботу. Этот алгоритм будет звучать примерно так:
В результате Робот пробежит по всем клеткам вправо и будет их закрашивать до тех пор, пока справа не окажется стена.
Исходный код нашей программы для Робота будет примерно такой:
использовать Робот
нц пока справа свободно
В результате выполнения этой программы мы увидим вот такую картину:
Как видим, не хватает только закрашенной первой клетки. Для этого перед циклом необходимо выполнить команду закрасить.
Для закрепления прошу написать программу, которая будет делать рамку вокруг рабочего поля Робота независимо от его размера. Конечно же с использованием циклов с условием. В итоге должно получиться так:
Читайте также: