Построение изображений с помощью рекурсии в Visual Basic

Разделы: Информатика, Конкурс «Презентация к уроку»


Презентация к уроку

Загрузить презентацию (1 МБ)


Образовательные цели урока

  • Сформировать понятие рекурсивной процедуры.
  • Закрепить на практике навыки использования рекурсивных процедур при создании изображений в Visual Basic.

Количество часов – 4.

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

Понятие рекурсии  (слайды 1, 2)

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

Рекурсия – программа или процедура (функция), которая обращается сама к себе как к подпрограмме (функции) непосредственно или через цепочку подпрограмм.

1. Чтобы исключить зацикливание в рекурсии, нужно правильно оформить условие выхода из неё.
2. Рекурсивная процедура должна вызывать саму себя с изменённым  значением параметра процедуры.
3. Для хранения промежуточных данных рекурсивной процедуры требуется большой объём памяти в виде стека, поэтому количество вложений рекурсии не может быть очень большим.

Пример 1  (слайды 3-4). Вывести на экран считалку про 10 негритят. Количество негритят вводится с клавиатуры.

В качестве примера рекурсивной процедуры рассмотрим вывод на экран считалки про 10 негритят (по мотивам стихотворения из романа Агаты Кристи «Десять негритят»).

«10 негритят пошли купаться в море,
10 негритят резвились на просторе,
Один из них пропал – и вот вам результат:
9 негритят пошли купаться в море,
9 негритят резвились на просторе,
Один из них пропал – и вот вам результат:

………………….
1 (из) негритят пошли(ел)  купаться в море,
1 (из) негритят резвились(ся)  на просторе,
Один из них пропал – и вот вам результат:

Нет больше негритят!»

Параметром рекурсивной процедуры будет переменная n – количество негритят. В рекурсивной процедуре будет выводиться очередной куплет. При каждом вызове рекурсивной процедуры количество n будем уменьшать на 1. Тогда условием выхода из рекурсии будет  n=0.
Рассмотрим алгоритм работы рекурсивной процедуры на примере n=3 (Рис. 1).

Рисунок 1. Иллюстрация работы рекурсивной процедуры для n=3

Интерфейс проекта представлен на слайде 5.
Программный код проекта (слайды 6, 7)Приложение 1.

Dim n As Integer
Private Sub Command2_Click()   ‘Основная программа
n = InputBox("Введите кол-во негритят", "Ввод данных")
Text2.Text = Str(n)
Call negr(n)    ‘вызов рекурсии
End Sub
Sub negr(n)   ‘Рекурсивная процедура
If n = 0 Then    ‘условие выхода из рекурсии
Text1.Text = Text1.Text & "Нет больше негритят!"
Exit Sub
End If
Text1.Text = Text1.Text & Str(n) & " негритят пошли купаться в море," & Chr(13) & Chr(10)
Text1.Text = Text1.Text & Str(n) & " негритят резвились на просторе," & Chr(13) & Chr(10)
Text1.Text = Text1.Text & "Один из них пропал и вот вам результат:" & Chr(13) & Chr(10)
Text1.Text = Text1.Text & Chr(13) & Chr(10)
Call negr(n – 1)   ‘вызов рекурсии с изменённым параметром n
End Sub

Пример 2. Создание изображений с помощью рекурсии.

Построить изображение открывающейся и закрывающейся матрёшки в виде эллипсов (слайды 8-10)

Программный код проекта – Приложение 2.
Параметры рекурсивной процедуры: R – радиус эллипса; n – количество вложений матрёшек. Пусть радиус каждой вложенной матрёшки в 2 раза меньше предыдущей.
На форме разместим графическое окно для вывода изображения Picture1, текстовое поле Text1 для вывода n и R, метку Label1 для вывода надписи «Матрешка» и 3 командные кнопки Command1 (Пуск), Command2 (Сброс), Command3 (Выход).

