Субота, 23.11.2024
Творча лабораторія
Меню сайту
Реклама
Категорії каталогу
MS Visual C++ 2005 Express Edition [3]
Середовища програмування [8]
Особливості встановлення та використання різних середовищ програмування
MS Visual Basic 6 [1]
Microsoft Visual Basic
C# [8]
Програмування мовою C#
C++ [3]
Паскаль [5]
ЛОГО [1]
Олімпіадне програмування [0]
Python [1]
Головна » Статті » Програмування » ЛОГО

Фрактальні квадрати - 1

Нові статті

[19.02.2020] [C#]
Задача про розрізання квадрата (ООП, C#)
[09.02.2020] [Python]
Задача про розрізання квадрата (ООП, Python)
[06.02.2020] [Паскаль]
Задача про розрізання квадрата (ООП, Free Pascal)

Пилипчук О.П., вчитель інформатики Гаврилівської ЗОШ І-ІІІ ступенів Теофіпольського району Хмельницької області

Фрактальні квадрати - 1

Рекурсія при побудові зображення (ЛОГО)

 Фрактальну графіку виділяють в окремий вид, поряд з растровою та векторною. Її особливістю є те, що, завдяки використанню рекурсії при побудові зображення, його окремі частини різних розмірів є подібними до всього зображення. Тому при поступовому збільшенні зображення з'являються все нові й нові деталі.

Приклад

Нехай дано квадрат. Будуватимемо зображення за таким алгоритмом:
  1. поділити квадрат на 9 менших однакових квадратів;
  2. намалювати центральний з них;
  3. для кожного з 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 або кратне йому число.

Завдання

  1. Побудувати за подібним алгоритмом фігуру, що складається з рівносторонніх трикутників.
  2. Змінити програму так, щоб фігури різних розмірів мали різні кольори.
  3. Проаналізуйте, як отримане зображення сніжинки та складіть відповідну програму:


Якщо тема побудови фрактальних зображень вас зацікавила, перегляньте продовження: "Фрактальні квадрати - 2"

Интернет реклама
Категорія: ЛОГО | Додав: teachlab (13.05.2010)
Переглядів: 4723 | Рейтинг: 0.0/0
Всього коментарів: 0
Додавати коментарі можуть тільки зареєстровані користувачі.
[ Реєстрація | Вхід ]
Форма входу
Пошук
Друзі сайту

Підтримка


Статистика
Copyright Пилипчук О.П. © 2024
div id=