Программа построения двухмерных L-фракталов (язык QBasic) .

' Функция рисования фрактала
DECLARE FUNCTION LDRAW (x0#, y0#, ST#, direct#, LS$)

' Функция получения строки для рисования фрактала
DECLARE FUNCTION LSTRING$ (axiom$, RC, RULES$( ), N, LS$)

' Функция читает данные из файла filename$ и возвращает:
' строка axiom$ - аксиома,
' direct# - число для получения угла поворота
' RC - количество теорем
' массив строк RULES$ - правила
DECLARE FUNCTION READFRA (filename$, axiom$, direct#, RC, RULES$( ) )
' Формат файла данных:
' 1-я строка - аксиома
' 2-я строка - число, на которое надо разделить 360 для получения
' угла поворота
' 3-я строка - число, равное количеству правил
' строки (количество которых определено в 3-й строке),
' в каждой из которых записано по одному правилу
' строки не содержат пробелов, 1-й элемент - заменяемый символ,
' остальные элементы - символы, на которые заменяется 1-й

' Функции преобразования координат
DECLARE FUNCTION XE# (x#)
DECLARE FUNCTION YE# (y#)

DIM RULES$(10)
N = READFRA("dragon.fra", axiom$, direct#, RC, RULES$ ( ) )
LS$ = LSTRING$(axiom$, RC, RULES$( ), 9, LS$)
PRINT LS$
Z$ = ""
DO WHILE Z$ = ""
Z$ = INKEY$
LOOP
SCREEN 12
COLOR 15
N = LDRAW(-200#, 0#, 10#, direct#, LS$)
Z$ = ""
DO WHILE Z$ = ""
Z$ = INKEY$
LOOP

FUNCTION LDRAW (x0#, y0#, ST#, direct#, LS$)
CONST PI# = 3.141592654#
x# = x0#
x# = y0#
rangle# = ((360# / direct#)) * PI# / 180#
curangle# = 0#
DIM stackX(200)
DIM stackY(200)
DIM stackANG#(200)
PSTACK = 0
COLOR 15
PSET (CINT(XE(x#)), CINT(YE(y#)))
I=1
DO WHILE (I < LEN (LS$) )
     A$ = MID$(LS$, I, 1)
     SELECT CASE A$
            CASE "F"
               x# = x# + ST# * COS(curangle#)
               y# = y# + ST# * SIN(curangle#)
               LINE-(CINT(XE(x#)), CINT(YE ( (y#)))), 15
            CASE "+"
               curangle# = curangle# - rangle#
            CASE "-"
               curangle# = curangle# + rangle#
            CASE "["
                 PSTACK = PSTACK + 1
                 stackX(PSTACK) = x#
                 stackY(PSTACK) = y#
                 stackANG#(PSTACK) = curangle#
            CASE "]"
                 x# = stackX(PSTACK)
                 y# = stackY(PSTACK)
                 curangle# = stackANG#(PSTACK)
                 PSTACK = PSTACK - 1
                 PSET (CINT(XE(x#)), CINT(YE(y#) ) )
                 COLOR 15
     END SELECT
     I=I+1
LOOP
END FUNCTION

FUNCTION LSTRING$ (axiom$, RC, RULES$ ( ), N, LS$)
     LS$ = axiom$
     R$ = ""
     RESULT$ = LS$
     FOR I = 0 TO N - 1
          К = 1
          Kl = LEN(RESULT$)
          WHILE (K < LEN(RESULT$))
                J = 0
                IF (K > Kl) THEN
                   К = 1
                END IF
                WHILE ((J <= RC - 1) AND (K <= Kl))
                    A$ = MID$(RESULT$, K, 1)
                    B$ = MID$(RULES$(J) , 1, 1)
                    IF (A$ = B$) THEN
                        SHIFT = LEN(RULES$(J)) - 2
                        P = K - 1
                        A$ = MID$(RESULT$, 1, P)
                        B$ = MID$(RULES$(J), 2, LEN(RULES$(J)) - 2)
                        С$ = MID$(RESULT$, К + 1, LEN(RESULT$) - К)
                        R$ = A$ + B$
                        R$ = R$ + C$
                        RESULT$ = R$
                        Kl = LEN(RESULT$)
                        К = К + SHIFT + 1
                    ELSE J = J + 1
                    END IF
                WEND
                К = К + 1
          WEND
NEXT I
LSTRING$ = RESULT$
END FUNCTION

FUNCTION READFRA (filename$, axiom$, direct#, RC, RULES$( ))
     OPEN filename$ FOR INPUT AS #1
     LINE INPUT #1, axiom$
     axiom$ = axiom$ + " "
     LINE INPUT #1, DIR$
     direct# = VAL(DIR$)
     LINE INPUT #1, RC$
     RC = VAL(RC$)
     FOR I = 0 TO RC - 1
          LINE INPUT #1, RULES$(I)
          RULES$(I) = RULES$(I) + " "
     NEXT I
     CLOSE #1
END FUNCTION

FUNCTION XE# (x#)
  XE# = 320 + x#
END FUNCTION

FUNCTION YE# (y#)
  YE# = 240 - y#
END FUNCTION

TopList