Использование рекурсии в графике

Тип работы:
Творческая работа
Предмет:
Программирование


Узнать стоимость

Детальная информация о работе

Выдержка из работы

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ ГОСУДАРСТВЕННОЕ УЧРЕЖДЕНИЕ ОБРАЗОВАНИЯ «СРЕДНЯЯ ШКОЛА № 1 г. ПИНСКА»

НАУЧНО-ИССЛЕДОВАТЕЛЬСКАЯ РАБОТА ПО ИНФОРМАТИКЕ

ТЕМА: ИСПОЛЬЗОВАНИЕ РЕКУРСИИ В ГРАФИКЕ

Выполнила:

Селюжицкая Юлия Васильевна

Класс 11 «А»

Научный руководитель:

Трушевич Елена Жоржевна, учитель информатики

г. Пинск 2013 год

Оглавление

  • Введение
  • 1. Использование рекурсии в различных предметных областях
  • 2. Рекурсия в программировании
  • 3. Использование рекурсии в графике
  • 4. Решение задач
  • Заключение
  • Список использованной литературы
  • Приложения

Введение

Как герой Мольера не знал, что он разговаривает прозой, так и мы зачастую не знаем, что пользуемся рекурсией.

В жизни нам не раз приходилось сталкиваться с рекурсией. Вспомнить хотя бы стихотворение «У попа была собака» или «10 негритят пошли купаться в море…». Или то, как, сидя в поезде, ловим свое отражение в зеркале, которое отражается в зеркале напротив, которое отражается в зеркале напротив…

Слово «рекурсия» происходит от латинского слова «recursio» — возвращение.

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

Рекурсия часто используется в графике, что позволяет получить интересные результаты.

Объектом моего исследования стала рекурсия, предметом исследования — создание алгоритмов для рисования графических изображений с использованием рекурсии.

Цель работы: изучить алгоритмы построения изображений с использованием рекурсии.

Задачи работы:

· проанализировать и проработать литературу по теме исследования;

· изучить алгоритмы построения графических изображений с использованием рекурсии;

· написать алгоритмы построения графических изображений в среде программирования Pascal ABC;

Моя работа состоит из двух глав:

1) теоретическая глава, которая знакомит с понятием рекурсии, применением ее в различных предметных областях; представлены рекурсивные алгоритмы построения графических изображений;

2) практическая глава, в которой представлено решение задач двумя способами: с использованием рекурсии и без нее.

Гипотеза: рекурсия упрощает программу при создании сложных графических объектов.

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

1. Использование рекурсии в различных предметных областях

Рекурсия в математике

Факториал целого неотрицательного числа n обозначается n! и определяется как n! =nЧ (n-1)! при n>0 и n! =1 при n=0

Практически все геометрические фракталы задаются в форме бесконечной рекурсии.

Рекурсия в физике

Классическим примером бесконечной рекурсии являются два поставленные друг напротив друга зеркала: в них образуются два коридора из затухающих отражений зеркал.

Другим примером бесконечной рекурсии является эффект самовозбуждения (положительной обратной связи) у электронных схем усиления, когда сигнал с выхода попадает на вход, усиливается, снова попадает на вход схемы и снова усиливается. Усилители, для которых такой режим работы является штатным, называются автогенераторы.

Рекурсия в языке и литературе

У Сергея Лукьяненко в повести «Царь, царевич, король, королевич…» есть эпизод, где персонажи листают повесть «Царь, царевич, король, королевич…», чтобы узнать будущее:

«Пока я размышлял, стоит ли принимать такие странные извинения, Кубатай полистал книжку и громко, выразительно прочитал: — «Пока я размышлял, стоит ли принимать такие странные извинения, Кубатай полистал книжку и громко, выразительно прочитал: — Пока я размышлял, стоит ли принимать такие странные извинения, Кубатай полистал книжку и громко, выразительно прочитал: — Пока я размышлял.» Быстрым движением Холмс выхватил у Кубатая томик. «

Нельзя не вспомнить сказку-песню «У попа была собака…». Здесь рекурсия ограничена объемом доступных ресурсов, то есть размером доски, на которой писал поп.

«У попа была собака, он её любил,

Она съела кусок мяса, он её убил,

В землю закопал,

Надпись написал:

У попа была собака, он её любил,

Она съела кусок мяса, он её убил,

В землю закопал,

Надпись написал. «

Рекурсия в сюжете

Первым романом, удивившим читателей приемом рекурсии, был «Дон Кихот». Сервантес все время пытался смешивать два мира: мир читателя и мир книги. У Сервантеса главный процесс не просто книга, но книга плюс читатель. В шестой главе цирюльник, осматривая библиотеку Дон Кихота, находит книгу Сервантеса и высказывает суждения о писателе. Вымысел Сервантеса рассуждает о нем. В начале девятой главы сообщается, что роман переведен с арабского и что Сервантес купил его на рынке. Наконец, во второй части романа персонажи уже прочли первую часть.

Элементы использования рекурсии находим еще раньше у Шекспира. Гамлет ставит спектакль, где в упрощенном варианте описываются события трагедии.

«Мастер и Маргарита» — один из наиболее ярких рекурсивных романов. Развивается одна алгоритмическая схема, используемая в разных процессах: Мастер и Маргарита, Иешуа и Пилат, Воланд и компания. Тема Иешуа и Пилата рекурсивно вызывается из темы Мастера и Маргариты. Кроме того, здесь так же используется прием «книга в книге». Мастер пишет роман об Иешуа и Пилате, текст которого сливается с текстом книги «Мастер и Маргарита».

