Пилипчук О.П., вчитель інформатики Гаврилівської ЗОШ І-ІІІ ступенів
Теофіпольського району Хмельницької області
Фрактальні квадрати - 1
Рекурсія при побудові зображення (ЛОГО)
Фрактальну графіку виділяють в окремий вид, поряд з растровою та векторною. Її особливістю є те, що, завдяки використанню рекурсії при побудові зображення, його окремі частини різних розмірів є подібними до всього зображення. Тому при поступовому збільшенні зображення з'являються все нові й нові деталі.
Приклад
Нехай дано квадрат. Будуватимемо зображення за таким алгоритмом:
- поділити квадрат на 9 менших однакових квадратів;
- намалювати центральний з них;
- для кожного з 8 квадратів, що лишились, виконати пункти 1-3.
Залежно від глибини "занурення" за цим алгоритмом можна отримати такі
зображення:
Очевидно, що загальне формулювання алгоритму:
-
є рекурсивним;
-
не передбачає припинення побудови малюнка (!).
Реалізація
1. Для реалізації алгоритму скористаємось середовищем ЛОГОМиры (версія 2). Перейдемо на аркуш програм (
Листы / Программы або
Ctrl+F)
і
підготуємо процедуру для малювання квадрата з заданою довжиною сторони:
это квадрат :а
по
повтори 4 [вп :а пр 90]
пп
конец
2. Для того, щоб краще зрозуміти, як діяти далі, складемо процедуру, для побудови такого зображення, як на малюнку 2. Додаткові умови:
- першим має будуватися великий квадрат;
- сторона малого квадрата становить 1/3 сторони великого;
- по завершенні побудови черепашка має повернутися в початкове
положення.
Цим умовам відповідає така процедура:
это квадрати :а
квадрат :а
лв 90 вп 2 * :а / 3
пр 90 вп :а / 3
квадрат :а / 3
вп :а
квадрат :а / 3
повтори 2 [пр 90 вп :а лв 90
квадрат
:а / 3]
повтори 2 [нд :а
квадрат
:а / 3]
повтори 2 [лв 90 вп :а пр 90
квадрат
:а / 3]
вп :а / 3 * 2 пр 90 вп :а / 3 * 2 лв 90
конец
У коді виділено виклики процедури для побудови
малих
квадратів.
3. Але ж за умовою на місці малих квадратів мають бути фрагменти, подібні до побудованого процедурою
квадрати, тільки меншого розміру! Чому б для їх побудови не скористатись... цією ж процедурою? Здавалося б, передавши на її вхід значення а / 3, досягнемо бажаного результату, але разом з тим це спричинить повторні рекурсивні виклики. Теоретично в такому випадку процедура ніколи не припинить роботи, щодалі зменшуючи розміри квадратів. На практиці ж спричинить низку рекурсивних викликів і, нарешті, аварійну зупинку через вичерпання пам'яті.
Щоб уникнути цього, додамо до процедури ще один вхідний параметр, який означатиме глибину рекурсії - кількість рекурсивних викликів, які мають бути здійснені після поточного. При кожному такому виклику надаватимемо цьому параметру на одиницю менше значення. А на початку процедури додамо перевірку, чи потрібно припинити рекурсивні виклики.
Кінцевий варіант процедури матиме такий вигляд:
это фрактал :а :к
если :к < 0
[стоп]
квадрат :а
если не ( :к = 0 )
[
лв 90 вп 2 * :а / 3
пр 90 вп :а / 3
фрактал
:а / 3 :к - 1
вп :а
фрактал
:а / 3 :к - 1
повтори 2 [пр 90 вп :а лв 90
фрактал :а / 3 :к - 1]
повтори 2 [нд :а
фрактал :а / 3 :к - 1]
повтори 2 [лв 90 вп :а пр 90
фрактал :а / 3 :к - 1]
вп :а / 3 * 2 пр 90 вп :а / 3 * 2
лв 90
]
конец
4. А тепер можна поекспериментувати з процедурою
фрактал. Виклик
фрактал 81 0 призведе до побудови квадрата зі стороною 81 крок. Збільшуючи другий параметр (
фрактал 81 1,
фрактал 81 2 і т.д.) отримаємо все більш деталізовані зображення.
Примітка. Черепашка пересувається кроками, тому слід подбати, щоб при діленні довжини сторони квадрата на 3 виходило ціле число. В іншому випадку малюнок може бути дещо спотворений. Найкраще для початкового розміру квадрата взяти цілий степінь числа 3 або кратне йому число.
Завдання
- Побудувати за подібним алгоритмом фігуру, що складається з
рівносторонніх трикутників.
- Змінити програму так, щоб фігури різних розмірів мали різні
кольори.
- Проаналізуйте, як отримане зображення сніжинки та складіть
відповідну програму:
Якщо тема побудови фрактальних зображень вас зацікавила, перегляньте продовження: "
Фрактальні квадрати - 2"
Интернет реклама