Программирование : CD Interface ; Альтернативные решения | Конференция | Cсылки | Главная (фреймы)

Turtle графика

См. фракталы

L-системы

    Вообще, понятие L-систем ввел Аристрид Линденмайер, в основном, для изучения формальных языков. В дальнейшем выяснилось, что с помощью них можно строить самоподобные фракталы. Алгоритм, реализующий L-системы в графическом виде получил название turtle-графика (по-английски turtle - черепаха). Подробнее о L-системах можно посмотреть в книге: P.Prusinkiewicz & J. Hanan, Lindenmayer Systems, Fractals, and Plants, Lecture Notes in Biomathematics, N79, Springer-Verlag, New-York,1989.

    "Черепаховый" алгоритм представляет собой интерпретатор кодового слова, являющегося результатом выполнения L-системы, которое анализируется слева направо и может содержать следующие символы:

    F - указывает, что "черепаха" должна сделать один шаг вперед с прорисовкой

    b - шаг вперед без прорисовки

   "+" - увеличить угол

   "-"   - уменьшить угол

    "[" - открыть ветвь

    "]" - закрыть ветвь

    Величину шага и угла нужно задавать заранее.

    На сколько мне известно, L-система состоит из слова инициализации, которое называют аксиомой или инициатором, и набора порождающих правил, предписывающих как изменять кодовое слово. Ниже представлен фрактал, построенный с помощью L-системы (так называемая снежинка Коха).

    Для этой снежинки были устанвлены следующие параметры:

    приращение угла = pi/3
    Аксиома = F++F++F
    Порождающее правило: "F" заменять на "F-F++F-F" (В дальнейшем будем использовать значок "->" вместо слова "заменять").

    Порождающее правило описывает наименьший элемент фрактала. Для снежинки Коха - это равносторонний треугольник с "расскрытым" основанием:

level=1 level=2 level=3

   Теперь можно продемонстрировать алгоритмы.

Алгоритм 1. L-Система
Public Function L_System(ByVal Axiom As String, ByVal NewF As String, ByVal NewB As String, ByVal Level As Integer, Optional ByVal NewX As String, Optional ByVal NewY As String) As String
Static W$, t$
Static n%, j%, i%
W$ = Axiom$
n% = Len(W$)
t$ = vbNullString
i% = Level%
Do While i% > 0
  For j% = 1 To n%
     If Mid$(W$, j%, 1) = "+" Then t$ = t$ & "+"
     If Mid$(W$, j%, 1) = "-" Then t$ = t$ & "-"
     If Mid$(W$, j%, 1) = "[" Then t$ = t$ & "["
     If Mid$(W$, j%, 1) = "]" Then t$ = t$ & "]"
     If Mid$(W$, j%, 1) = "F" Then t$ = t$ & NewF$
     If Mid$(W$, j%, 1) = "b" Then t$ = t$ & NewB$
     If Mid$(W$, j%, 1) = "X" Then t$ = t$ & NewX$ 'для вспомогательной переменной X
     If Mid$(W$, j%, 1) = "Y" Then t$ = t$ & NewY$ 'для вспомогательной переменной Y
  Next
W$ = t$
i% = i% - 1
n% = Len(W$)
t$ = vbNullString
Loop
L_System = W$
End Function
Алгоритм 2. Turtle - графика
Type TripLet
    X0 As Integer
    Y0 As Integer
    Alpha As Double
End Type

Dim tTripLet as TripLet