«Сто лет одиночества» Г. Маркеса. Рекурсивно повторяются события поколений семейства Буэндиа. Последний из рода Буэндиа заканчивает расшифровывать рукопись волшебника Мелькиадеса, которая оказывается тем же описанием «Ста лет одиночества». По мере прочтения поднимается и нарастает ураган. Прочитывается последняя страница, книга заканчивается, и все исчезает в бушующем смерче.

С рекурсией, возможно, связана еще одна неясная медицинская проблема, получившая название «синдром Стендаля». Французский писатель Стендаль путешествовал по Италии.

Во Флоренции, рассматривая картины художников эпохи Возрождения, он внезапно потерял сознание. В наше время аналогичные случаи встречаются все чаще у посетителей флорентийских музеев. Возможно следующее объяснение. Живопись итальянского Ренессанса началась с картин флорентийца Джотто, который первым применил перспективу и тем самым стал создавать объемные изображения.

Перспектива — это тоже рекурсивная схема. Художник мысленно делит пространство на срезы и для каждого применяет одну и ту же процедуру плоского нанесения на поверхность картины, но с коэффициентом уменьшения. Искусство Джотто продолжили флорентийские мастера.

В картинах Гирландайо, Боттичелли, Козимо Медичи для подчеркивания перспективы появляются повторяющиеся и резко уменьшающиеся ступени лестниц, деревья, арки, фигуры. Часто изображаются окна или открытые двери, за которыми открывается своя картина, а в ней возможна другая.

Представим ощущения зрителя в музее. Погружаешься в давние времена, в картины, в детали картин, детали деталей.

Следишь взглядом за повторяющимися ступенями древнего замка, арками и колоннами храмов, фигурами людей. Рассматриваешь детали переднего плана и тут же видишь другие детали заднего плана.

Сознание рекурсивно качается туда и сюда, туда — глубину — и обратно, туда и обратно, туда. В какой-то момент действительность перестает существовать, и где-то в мозге недремлющий страж сознания вызывает спасительный шок.

Рекурсия в изобразительном искусстве

Эффект Дросте — термин для изображения специфического вида рекурсивного изображения. Изображение включает уменьшенный собственный вариант самого себя. Этот более малый вариант после этого показывает даже более малый вариант себя, и так далее. Практически это продолжается пока разрешение изображения позволяет уменьшает размер. Термин был введен в честь Дросте, голландского какао (Приложение 1).

Рекурсия продемонстрирована в Print Gallery Эшера (нидерландский художник-график). В этой известной работе молодой человек осматривает картину. На картине изображен среднеземноморский порт. Картина нарисована с использованием некоторой эллиптической кривой, так, что одно из зданий в картине, которое является галерей, в то же самое время формирует окружение галереи. Мауриц Эшер (нидерландский художник-график) не смог нарисовать место, где галерея в картине сливается с реальной галереей и поэтому нарисовал белую заплату в середине, которая содержит вензель Эшер и подпись. В это центральной точке должна появиться была проявиться рекурсия картины (Приложение 2).

Математики Де Смит и Ленстра из Лейденского университета разрешили математически проблему и реконструировали картину для того, чтобы заменить белую заплату.

Мауриц Эшер часто эксплуатировал в творчестве рекурсии (Приложение 3).

Рекурсия в искусстве

В приложение 4 представлены несколько интересных работ неизвестных авторов с использованием эффекта рекурсии.

Рекурсия в кино и мультипликации

В фильме «12 друзей Оушена» представлен интересный пример рекурсии: Джулия Робертс сыграла героиню, которая по сюжету фильма некоторое время играла Джулию Робертс.

В фильме «Адаптация», поставленном по сценарию Чарли Кауфмана, Чарли Кауфман пишет сценарий про то, как Чарли Кауфман пишет сценарий.

В одной из серий киножурнала «Ералаш» есть эпизод, где мальчик сломя голову мчится домой к телевизору, сметая всё на своём пути, чтобы посмотреть всё тот же киножурнал «Ералаш».

Австралийская певица Кайли Миноуг использовала рекурсию в своем клипе «Come Into My World.

2. Рекурсия в программировании

Рекурсия — это такой способ организации подпрограммы (процедуры или функции), при котором эта подпрограмма в ходе выполнения ее операторов обращается сама к себе.

Рекурсивные процедуры и функции просты, наглядны и компактны. Однако рекурсивные процедуры и функции требуют большого размера оперативной памяти во время выполнения, чем нерекурсивные.

Различают прямую и косвенную рекурсии.

При прямой рекурсии процедура содержит оператор обращения к самой себе: А > А (рис. 1).

/

Рис. 1. Прямая рекурсия

При косвенной рекурсии одна процедура вызывает другую, которая сама либо посредством других процедур вызывает исходную процедуру: А > В > А (рис. 2).

/

Рис. 2. Косвенная рекурсия

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

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

Порождение все новых копий рекурсивной подпрограммы до выхода на граничное условие называется рекурсивным спуском. Максимальное количество копий рекурсивной подпрограммы, которое одновременно может находиться в памяти компьютера, называется глубиной рекурсии. Число рекурсивных вызовов в каждый конкретный момент времени, называется текущим уровнем рекурсии. Завершение работы рекурсивных подпрограмм, вплоть до самой первой, инициировавшей рекурсивные вызовы, называется рекурсивным подъемом.

