Чтобы перерисовать дерево, заполните форму:


Угол:
Отношение длины предыдущей ветки к следующей:
Количество шагов:
Вероятность того, что ветка не отпадёт:
Отношение длины боковой ветки к длине центральной:
Извините, но Ваш браузер не поддерживает Canvas!

Описание

Когда-то я рассматривал математические объекты, которые создаются так: берётся ломаная (то есть линия, состоящая из нескольких отрезков), и каждый из этих отрезков заменяется копией первоначальной ломаной, только уменьшенной в соответственное количество раз.

Для того, чтобы лучше себе представлять эти объекты, я создал программу, которая умеет их рисовать. А потом, когда мне было нечего делать, я решил в эту программу добавить две вещи: вероятность и реалистичность. Так и была создана рисовалка деревьев.

Три года она лежала у меня на компе, т.к. была написана на относительно мало распространённом языке. Но теперь у меня дошли руки переписать её на Javascript, приделать удобный интерфейс для ввода параметров и выложить на сайт. Наслаждайтесь!

Принцип рисования очень простой: сначала рисуется прямая линия - "ствол". Потом от ствола отходят вправо и влево (под одинаковым углом) две ветки. Третья ветка идёт вверх. От каждой из веток отходят ещё по три ветки, и так далее. Естественно, ветки со временем уменьшаются. Они уменьшаются в одно и то же количество раз. Чуть ниже рассмотрим параметры, которые можно настраивать:/p>

Количество шагов

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

Если в рисовании дерева два шага, то оно выглядит уже так:

И чем больше шагов, тем сложнее дерево. На 12-ти шагах дерево выглядит уже вот так:

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

Угол

Имеется в виду угол между ветками дерева. Ниже можно увидеть деревья с разными углами между ветками:

Дерево с углом в 20 градусов:

Дерево с углом в 30 градусов:

Дерево с углом в 45 градусов:

Отношение длины предыдущей ветки к следующей

Очевидно, что ветки со временем уменьшаются: возле ствола ветки самые толстые и длинные, а наверху - тоненькие и коротенькие. Коэффициент такого уменьшения можно задавать программно. Например, если хотите, чтобы ветки каждый раз уменьшались в два раза, напишите в соответствующем пункте формы число "0.5". Вот парочка примеров:

Дерево с коэффициентом 0.6:

Дерево с коэффициентом 0.7:

Дерево с коэффициентом 0.8:

Вероятность того, что ветка не отпадёт

Вот этот параметр даёт непредсказуемость. На каждом этапе каждая ветка может с какой-то вероятностью отпасть. Учитывая, что у дерева миллионы веток, из них тысячи и десятки тысяч отпадут. В результате вы каждый раз будете получать новое дерево, непохожее на другое. Вот пример: три дерева с одинаковыми параметрами:

Отношение длины боковой ветки к длине центральной

Последний параметр добавлен ради реалистичности. Дело в том, что в реальном мире боковая ветка обычно меньше, чем центральная. Поэтому я ввёл специальный коэффициент, который позволяет уменьшить боковую ветку. Вот пример деревьев, которые отличаются такими коэффициентами:

Дерево с коэффициентом 0.7:

Дерево с коэффициентом 0.8:

Дерево с коэффициентом 0.9:

Итоги

Для меня это был очень интересный и полезный опыт - как с точки зрения программирования, так и с точки зрения рисования. Кроме того, это яркий показатель того, что математик также может творить (а чем ещё, как не творчеством, является процесс обдумывания коэффициентов, которые влияют на деревья?).

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