Ниже мы рассмотрим достаточно общий алгоритм, позволяющий строить множество самоподобных фрактальных структур, в том числе очень напоминающих объекты живой природы. Не так давно по телевизору транслировался научно-популярный фильм BBC о глубоководной жизни, который буквально заворожил меня. Потрясающе красивые съемки, сделанные с глубоководных аппаратов, действовали почти гипнотически, приковывая взгляд к экрану. Животные, обитающие на глубинах в несколько километров в царстве вечной темноты и огромного давления, имеют, как правило, хрупкие, абсолютно прозрачные тела, тут и там обрамленные разноцветным фосфоресцирующим свечением. Их изысканные формы практически полностью основаны на принципах, которые будут обсуждаться ниже.
Задумывались ли вы когда-нибудь, откуда в вашей голове рождаются новые оригинальные идеи (если, конечно, таковые хотя бы иногда вас посещают). Они рождаются как бы спонтанно из хаоса подсознательного. По выражению новосибирского философа А.Г.Чусовитина, "Разум - это бухгалтер мысли, но не ее творец"*. Однако эти внезапные озарения не происходят сами собой, беспричинно. Как правило, стимулом или катализатором творческого процесса выступают иные оригинальные мысли, приходящие извне. К числу таких "взрывных" эвристичных идей, думается, с полным правом можно отнести принцип L-формализма, предложенный биологом Аристидом Линдермауером для кодирования квазифрактальных самоподобных геометрических структур (см. онлайновый номер журнала "Информатика", расположенный по указанному ниже адресу).
Суть L-кодирования сводится к следующему. Представим себе некое виртуальное программируемое устройство, состоящее из пера, управляющего им механизма и листа бумаги. Управляющий пером механизм способен исполнять несколько команд. А именно: он может опустить перо на бумагу и вычертить прямой отрезок заданной длины в направлении текущей ориентации пера (команда F). Он может изменить ориентацию пера по отношению к текущей на какой-то заданный относительный угол по часовой или против часовой стрелки (команды + и -). Он может также запоминать (заносить в стек) свое текущее состояние (команда [) и вспоминать (извлекать из стека) ранее запомненное состояние (команда ]). Под состоянием в данном случае понимается тройка чисел (x, y, a), где x и y - это координаты пера и а - это угол, определяющий направление ориентации пера. Таким образом, задав некое начальное направление а0, определив относительный угол поворота в 900 и задав длину отрезка, при помощи последовательности команд F+F+ F+F мы можем нарисовать квадрат. Определив относительный угол поворота в 600, при помощи последовательности команд F++F++F можно нарисовать равносторонний треугольник.
Предположим также, что в программы для нашего виртуального устройства, кроме пяти перечисленных команд, можно включать любые другие символы, которые управляющий механизм будет просто игнорировать. То есть если мы введем программу F+BF+CCF+CF, то устройство все равно нарисует квадрат. Теперь мысленно оснастим наше устройство приставкой, которая перед тем, как передать введенную программу на управляющий механизм, может заданное число раз просматривать ее, и при каждом очередном просмотре заменять любые символы последовательности по предварительно указанным правилам. Исходную программную последовательность символов теперь будем называть аксиомой. Например, введем аксиому FB+, и определим правило B < F+FB. Зададим также количество просмотров, равное, например, двум. Тогда на входе механизма после обработки введенной аксиомы приставкой получим последовательность FF+FF+FB+. Вот, собственно, и все. При помощи описанного несложного виртуального устройства можно строить множество самых разнообразных фрактальных форм - от традиционных математических фракталов, таких, как, например, снежинка Коха или кривая Гильберта, до структур, очень напоминающих растительную или подводную жизнь.
По адресу inf.1september.ru/2000/6/fract/main.htm можно найти программы для моделирования L-фракталов, написанные на Q-basic и на C. Я, однако, написал собственный вариант программного кода на Visual Basic, который алгоритмически несколько отличается от программы, приведенной по указанному выше адресу.
На рисунке приведено несколько примеров фрактальных структур, построенных при помощи описанной программы.
Может ли быть случайным столь разительное сходство L-фракталов с формами живых организмов? Думается, что нет. Наверняка генетические программы развития растительных и подводных организмов имеют много общего с принципами описанного L-кодирования. С позиций L-формализма легко поддаются логическому объяснению и разнообразие биологических форм, и принципы их эволюции. Ведь для получения какой-либо новой формы достаточно лишь немного изменить какой-либо параметр или элемент исходной программы, сохранив при этом сам принцип построения. В то же самое время L-формализм демонстрирует всю несостоятельность статистических аддитивных подходов к описанию наследования фенотипических признаков организмов, которые до настоящего времени имеют сильное влияние в биологической науке. На примере L-фракталов можно проиллюстрировать конструктивный параллельный перенос эвристичных идей из разных областей знания. Думается, что фрактальная геометрия могла бы натолкнуть генетиков на решение многих загадок, связанных с природными принципами формообразования и наследования. Впрочем, справедливо и обратное. Недаром принцип L-кодирования был предложен не математиком, а именно биологом.
А. КОЛЕСНИКОВ,
andr61@mail.ru
* Чусовитин А.Г. Концепция
деятельности (онтологический и
методологический аспекты)\\
Полигнозис 4\2000, - с 149
Dim x_stack(200) As Single Dim y_stack(200) As Single Dim a_stack(200) As Single Dim MaxDepth As Byte Dim ProgramString As String Dim NewProgramString As String Dim Rule(10) As String Dim RuleSimbol(10) As String Dim Replace As Boolean Dim Axiom As String Dim Simbol As String Dim Nrule As Byte Dim angle As Byte Dim R As Single Private Sub Form_Click() Open "Растение 2.txt" For Input As #1 Input #1, Axiom Input #1, angle Input #1, Nrule Input #1, MaxDepth For i = 1 To Nrule Input #1, RuleSimbol(i) Input #1, Rule(i) Next i Close #1 R = 500 Interpretation Visualisation End Sub Public Sub Interpretation() Depth = 0 ProgramString = Axiom NewProgramString = "" Do While Depth <= MaxDepth For i = 1 To Len(ProgramString) Simbol = Mid$(ProgramString, i, 1) Replace = False j = 1 Do While j <= Nrule If RuleSimbol(j) = Simbol Then Replace = True: Exit Do End If j = j + 1 Loop If Replace Then NewProgramString = NewProgramString + Rule(j) Else NewProgramString = NewProgramString + Simbol End If Next i Depth = Depth + 1 ProgramString = NewProgramString NewProgramString = "" R = R / 1.5 Loop End Sub Public Sub Visualisation() Pi = 3.141592654 x = 3000 y = 0 a = 0 sector = (360 / angle) * Pi / 180 Cs = 0 PSet (x, 7000 - y) For i = 1 To Len(ProgramString) Simbol = Mid$(ProgramString, i, 1) Select Case Simbol Case "F" x = x + R * Cos(a) y = y + R * Sin(a) Line -(x, 7000 - y) Case "+" a = a - sector Case "-" a = a + sector Case "[" Cs = Cs + 1 x_stack(Cs) = x y_stack(Cs) = y a_stack(Cs) = a Case "]" x = x_stack(Cs) y = y_stack(Cs) a = a_stack(Cs) PSet (x, 7000 - y) Cs = Cs - 1 End Select Next i End Sub
Горячие темы