Существуют три разных формы рекурсивных подпрограмм:

1) Форма с выполнением действий до рекурсивного вызова (с выполнением действий на рекурсивном спуске).

procedure рекурсия;

begin

Действия на входе в рекурсию;

if условие then рекурсия;

end;

2) Форма с выполнением действий после рекурсивного вызова (с выполнением действий на рекурсивном возврате).

procedure рекурсия;

begin

if условие then рекурсия;

Действия на выходе в рекурсию;

end;

3) Форма с выполнением действий как до, так и после рекурсивного вызова (с выполнением действий как на рекурсивном спуске так и на рекурсивном возврате.

Procedure Рекурсия;

Begin

Действия на входе в рекурсию;

If Условия then Рекурсия;

Действия на выходе из рекурсии;

End;

Рекурсию следует применять тогда, когда алгоритм с применением рекурсии значительно упрощает программу.

3. Использование рекурсии в графике

Рекурсия часто используется в графике. Рассмотрим некоторые примеры.

а) Канторово множество

Множество Кантора придумал Георг Кантор — один из основателей теории множеств. На Западе подобные множества иногда называют пылью.

Рис. 3. Канторово множество

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

Алгоритм рисования «множества Кантора»:

1. построить большой квадрат, внутреннюю часть которого закрасим каким-либо цветом;

2. на его вершинах, как на центрах рисуются квадраты, в четыре раза меньшие первоначального;

3. это повторяется для каждого оставшегося квадрата (n), причем бoльшие квадраты перекрывают меньшие.

/

/

/

Рис. 4. Построение множества Кантора

Программа приведена в Приложение 5.

б) Треугольник Серпинского

В 1915 году польский математик Вацлав Серпинский придумал занимательный объект, известный как решето Серпинского. Этот треугольник один из самых ранних известных примеров фракталов. Существует несколько способов построения этого фрактала. Треугольник Серпинского также называют салфеткой Серпинского.

Рис. 5. Треугольник Серпинского

Алгоритм построения треугольника Серпинского довольно прост:

1. строится большой внешний треугольник (А);

2. строится треугольник, получающийся при соединении середин сторон большого треугольника (Б);

3. строятся треугольники, получающиеся аналогично элементу Б, но в качестве большого треугольника берутся треугольники, образованные элементами, А и Б.

/

/

/

/

Рис. 6. Построение треугольника Серпинского

Программа приведена в Приложение 6.

в) Дерево Пифагора

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

Рис. 7. Дерево Пифагора

Алгоритм построения дерева Пифагора:

1. построить квадрат;

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

3. к каждому катету добавить по 3 отрезка так, чтобы получился квадрат. Потом всё повторяем для каждого квадрата.

/

/

/

/

Рис. 8. Построение дерева Пифагора

Программа приведена в Приложение 7.

г) Кривая Дракона

Кривая дракона впервые была описана в популярной литературе в журнале Scientific American в 1967 году. Заметка о ней появилась в колонке «Математические игры», которую вел Мартин Гарднер. Первоначально использовалось полное название кривой — «дракон Хартер — Хейтуэя», которое ей дал основатель компьютерной фрактальной геометрии Бенуа Мандельброт, именем которого названо знаменитое множество. В дальнейшем стали говорить просто о кривой дракона. Приведем описание алгоритма построение кривой, близкое к тому, которое использовалось Мартином Гарднером.

Рис. 9. Кривая Дракона

а) б) в) г)

Рис. 10. Построение кривой Дракона

рекурсия графика программирование алгоритм

Рассмотрим горизонтальный отрезок как кривую дракона нулевого порядка. Разделим отрезок пополам и построим на нем прямой угол, как показано на рисунке 10 а). Получим кривую дракона первого порядка.

На сторонах прямого угла снова построим прямые углы (рис. 10 б).

При этом вершина первого угла всегда находится справа, если смотреть из точки A (начала кривой) вдоль первого отрезка кривой, а направления, в которых строятся вершины остальных углов, чередуются. На рисунке 10 в) и 10 г) показаны кривые дракона третьего и четвертого порядков соответственно.

Программа приведена в Приложение 8.

д) Снежинка

Рис. 11. Снежинка

Алгоритм построения снежинки (n — количество звеньев снежинки, p — количество ветвей снежинки, l — длину (в точках) ветви внутреннего звена, t — коэффициент уменьшения каждого звена):

1. центр снежинки расположить в центре экрана монитора;

2. начать рисовать из центра снежинки: нарисовать первый (длины l) отрезок, далее, если это не последнее звено, то рисуем отрезок длины l*t следующего звена, и так до тех пор, пока не нарисуем отрезок последнего звена (l*t, n-1);

3. на последнем звене дорисовать самую маленькую снежинку;

4. вернуться на предпоследний отрезок и дорисовать самое маленькое звено со снежинкой;

5. продолжать до тех пор, пока не нарисуется вся снежинка.

Программа приведена в Приложение 9.

4. Решение задач

Задача 1. Напишите программу построения изображения, представленного на рисунке 12.

Рис. 12

Задача 2. Напишите программу построения изображения, представленного на рисунке 13.

Рис. 13

Задача 3. Напишите программу построения изображения, представленного на рисунке 14.

Рис. 14

Задача 4. Напишите программу построения изображения, представленного на рисунке 15.

Рис. 15

Задача 5. Напишите программу построения изображения, представленного на рисунке 16.

Рис. 16