В процедуре кнопки «Пуск» (основной программе) установим шкалу графического окна, зададим начальный радиус R=80 и количество вложений матрёшек n=5. Далее вызываем рекурсивную процедуру построения эллипсов с помощью оператора вызова подпрограмм Call MATR(N, R).

После этого управление передаётся рекурсивной процедуре MATR(N, R).
Вначале проверяем условие выхода из рекурсии: If N = 0 Then Exit Sub      
При n=0 происходит выход из процедуры. В противном случае рисуем сначала нижнюю часть эллипса, затем верхнюю часть.
При этом при каждом повторном вызове рекурсивной процедуры Call MATR(N – 1, R / 2)   задаём измененные значения параметров процедуры: n уменьшается на 1, радиус уменьшается в 2 раза. На Рис.2 представлен результат построения.

Рисунок 2. Матрёшка

Dim N, R As Integer, I As Long
Private Sub Command1_Click()    ‘пуск
Picture1.Scale (0, 0)–(200, 200)
N = 5      ‘кол. вложений
R = 80
Call MATR(N, R)   ‘первый вызов рекурсии
End Sub

Sub MATR(N, R)   ‘Рекурсивная процедура
If N = 0 Then Exit Sub       ‘условие выхода из рекурсии
Picture1.Circle (100, 100), R, QBColor(13), 3.14, 6.28, 2  ‘рисуем нижнюю часть эллипса
For I = 1 To 100000000: Next I   ‘временная задержка
Call MATR(N – 1, R / 2)   ‘вызов рекурсии с изменённым параметром радиуса
Picture1.Circle (100, 100), R, QBColor(13), 0, 3.14, 2 ‘рисуем верхнюю часть эллипса
For I = 1 To 10000000: Next I
End Sub

Пример 3. Проект «Построение рекурсивных изображений».

Создать проект для построения  рекурсивных изображений: (слайд 11)

  • Окружности по горизонтали
  • Окружности по вертикали
  • Снежинка
  • Снежинка 6-конечная
  • Салфетка Серпинского

На слайде 12 представлен интерфейс проекта (Рис. 3).

Рисунок 3. Интерфейс проекта

Для созданных элементов управления установим свойства, приведенные в таблице (слайд 13).

Свойства элементов управления

Элемент управления

Свойство

Значение

Label1 Caption Построение рекурсивных изображений
Command1 Caption Окружности по горизонтали
Command7 Caption Окружности по вертикали
Command2 Caption Снежинка
Command5 Caption Снежинка 6-конечная
Command6 Caption Салфетка Серпинского
Command3 Caption Сброс
Command4 Caption Выход

1. Окружности по горизонтали

От центральной окружности радиуса R осуществить переход на концы её диаметра (по горизонтали), которые станут центрами следующих двух окружностей меньшего радиуса (в 1,5 раза). Далее снова перейти на концы диаметра полученных окружностей и построить 4 новые окружности меньшего радиуса. Процесс повторять, пока очередной радиус не станет меньше 10.
Интерфейс проекта представлен на слайде 15. На Рис. 4 представлен результат построения окружностей для начального R = 30.

Рисунок 4. Окружности по горизонтали

Разработка программного кода (слайды 16-17).
Программный код проекта полностью приведён в Приложении 3.

Dim x, y, R As Single   ‘Окружности по горизонтали
Private Sub Command1_Click()
x = 100 ‘Координаты центра
y = 100
R = InputBox(«Ввести R<40», «Ввод данных»)
Picture1.Scale (0, 0)–(200, 200)
Call Ris1(x, y, R) ‘Вызов рекурсивной процедуры
End Sub

Sub Ris1(x, y, R) ‘Построение окружностей по горизонтали
If R < 10 Then Exit Sub ‘Условие выхода из рекурсии
Picture1.Circle (x, y), R, QBColor(5)
Call Ris1(x + R, y, R / 1.5) ‘Ветка вправо
Call Ris1(x – R, y, R / 1.5) ‘Ветка влево
End Sub