Public Sub TurtleGraph(ByVal alpha As Double, ByVal Phi As Double)
On Error Resume Next
Static W As String
Static Stack() As TripLet
Static x0%, y0%, x%, y%, j%, l%, n%, xmin%, ymin%,coeff%
W$ = L_System("FXF--FF--FF", "FF", "", 5, "--FXF++FXF++FXF--")'Строка для треугольника Серпинского
x0% = 0
y0% = 0
x% = 0
y% = 0
coeff% = 5 'Коэффициент увеличения - дань упрощению алгоритма
xmin% = 0: ymin% = 0
n% = Len(W$)
ReDim Stack(0)
For j% = 1 To n%
    If Mid$(W$, j%, 1) = "+" Then alpha# = alpha# + Phi#
    If Mid$(W$, j%, 1) = "-" Then alpha# = alpha# - Phi#
    If Mid$(W$, j%, 1) = "F" Then
       x% = x0% + Cos(alpha#)
       y% = y0% + Sin(alpha#)
       xmin% = picOut.ScaleWidth / 2
       ymin% = picOut.ScaleHeight / 2
       picOut.Line (xmin% - x0% * coeff%, ymin% - y0% * coeff%)-(xmin% - x% * coeff%, ymin% - y% * coeff%)
       x0% = x%
       y0% = y%
    End If
    If Mid$(W$, j%, 1) = "b" Then
       x0% = x0% + Cos(alpha#)
       y0% = y0% + Sin(alpha#)
    End If
    If Mid$(W$, j%, 1) = "[" Then
       ReDim Preserve Stack(UBound(Stack) + 1)
       tTripLet.x0% = x0%
       tTripLet.y0% = y0%
       tTripLet.alpha# = alpha#
       Stack(UBound(Stack)) = tTripLet
    End If
    If Mid$(W$, j%, 1) = "]" Then
       tTripLet = Stack(UBound(Stack))
       x0% = tTripLet.x0%
       y0% = tTripLet.y0%
       alpha# = tTripLet.alpha#
       ReDim Preserve Stack(UBound(Stack) - 1)
    End If
Next j%
End Sub

    Примечание: в алгоритме L-системы возможно вводить сколько угодно букв. Как видно ниже, можно использовать буквы X, Y, а также все остальные символы. Только тогда необходимо добавлять обработчик этих символов (см. алгоритм, где комментарий "для вспомогательных переменных"). Ну, естественно, при увеличении числа итераций ( level) увеличивается время прорисовки.

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

Параметры Изображение

Дракон Хартера-Хайтвея
аксиома=FX
порождающие правила:
F->F
X->X+YF+
Y->-FX-Y
Приращение=pi/2

Треугольник Серпинского
аксиома=FXF--FF--FF
порождающие правила:
F->FF
X->- -FXF++FXF++FXF- -
Приращение=pi/3

Кривая Гильберта
аксиома=X
порождающие правила:
F->F
X->-YF+XFX+FY-
Y->+XFX-YFY-FX+
Приращение=pi/2

Кривая Госпера
аксиома=XF
F->F
X->X+YF++YF-FX--FXFX-YF+
Y->-FX+YFYF++YF+FX--FX-Y
приращение=pi/3

Кривая Серпинского
аксиома=F+XF+F+XF
F->F
X->XF-F+F-XF+F+XF-F+F-X
начальный угол=pi/4
приращение=pi/2

Остров
аксиома=F+F+F+F
F->F+F-F-FFF+F+F-F
приращение=pi/2

Цепочка
аксиома=F+F+F+F
F->F+b-F-FFF+F+b-F
b->bbb
приращение=pi/2

просто куст
аксиома=F
F->-F+F+[+F-F-]-[-F+F+F]
приращение=pi/8
Снежинка
аксиома=[F]+[F]+[F]+[F]+[F]+[F]
F->F[++F][-FF]FF[+F][-F]FF
приращение=pi/3

Растение
аксиома=F
F->F[+F]F[-F]F
приращение=pi/7

Цветок
аксиома=F[+F+F][-F-F][++F][--F]F
F->FF[++F][+F][F][-F][--F]
приращение=pi/16

Кристалл (получен автором)
аксиома=F+F+F+F+F+F+F+F
F->F++F-F--F-F++F
приращение=pi/4

    Несомненно, существует множество фракталов, которые можно изобразить с помощью "черепахового" алгоритма. Присылайте свои на NickSoft@Netscape.net .

[ Вернуться к фракталам ][ Галерея фракталов ][ Прислать фрактал ]


Программирование : CD Interface ; Альтернативные решения | Конференция | Cсылки | Главная (фреймы)

Nick Software © 2001
design:Nick Software DesignGroup



Hosted by uCoz