Задача 6. Напишите программу построения изображения, представленного на рисунке 17.

Рис. 17

Задача 7. Напишите программу построения изображения, представленного на рисунке 18.

Рис. 18

Задача 8. Напишите программу построения изображения, представленного на рисунке 19.

Рис. 19.

Задача 9. Напишите программу построения изображения, представленного на рисунке 20.

Рис. 20

Решения задач приведены в Приложение 10.

Заключение

В ходе научно-исследовательской работы мы рассмотрели следующие теоретические вопросы:

1. рекурсия в различных предметных областях;

2. рекурсия в программировании;

3. использование рекурсии в графике.

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

В практической части я реализовала алгоритмы построения нескольких изображений в системе программирования Pascal ABC, сравнив программы, написанные с использованием рекурсии и без нее. В результате чего убедилась, что при создании сложных графических объектов использование рекурсии может сделать программу более компактной, красивой и читабельной. Конечно, многие задачи, которые решаются при помощи рекурсии можно решить и при помощи циклов. Однако есть и задачи, которые решаются только при помощи рекурсии или их решение другим способом значительно сложнее.

В процессе исследования была проделана следующая работа:

1. Проанализирована и проработана литература по теме исследования.

2. Рассмотрены и изучены алгоритмы построения графических изображений с использованием рекурсии.

3. Составлены программы построения графических изображений двумя способами: с использованием рекурсии и без нее.

В своём исследовании использовала следующие методы:

· изучение литературы, обработка данных;

· анализ и синтез собранных данных;

· реализация алгоритмов создания графических изображений.

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

Лично для меня изучение темы «Использование рекурсии в графике» оказалось очень интересным. В процессе исследования я сама для себя сделала массу новых открытий, связанных не только с темой проекта, но и с окружающим миром в целом.

Я могу сказать, что всё из того, что было задумано, удалось. Мной достигнуты все поставленные цели. Мне бы хотелось в дальнейшем изучить другие методы и способы создания компьютерной графики.

Список использованной литературы

1. Златопольский Д. М. Замечательные кривые /. — -М.: Чистые пруды, 2008. — 32 с. (Библиотека «Первое сентября», серия «Информатика», Вып. 23).

2. Павловский А. И., Пупцев А. Е., Гращенко П. Л. Информатика: Учеб. пособие для 10-го кл. с углубл. изучением информатики общеобразоват. шк. с рус. яз. обучения. — Мн.: Нар. асвета, 2000. — 223 с.: ил.

3. Паволоцкий А. В. Геометрические фракталы и L-системы. Информатика // № 20, с. 12. — М.: Чистые пруды, 2010. — 32 с.

ИНТЕРНЕТ-ИСТОЧНИКИ

4. Фестиваль педагогических идей «Открытый урок». Изучение темы «Рекурсивные графические алгоритмы». Лусникова Е. С. http: //festival. 1september. ru/articles/420 024/

5. Уроки, справочники, рефераты. Рекурсия в Паскале. Батракова Л. В. http: //do. gendocs. ru/docs/index-282 821. html

6. Основы программирования на PascalABC. Рекурсия. http: //pascalabc2012. narod2. ru/Rekyrsia. htm

7. Программирование. Рекурсия Pascal-Паскаль. http: //www. pascal. helpov. net/index/recursion_pascal_programming

8. Чеховская школа программирования. Рекурсия. http: //progshkola. ru/tag/rekursiya

9. Использование рекурсии в графике. http: //www. web-pascal. narod. ru/stat/recurs. htm

10. Виртуальный учебник TurboPascal 7.0. http: //dezavarzin. narod. ru/4.6 htm

11. Рекурсия для чайников. http: //botinok. co. il/node/29 842

12. Рекурсия и рекурсивные алгоритмы. Персональная страничка Диканева Т. В. http: //www. tvd-home. ru/recursion

13. Антология сетевого фольклора. Рекурсия. http: //www. netlore. ru/recursion

Приложения

Приложение 1

Приложение 2

Приложение 3

Приложение 4

Приложение 5

ПРИМЕР РЕКУРСИВНОЙ ПРОГРАММЫ «КАНТОРОВО МНОЖЕСТВО»

program mnogestvo_Kantora;

uses crt, graphabc;

var n: integer;

procedure kvadrat (x, y, n: integer; size: word);

var s: word;

begin

if n-1>0 then

begin

s: = size div 2;

kvadrat (x-size, y+size, n-1, s);

kvadrat (x-size, y-size, n-1, s);

kvadrat (x+size, y+size, n-1, s);

kvadrat (x+size, y-size, n-1, s);

end;

rectangle (x-size, y-size, x+size, y+size);

end;

BEGIN

setwindowsize (800, 800);

read (n);

kvadrat (400, 400, n, 100);

END.

На рисунке представлено изображение, состоящее из четырех уровней, а данная программа позволяет рисовать изображение в зависимости от введённого пользователем n уровней.

Приложение 6

ПРИМЕР РЕКУРСИВНОЙ ПРОГРАММЫ «ТРЕУГОЛЬНИК СЕРПИНСКОГО»

program treugol_Serpinskogo;

uses crt, graphabc;

var x1, y1, x2, y2, x3, y3, a, b, n: integer;

procedure tri (x1, y1, x2, y2, x3, y3, N: integer);

var x12, y12, x23, y23, x31, y31: integer;

begin

If N< >0 then

begin

x12: = (x1+x2) div 2; y12: = (y1+y2) div 2;

