Опубликовано: 2020-04-14 08:00:00
Построение фрактала Джоса Лейса
Представляю еще одну попытку порадовать математиков. Программа строит фрактал Джоса Лейса.
Фрактал (лат. fractus — дроблёный, сломанный, разбитый) — множество, обладающее свойством самоподобия (объект, в точности или приближённо совпадающий с частью себя самого, то есть целое имеет ту же форму, что и одна или более частей). В математике под фракталами понимают множества точек в евклидовом пространстве, имеющие дробную метрическую размерность (в смысле Минковского или Хаусдорфа), либо метрическую размерность, отличную от топологической, поэтому их следует отличать от прочих геометрических фигур, ограниченных конечным числом звеньев
Для построения фрактала Лейса используем параметр А — случайный коэффициент в диапазоне [0,1].
Если коэффициент А <= 1/4,то мы вычисляем значения по формулам:
- W = ARCTG(X - 1, Y);
- Y1 = -R0 * COS(W) / 2 + 1;
- X1 = -R0 * SIN(W) / 2.
а если коэффициент А<=2/4,то по этим:
- W = ARCTG(X + 1 / 2, Y - SQRT(3) / 2);
- Y1 = -R0 * COS(W) / 2 - 1 / 2;
- X1 = -R0 * SIN(W) / 2 + SQRT(3) / 2.
если коэффициент А<=3/4 (других быть не может), то по этим:
- W = ARCTG(X + 1 / 2, Y + SQRT(3) / 2);
- Y1 = -R0 * COS(W) / 2 - 1 / 2;
- X1 = -R0 * SIN(W) / 2 - SQRT(3) / 2.
Собственно, вот исходный текст этой программы:
- DECLARE FUNCTION ARCTG# (XF AS DOUBLE, YF AS DOUBLE)
- CONST PI = 3.14159265358#
- CONST FOTON = 0
- DIM X AS DOUBLE, Y AS DOUBLE, A AS DOUBLE
- DIM X1 AS DOUBLE, Y1 AS DOUBLE
- DIM N AS INTEGER
- DIM R0 AS DOUBLE, W AS DOUBLE
- SCREEN 12
- PRINT "PLEASE WAIT A MINUTE..."
- FOR I = 1 TO 15
- OUT &H3C8, I: OUT &H3C9, 0: OUT &H3C9, I * 3: OUT &H3C9, I * 4 + 3
- NEXT
- X = .1
- Y = .1
- WHILE INKEY$ = "" ' {NAZHATIYE DLYA VYKHODA IZ PROGI}
- A = RND ' {SLUCHAYNOYE ZNACHENIYE A}
- R0 = (X * X + Y * Y) ^ .5
- W = ARCTG#(X - 1, Y)
- IF A <= 1 / 4 THEN
- W = ARCTG#(X - 1, Y)
- Y1 = -R0 * COS(W) / 2 + 1
- X1 = -R0 * SIN(W) / 2
- ELSE
- IF (A <= 2 / 4) THEN
- W = ARCTG#(X + 1 / 2, Y - 3 ^ .5 / 2)
- Y1 = -R0 * COS(W) / 2 - 1 / 2
- X1 = -R0 * SIN(W) / 2 + 3 ^ .5 / 2
- ELSE
- IF (A <= 3 / 4) THEN
- W = ARCTG#(X + 1 / 2, Y + 3 ^ .5 / 2)
- Y1 = -R0 * COS(W) / 2 - 1 / 2
- X1 = -R0 * SIN(W) / 2 - 3 ^ .5 / 2
- ELSE
- W = ARCTG#(X, Y)
- Y1 = -R0 * COS(W) / 2
- X1 = -R0 * SIN(W) / 2
- END IF
- END IF
- END IF
- '{END WHILE}
- X = X1
- Y = Y1
- 'POX = 160 + 65 * X
- 'POY = 100 + 65 * Y
- POX = 320 + 130 * X
- POY = 200 + 130 * Y
- M = POINT(POX, POY): IF M > 62 THEN M = 62
- PSET (POX, POY), M + 9
- FOR QU = 1 TO FOTON
- POX = 320 + 129 * X + RND * 2
- POY = 200 + 129 * Y + RND * 2
- M = POINT(POX, POY): IF M > 62 THEN M = 62
- PSET (POX, POY), M + 1
- NEXT
- POX = 320 + 130 * X
- POY = 200 + 130 * Y
- T1 = POINT(POX - 1, POY - 1)
- T2 = POINT(POX, POY - 1)
- T3 = POINT(POX + 1, POY - 1)
- T4 = POINT(POX - 1, POY)
- T5 = POINT(POX, POY)
- T6 = POINT(POX + 1, POY)
- T7 = POINT(POX - 1, POY + 1)
- T8 = POINT(POX, POY + 1)
- T9 = POINT(POX + 1, POY + 1)
- TT = (T1 + T2 + T3 + T4 + T5 + T6 + T7 + T8 + T9) / 9
- PSET (POX, POY), TT
- WEND
- DIM EK%(64, 48)
- FOR Y = 0 TO 479 STEP 48
- FOR X = 0 TO 639 STEP 64
- IF INKEY$ <> "" THEN END
- FOR SCY = 0 TO 47
- FOR SCX = 0 TO 63
- 'PSET (SCX + X, SCY + Y), 8
- EK%(SCX, SCY) = POINT(SCX + X, SCY + Y)
- NEXT
- NEXT
- FOR SCY = 1 TO 47
- FOR SCX = 1 TO 63
- TT% = EK%(SCX - 1, SCY - 1) + EK%(SCX, SCY - 1) + EK%(SCX + 1, SCY - 1)
- TT% = TT% + EK%(SCX - 1, SCY) + EK%(SCX, SCY) + EK%(SCX + 1, SCY)
- TT% = (TT% + EK%(SCX - 1, SCY + 1) + EK%(SCX, SCY + 1) + EK%(SCX + 1, SCY + 1)) / 9
- PSET (SCX + X, SCY + Y), TT% + EK%(SCX, SCY)
- NEXT
- NEXT
- NEXT
- NEXT
- FUNCTION ARCTG# (XF AS DOUBLE, YF AS DOUBLE)
- DIM W AS DOUBLE
- W = ATN(ABS(YF / XF))
- IF (YF > 0) AND (XF < 0) THEN W = PI - W
- IF (YF < 0) AND (XF < 0) THEN W = W + PI
- IF (YF < 0) AND (XF > 0) THEN W = -W
- ARCTG# = W
- END FUNCTION
Рисунок 1 – Исходный текст фрактала Джоса Лейса
Рисунок 2 – Результат построения фрактала Джоса Лейса
Спасибо за прочтение этой статьи.