L-фракталы

Ниже мы рассмотрим достаточно общий алгоритм, позволяющий строить множество самоподобных фрактальных структур, в том числе очень напоминающих объекты живой природы. Не так давно по телевизору транслировался научно-популярный фильм 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
Версия для печатиВерсия для печати

Номер: 

01 за 2002 год

Рубрика: 

Азбука программирования
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!