x23: = (x2+x3) div 2; y23: = (y2+y3) div 2;

x31: = (x3+x1) div 2; y31: = (y3+y1) div 2;

moveto (x31, y31);

lineto (x12, y12);

lineto (x23, y23);

lineto (x31, y31);

tri (x1, y1, x12, y12, x31, y31, N-1);

tri (x2, y2, x12, y12, x23, y23, N-1);

tri (x3, y3, x31, y31, x23, y23, N-1)

end;

end;

BEGIN

setwindowsize (800, 600);

readln (n);

x1: =350; y1: =30;

x2: =669; y2: =509;

x3: =30; y3: =509;

moveto (x1, y1);

lineto (x2, y2);

lineto (x3, y3);

lineto (x1, y1);

tri (x1, y1, x2, y2, x3, y3, n);

END.

На рисунке представлено изображение, состоящее из шести уровней, а данная программа позволяет рисовать изображение в зависимости от введённого пользователем n уровней.

Приложение 7

ПРИМЕР РЕКУРСИВНОЙ ПРОГРАММЫ «ДЕРЕВО ПИФАГОРА»

program derevo_Pifagora;

uses crt, graphabc;

var n: integer;

procedure draw (x, y, l, a: real);

procedure rect (x1, y1, l: integer; a1: real);

begin

moveto (x1, y1);

lineto (x1 + round (l * cos (a1)), y1 — round (l * sin (a1)));

lineto (x1 + round (l * sqrt (2) * cos (a1 + pi/4)),

y1 — round (l * sqrt (2) * sin (a1 + pi/4)));

lineto (x1 + round (l * cos (a1 + pi/2)), y1 — round (l * sin (a1 + pi/2)));

lineto (x1, y1);

end;

begin

if l > 4 then

begin

rect (round (x), round (y), round (l), a);

draw (x — l*sin (a), y — l * cos (a), l / sqrt (2), a + pi / 4);

draw (x — l * sin (a) + l / sqrt (2) * cos (a + pi/4),

y — l * cos (a) — l / sqrt (2) * sin (a + pi/4), l / sqrt (2), a — pi/4);

end;

end;

BEGIN

setwindowsize (670,500);

read (n);

draw (280, 460, n, 0);

END.

На рисунке представлено изображение, состоящее из ста уровней, а данная программа позволяет рисовать изображение в зависимости от введённого пользователем n уровней.

Приложение 8

ПРИМЕР РЕКУРСИВНОЙ ПРОГРАММЫ «КРИВАЯ ДРАКОНА»

program drakon;

uses crt, graphabc;

var k, d, m: integer;

procedure ris (x1, y1, x2, y2, k: integer);

var xn, yn: integer;

begin

if k > 0 then

begin

xn: = (x1 + x2) div 2 — (y2 — y1) div 2;

yn: = (y1 + y2) div 2 + (x2 — x1) div 2;

ris (x1, y1, xn, yn, k-1);

ris (x2, y2, xn, yn, k-1);

end

else begin line (x1,y1,x2,y2); end;

end;

BEGIN

readln (k);

ris (200, 100, 400, 300, k);

END.

На рисунке представлено изображение, состоящее из двадцати уровней, а данная программа позволяет рисовать изображение в зависимости от введённого пользователем n уровней.

Приложение 9

ПРИМЕР РЕКУРСИВНОЙ ПРОГРАММЫ ПОСТРОЕНИЯ СНЕЖИНКИ

program sneginka;

uses crt, graphabc;

var n, p: integer;

t: real;

procedure snow (x, y: integer; l: real; k: integer);

var x1, y1, i: integer;

begin

if k = 0 then exit;

for i: =1 to 6 do

begin

x1: =trunc (x + l * cos (2*pi* (i-1) /6));

y1: =trunc (y + l * sin (2*pi* (i-1) /6));

line (x, y, x1, y1);

snow (x1, y1, l*t, k-1);

end;

end;

BEGIN

setwindowsize (1000, 1000);

read (n);

t: =0. 25;

snow (400, 400, 200, n);

END.

На рисунке изображена снежинка, состоящая из 3 звеньев и 6 ветвей, а данная программа позволяет рисовать изображение в зависимости от введённого пользователем n уровней (звеньев).

Приложение 10

ПОСТРОЕНИЕ ИЗОБРАЖЕНИЙ В СИСТЕМЕ ПРОГРАММИРОВАНИЯ PASCAL ABC

Задача 1

Пример рекурсивной программы

program zadacha1;

uses crt, graphabc;

var n, r: integer;

procedure krug (x, y, r, n: integer);

var k: real; p: integer;

begin

circle (x, y, r); k: =0. 3;

if n=1 then exit;

krug (x-2*r, y, round (k*r), n-1);

krug (x+2*r, y, round (k*r), n-1);

krug (x, y-2*r, round (k*r), n-1);

krug (x, y+2*r, round (k*r), n-1);

end;

BEGIN

setwindowsize (800, 800);

readln (n);

krug (400, 400, 120, n);

END.

Данная программа позволяет рисовать изображение в зависимости от введённого пользователем n уровней.

n=2n=3

n=4 n=5

Пример программы с использованием циклов

program zadacha1;

uses crt, graphabc;

var x, y, r, x1, y1, r1, x2, y2, r2, x3, y3, r3: integer;

a, k: real; i, j, f: integer;

BEGIN

setwindowsize (800, 800);

x: =400; y: =400; r: =120; k: =0. 3;

