Форум myROBOT.ru » Образовательные проекты » Проекты для GameLogo » Фрактальное дерево Пифагора

Страниц (1): [1]
 

1. Admin - 06 Июля, 2011 - 20:09:20 - перейти к сообщению
Пример нерекурсивного построения фрактального дерева Пифагора восьмого порядка методом Монте-Карло.

Пример на GameLogo из статьи "Очарование Logo" (Компьютерные Вести, №52, 2007 г. , Азбука программирования )
Автор А. КОЛЕСНИКОВ.

' построение фрактального дерева Пифагора
' восьмого порядка методом Монте-Карло.
' Компьютерные Вести, №52, 2007 год
' Азбука программирования, Очарование Logo
' http://www.kv.by/index2007521201.htm

переменная длина
переменная красный
переменная ширина

спрятать черепаху
повторить 525 {
домой
ширина=8
назад 100
перо ширина
красный = 64
цвет RGB(красный, 0, 0)
длина = 100
вперед длина
повторить 8 {
ширина = ширина - 1
перо ширина
красный = красный + (255 - 64) / 8
цвет RGB(красный, 0, 0)
если случайный > 0,5 то налево 45 иначе направо 45
вперед длина
длина = длина * 0.6
}
}
2. Sally - 04 Января, 2014 - 20:15:39 - перейти к сообщению
Построение полного фрактального дерева произвольной глубины с произвольным ветвлением:
CODE:
' построение фрактального дерева Пифагора

ПЕРЕМЕННАЯ вилка
ПЕРЕМЕННАЯ уровень
ПЕРЕМЕННАЯ уровней
ПЕРЕМЕННАЯ длина_ветки
ПЕРЕМЕННАЯ угол_начальный
ПЕРЕМЕННАЯ угол_вилки
МАССИВ ветви[10] ' требуется [уровней-1]
ПЕРЕМЕННАЯ сжатие

уровней = 6        ' глубина построения дерева
вилка = 4          ' число новых ветвей на каждой развилке
угол_вилки = 30    ' угол между ветвями на развилке
угол_начальный = 45' отклонение первой ветви на развилке
длина_ветки = 200  ' базовая длина ветки
сжатие = 0.7       ' относительное укорачивание веток

ПОДНЯТЬ ПЕРО
МЕСТО 400, 600
ОПУСТИТЬ ПЕРО

ПЕРО уровней
ВПЕРЁД длина_ветки
ПОВТОРЯТЬ ПОКА уровень>=0
{
    уровень = уровень+1
    ЕСЛИ уровень=уровней ТО ' ветка последнего уровня
        уровень = уровней-1
        НАЗАД сжатие^уровень*длина_ветки
    КОНЕЦ УСЛОВИЯ
    ЕСЛИ ветви[уровень]<вилка ТО ' рисуем развилку
        ЕСЛИ ветви[уровень]=0 ТО НАЛЕВО угол_начальный ИНАЧЕ НАПРАВО угол_вилки
        ветви[уровень] = ветви[уровень]+1
        ПЕРО уровней-уровень
        ВПЕРЁД сжатие^уровень*длина_ветки
    ИНАЧЕ ' возврат к предыдущей развилке
        ветви[уровень] = 0
        НАЛЕВО угол_вилки*(вилка-1)-угол_начальный
        НАЗАД сжатие^(уровень-1)*длина_ветки
        уровень = уровень-2
    КОНЕЦ УСЛОВИЯ
}
СПРЯТАТЬ ЧЕРЕПАХУ

В целом и так фрактальный алгоритм без рекурсии выглядит неуклюже... а ещё не получилось красиво собрать условия "возврат к предыдущей развилке" и "ветка последнего уровня". Удивляет приоритет степени равный умножению. Но результат симпатичный.