2. Самостоятельно создайте программный код кнопки «Окружности по вертикали» (слайд 18)

В рекурсивной процедуре построения окружности изменяем координату центра y.
При этом записываем вызов процедур для построения веток окружностей вверх и вниз.

3. Снежинка (слайды 19, 20)

Нарисовать простую снежинку, состоящую из линий (Рис. 5).

Параметры рекурсивной процедуры:

x, y – координаты центра снежинки
d – длина максимального луча исходной снежинки 1 уровня
Выход из рекурсии осуществить при d<5.

Рисунок 5. Снежинка 1 уровень

Разработка программного кода (слайды 21-22).
Программный код проекта полностью приведён в Приложении 3.

Private Sub Command2_Click() ‘Снежинка

x = 0: y = 0    ‘Координаты центра снежинки
d = InputBox(«Ввести длину луча d<100», «Ввод данных»)
Picture1.Scale (–100, 100)–(100, –100)
Call Ris(x, y, d)   ‘Вызов рекурсивной процедуры
End Sub
Sub Ris(x, y, d) ‘Снежинка
If d < 5 Then Exit Sub ‘Условие выхода из рекурсии
Picture1.Line (x, y + d / 2)–(x, y – d / 2), QBColor(5)
Picture1.Line (x + d / 2, y)–(x – d / 2, y), QBColor(5)
Picture1.Line (x – d / 3, y + d / 3)–(x + d / 3, y – d / 3), QBColor(5)
Picture1.Line (x + d / 3, y + d / 3)–(x – d / 3, y – d / 3), QBColor(5)
Call Ris(x – d / 2, y, d / 2)  ‘Ветка влево
Call Ris(x + d / 2, y, d / 2)  ‘Ветка вправо
Call Ris(x, y – d / 2, d / 2)  ‘Ветка вниз
Call Ris(x, y + d / 2, d / 2)  ‘Ветка вверх
End Sub

4. Снежинка 6-конечная (слайды 23, 24, Рис. 6)

Из центра снежинки (x, y) проводятся лучи длиной d, угол между которыми 60°. Далее на концах каждого луча строятся аналогично снежинки (длина луча при каждом вызове рекурсии уменьшается в 3 раза).
Условием выхода из рекурсии выберем значение d < 5.

Рисунок 6. Снежинка 6-конечная

Разработка программного кода (слайды 25, 26)
Программный код проекта полностью приведён в Приложении 3.

5. Салфетка Серпинского (Рис. 8, слайды 27, 28, 29)

  • Построить равнобедренный  треугольник (Рис. 7).
  • Построить в нем средние линии.
  • Затем в образованных при углах исходного треугольника новых треугольниках опять рисуются средние линии. Процесс повторить до заданного уровня вложенности.

Параметры процедуры:

x, y – координаты вершины треугольника
d – основание и высота треугольника

Рисунок 7. Координаты треугольника

Рисунок 8. Салфетка Серпинского

Разработка программного кода (слайды 31, 32)
Программный код проекта полностью приведён в Приложении3.

Задания для самостоятельной работы (слайды 33-35)

1. С использованием рекурсивной процедуры построить изображение окружностей по диагонали (аналогично заданию 1 «окружности по горизонтали»).

2. Построить изображение «веточки симметричной».

x, y – координаты начала ветки
i – длина ветки; a – угол наклона
x1, y1 – координаты конца ветки

x1 = x + i * Cos(a)
y1 = y + i * Sin(a)

3. Построить изображение снежинки 10-конечной, состоящей из окружностей.

Литература

  1. Глушаков С.В. , Мельников В.В., Сурядный А.С. Программирование в среде Windows. Visual Basic 6.0. М.: ООО «Издательство АСТ», 2001
  2. Браун С. Visual Basic. Учебный курс. – Спб.: Питер, 2002
  3. Есипов А.С., Паныгина Н.Н., Громада М.И. Информатика. Задачник. – СПб: Наука и техника, 2001