circle (x, y, r); r1: =round (k*r);

r2: =round (k*r1); r3: =round (k*r2);

for i: =1 to 4 do

begin

x1: =x+ round (2*r*cos (a));

y1: =y+ round (2*r*sin (a));

circle (x1, y1, r1);

for j: =1 to 4 do

begin

x2: =x1+ round (2*r1*cos (a));

y2: =y1+ round (2*r1*sin (a));

circle (x2, y2, r2);

for f: =1 to 4 do

begin

x3: =x2+ round (2*r2*cos (a));

y3: =y2+ round (2*r2*sin (a));

circle (x3, y3, r3);

a: =a+pi/2;

end;

a: =a+pi/2;

end;

a: =a+pi/2;

end;

END.

Программа рисует такое же изображение, как и рекурсивная при n= 4.

Задача 2.

Пример рекурсивной программы

program zadacha2;

uses crt, graphabc;

var r, n: integer;

procedure krug (x, y, r, n: integer);

begin

circle (x, y, r);

if n=1 then exit;

krug (x-r, y, r div 2, n-1);

krug (x+r, y, r div 2, n-1);

krug (x, y-r, r div 2, n-1);

krug (x, y+r, r div 2, n-1);

end;

BEGIN

setwindowsize (800,800);

read (n);

setbrushstyle (bsclear);

krug (400, 400, 100, n);

END.

Данная программа позволяет рисовать изображение в зависимости от введённого пользователем n уровней.

n=2 n=3

n=4 n=5

Пример программы с использованием циклов

program zadacha2;

uses crt, graphabc;

var x, y, r, x1, y1, r1, x2, y2, r2: integer;

i, j: integer; a: real;

BEGIN

setwindowsize (800,800);

setbrushstyle (bsclear);

x: =400; y: =400; r: =100;

circle (x, y, r);

r1: =r div 2;

r2: =r1 div 2;

for i: =1 to 4 do

begin

x1: =x+ round (r*cos (a));

y1: =y+ round (r*sin (a));

circle (x1, y1, r1);

for j: =1 to 4 do

begin

x2: =x1+ round (r1*cos (a));

y2: =y1+ round (r1*sin (a));

circle (x2, y2, r2);

a: =a+pi/2;

end;

a: =a+pi/2;

end

END.

Программа рисует такое же изображение, как и рекурсивная при n= 3.

Задача 3.

Пример рекурсивной программы

program zadacha3;

uses crt, graphabc;

var r, n: integer;

procedure krug (x, y, r, n: integer);

var k: real;

begin

circle (x, y, r);

k: =0. 35;

if n=1 then exit;

krug (x+round (1. 9*r), y, round (k*r), n-1);

krug (x-round (1. 9*r), y, round (k*r), n-1);

krug (x+r, y+round (1. 8*r), round (k*r), n-1);

krug (x-r, y-round (1. 8*r), round (k*r), n-1);

krug (x+r, y-round (1. 8*r), round (k*r), n-1);

krug (x-r, y+round (1. 8*r), round (k*r), n-1);

end;

BEGIN

setwindowsize (800, 800);

readln (n);

krug (400, 400, 100, n);

END.

Данная программа позволяет рисовать изображение в зависимости от введённого пользователем n уровней.

n=2 n=3

n=4 n=5

Пример программы с использованием циклов

program zadacha3;

uses crt, graphabc;

var x, y, r, x1, y1, r1, x2, y2, r2, x3, y3, r3: integer;

i, j, f: integer; q, k, a: real;

BEGIN

setwindowsize (800, 800);

q: =1. 9; k: =0. 35;

x: =400; y: =400; r: =100;

circle (x, y, r);

r1: =round (k*r);

r2: =round (k*r1);

r3: =round (k*r2);

for i: =1 to 6 do

begin

x1: =x+ round (q*r* cos (a));

y1: =y+ round (q*r* sin (a));

circle (x1, y1, r1);

for j: =1 to 6 do

begin

x2: =x1+ round (q*r1* cos (a));

y2: =y1+ round (q*r1* sin (a));

circle (x2, y2, r2);

for f: =1 to 6 do

begin

x3: =x2+ round (q*r2* cos (a));

y3: =y2+ round (q*r2* sin (a));

circle (x3, y3, r3);

a: =a+pi/3;

end;

a: =a+pi/3;

end;

a: =a+pi/3;

end;

END.

Программа рисует такое же изображение, как и рекурсивная при n= 4.

Задача 4.

Пример рекурсивной программы

program zadacha4;

uses crt, graphabc;

var dx, dy, n: integer;

procedure otrezok (l, ug, n: integer);

begin

dx: =dx+round (l*cos (ug*pi/180));

dy: =dy+round (l*sin (ug*pi/180));

lineto (dx, dy);

if n=1 then exit;

otrezok (l+20, ug+90, n-1);

end;

BEGIN

setwindowsize (800, 800);

readln (n);

moveto (380, 400);

dx: =400; dy: =400;

otrezok (20, 0, n);

END.

Данная программа позволяет рисовать изображение в зависимости от введённого пользователем n уровней. Если в процедуре к переменной ug (угол поворота прямой) добавлять другую градусную меру, то можно получить дополнительные интересные изображения.

n=2 n=4

n=8 n=16

Пример программы с циклом

program zadacha4;

uses crt, graphabc;

var x, y, I, v, a, n: integer;

BEGIN

setwindowsize (500, 500);

readln (n);

x: =250; y: =250;

a: =20;

moveto (x, y);

for i: =1 to 2*n do

if i mod 2 = 1 then

begin

x: =x+i*a;

lineto (x, y);

y: =y+i*a;

lineto (x, y);

x: =x- (i+1) *a;

lineto (x, y);

y: =y- (i+1) *a;

lineto (x, y);

end;

END.

Программа позволяет рисовать изображение в зависимости от введённого пользователем n — один виток спирали.

n=1 n=2

n=4 n=16

Задача 5.

Пример рекурсивной программы

program zadach5;

uses crt, graphabc;

var n: integer;

procedure tr (xa, ya, xb, yb, xc, yc, xd, yd, n: integer);

var x1, x2, x3, x4, y1, y2, y3, y4: integer;

begin

if n>0 then begin

x1: = (xa+xb) div 2; y1: = (ya+yb) div 2;

x2: = (xb+xc) div 2; y2: = (yb+yc) div 2;

x3: = (xc+xd) div 2; y3: = (yc+yd) div 2;

x4: = (xa+xd) div 2; y4: = (ya+yd) div 2;

line (x1, y1, x2, y2); line (x2, y2, x3, y3);

line (x3, y3, x4, y4); line (x4, y4, x1, y1);

tr (x1, y1, x2, y2, x3, y3, x4, y4, n-1);

end;

end;

BEGIN

setwindowsize (500,500);

read (n);

tr (0, 50, 50, 0, 800, 50, 50, 800, n);

END.

Данная программа позволяет рисовать изображение в зависимости от введённого пользователем n уровней.

n=2 n=5

n=8 n=13

Пример программы с циклом

program zadach5;

uses crt, graphabc;

var x0, y0, x1, y1, x2, y2, x3, y3, x4, y4: integer;

i, n: integer;

BEGIN

setwindowsize (500,500);

read (n);

x1: =0; y1: =50;

x2: =50; y2: =0;

x3: =800; y3: =50;

x4: =50; y4: =800;

x0: =0; y0: =50;

for i: = 1 to n do

begin

x1: = (x1+x2) div 2; y1: = (y1+y2) div 2;

x2: = (x2+x3) div 2; y2: = (y2+y3) div 2;

x3: = (x3+x4) div 2; y3: = (y3+y4) div 2;

x4: = (x0+x4) div 2; y4: = (y0+y4) div 2;

line (x1, y1, x2, y2);

line (x2, y2, x3, y3);

line (x3, y3, x4, y4);

line (x4, y4, x1, y1);

x0: =x1; y0: =y1;

end;

END.

Программа так же как и рекурсивная позволяет рисовать изображение в зависимости от введённого пользователем n уровней.

Задача 6.

Пример рекурсивной программы

program zadacha6;

uses crt, graphabc;

var n: integer; m: real;

procedure vetka (x, y, l, n: integer; a: real);

const b=5*pi/6;

var x0, y0: integer;

begin

if n+1< >0 then

begin

moveto (x, y);

x: =x+round (l*cos (a));

y: =y+round (l*sin (a));

lineto (x, y);

vetka (x, y, round (l*m), n-1, a-b/2);

vetka (x, y, round (l*m), n-1, a+b/2);

vetka (x, y, round (l*m), n-1, a);

end;

end;

BEGIN

setwindowsize (800, 600);

readln (n);

m: =0. 6;

vetka (300, 450, 150, n, — pi/2);

END.

Данная программа позволяет рисовать изображение в зависимости от введённого пользователем n уровней.

n=1 n=2

n=3 n=10

Пример программы с использованием циклов

program zadacha6;

uses graphabc;

const b=5*pi/6;

var x, y, x1, y1, dx1, dy1, dx2, dy2, n: integer;

dl, dl1, i, j: integer; m, a, a1, a2, c, c1: real;

BEGIN

setwindowsize (800, 600);

dl: =150; a: =-pi/2; m: =0. 6;

x1: =300; y1: =450;

x: =300; y: =300;

moveto (x1, y1);

lineto (x, y);

dl: =round (dl*m);

dl1: =round (dl*m);

for i: =1 to n do

begin

moveto (x, y);

a1: =a+ (b/2) *cos (c);

dx1: =x+round (dl*cos (a1));

dy1: =y+round (dl*sin (a1));

lineto (dx1, dy1);

for j: =1 to n do begin

moveto (dx1, dy1);

a2: =a1+ (b/2) *cos (c1);

dx2: =dx1+round (dl1*cos (a2));

dy2: =dy1+round (dl1*sin (a2));

lineto (dx2, dy2);

c1: =c1+pi/2;

end;

c: =c+pi/2; c1: =0;

end;

END.

Программа рисует такое же изображение, как и рекурсивная при n= 3.

Задача 7.

Пример рекурсивной программы

program zadacha7;

uses crt, graphabc;

var k, n: integer;

procedure kvadr (x, y, k, n: integer);

begin

rectangle (x, y, x+k, y+k);

if n=1 then exit;

kvadr (x+k div 3, y-k div 3, k div 3, n-1);

kvadr (x+k, y+k div 3, k div 3, n-1);

kvadr (x-k div 3, y+k div 3, k div 3, n-1);

kvadr (x+k div 3, y+k, k div 3, n-1);

end;

BEGIN

setwindowsize (800, 800);

read (n);

kvadr (250, 250, 300, n);

END.

Данная программа позволяет рисовать изображение в зависимости от введённого пользователем n уровней.

n=2 n=3

n=4 n=5

Пример программы с использованием циклов

program zadacha7;

uses crt, graphabc;

var x, y, x1, y1, x2, y2, x3, y3, x4, y4, k, k1, k2, k3: integer;

i, j, f, dl: integer; a, a1, a2: real;

BEGIN

setwindowsize (800, 800);

x: =250; y: =250; k: =300;

rectangle (x, y, x+k, y+k);

x1: =350; y1: =350;

k1: = k div 3;

k2: =k1 div 3;

k3: = k2 div 3;

dl: =33;

for i: =1 to 4 do

begin

x2: =x1+2*k1*round (cos (a));

y2: =y1+2*k1* round (sin (a));

rectangle (x2, y2, x2+k1, y2+k1);

for j: =1 to 4 do

begin

x3: =x2+2*k2*round (cos (a1)) +dl;

y3: =y2+2*k2*round (sin (a1)) +dl;

rectangle (x3, y3, x3+k2, y3+k2);

for f: =1 to 4 do

begin

x4: =x3+2*k3*round (cos (a2)) +dl div 3;

y4: =y3+2*k3* round (sin (a2)) +dl div 3;

rectangle (x4, y4, x4+k3, y4+k3);

a2: =a2+pi/2;

end;

a1: =a1+pi/2;

a2: =0

end;

a: =a+pi/2;

a1: =0;

end;

END.

Программа рисует такое же изображение, как и рекурсивная при n= 4.

Задача 8.

Пример рекурсивной программы

program zadacha8;

uses crt, graphabc;

var x, y, n, r, l: integer;

procedure okr (x, y: integer; r, l: real; n: integer);

var i, x1, y1: integer;

begin

for i: =1 to 8 do begin

x1: =trunc (x+l*cos (2*pi* (i-1) /8));

y1: =trunc (y+l*sin (2*pi* (i-1) /8));

circle (x1, y1, trunc ®); end;

if n=1 then exit;

okr (x, y, r*1. 5, l+r*2. 8, n-1);

end;

BEGIN

setwindowsize (1000,1000);

read (n);

okr (500, 500, 18, 50, n);

END.

Данная программа позволяет рисовать изображение в зависимости от введённого пользователем n уровней.

n=1 n=2

n=3 n=4

Пример программы с использованием циклов

program zadacha8;

uses crt, graphabc;

var x, y, r, x1, y1, r1, l, l1: integer;

i, j, n: integer; a: real;

BEGIN

setwindowsize (1000,1000);

read (n);

x: =500; y: =500; l: =50; r: =18;

for i: =1 to 8 do

begin r1: =18; l1: =50;

for j: =1 to n do

begin

x1: =round (x+ l1*cos (a));

y1: =round (y+ l1*sin (a));

circle (x1, y1, r1);

l1: =l1+round (r1*2. 8);

r1: =round (r1*1. 5);

end;

a: =a+pi/4;

end;

END.

Программа так же как и рекурсивная позволяет рисовать изображение в зависимости от введённого пользователем n уровней.

Задача 9.

Пример рекурсивной программы

program zadacha9;

uses crt, graphabc;

var n, dl: integer;

procedure figura (dx, dy, n: integer);

var i: integer;

begin

moveto (dx, dy);

for i: =1 to 6 do

begin

dx: =dx+round (dl*cos (2*pi* (i-1) /6));

dy: =dy+round (dl*sin (2*pi* (i-1) /6));

lineto (dx, dy);

end;

if n=1 then exit;

figura (dx, dy+round (1. 75*dl), n-1);

figura (dx, dy-round (1. 75*dl), n-1);

figura (dx-round (1. 5*dl), dy-round (0. 85*dl), n-1);

figura (dx+round (1. 5*dl), dy-round (0. 85*dl), n-1);

figura (dx-round (1. 5*dl), dy+round (0. 85*dl), n-1);

figura (dx+round (1. 5*dl), dy+round (0. 85*dl), n-1);

end;

begin

setwindowsize (800, 800);

readln (n); dl: =30;

figura (400, 400, n);

end.

Данная программа позволяет рисовать изображение в зависимости от введённого пользователем n уровней.

n=1 n=2

n=3 n=5

Пример программы с использованием процедуры

program zadacha9;

uses graphabc;

var dx, dy, dl, i, j: integer; a: real;

h1, h2, h3, k: integer;

procedure figura (dx, dy: integer);

begin

for i: =1 to 6 do

begin

dx: =dx+round (dl*cos (2*pi* (i-1) /6));

dy: =dy+round (dl*sin (2*pi* (i-1) /6));

lineto (dx, dy);

end;

end;

BEGIN

setwindowsize (800,800);

dx: =400; dy: =400;

dl: =30;

moveto (dx, dy);

figura (dx, dy);

h1: =round (1. 75*dl);

h2: =round (1. 5*dl);

h3: =round (0. 85*dl);

for j: =1 to 2 do

begin

dx: =400;

dy: =400+round (h1* cos (a));

moveto (dx, dy);

figura (dx, dy);

dx: =400+round (h2* cos (a));

dy: =400+round (h3* cos (a));

moveto (dx, dy);

figura (dx, dy);

dx: =400-round (h2* cos (a));

dy: =400+round (h3* cos (a));

moveto (dx, dy);

figura (dx, dy);

a: =a+pi;

end;

END.

Программа рисует такое же изображение, как и рекурсивная при n= 2.

ПоказатьСвернуть
Заполнить форму текущей работой