QBASICBOOK.ru: сайт про QB64

Опубликовано: 2020-04-14 08:00:00

Построение фрактала Джоса Лейса

Представляю еще одну попытку порадовать математиков. Программа строит фрактал Джоса Лейса.

Фрактал (лат. fractus — дроблёный, сломанный, разбитый) — множество, обладающее свойством самоподобия (объект, в точности или приближённо совпадающий с частью себя самого, то есть целое имеет ту же форму, что и одна или более частей). В математике под фракталами понимают множества точек в евклидовом пространстве, имеющие дробную метрическую размерность (в смысле Минковского или Хаусдорфа), либо метрическую размерность, отличную от топологической, поэтому их следует отличать от прочих геометрических фигур, ограниченных конечным числом звеньев

Для построения фрактала Лейса используем параметр А — случайный коэффициент в диапазоне [0,1].

Если коэффициент А <= 1/4,то мы вычисляем значения по формулам:

а если коэффициент А<=2/4,то по этим:

если коэффициент А<=3/4 (других быть не может), то по этим:

Собственно, вот исходный текст этой программы:


  1. DECLARE FUNCTION ARCTG# (XF AS DOUBLE, YF AS DOUBLE)
  2. CONST PI = 3.14159265358#
  3. CONST FOTON = 0
  4. DIM X AS DOUBLE, Y AS DOUBLE, A AS DOUBLE
  5. DIM X1 AS DOUBLE, Y1 AS DOUBLE
  6. DIM N AS INTEGER
  7. DIM R0 AS DOUBLE, W AS DOUBLE
  8.  
  9. SCREEN 12
  10. PRINT "PLEASE WAIT A MINUTE..."
  11. FOR I = 1 TO 15
  12.     OUT &H3C8, I: OUT &H3C9, 0: OUT &H3C9, I * 3: OUT &H3C9, I * 4 + 3
  13. NEXT
  14. X = .1
  15. Y = .1
  16. WHILE INKEY$ = "" ' {NAZHATIYE DLYA VYKHODA IZ PROGI}
  17.     A = RND ' {SLUCHAYNOYE ZNACHENIYE A}
  18.     R0 = (X * X + Y * Y) ^ .5
  19.     W = ARCTG#(X - 1, Y)
  20.     IF A <= 1 / 4 THEN
  21.         W = ARCTG#(X - 1, Y)
  22.         Y1 = -R0 * COS(W) / 2 + 1
  23.         X1 = -R0 * SIN(W) / 2
  24.     ELSE
  25.         IF (A <= 2 / 4) THEN
  26.             W = ARCTG#(X + 1 / 2, Y - 3 ^ .5 / 2)
  27.             Y1 = -R0 * COS(W) / 2 - 1 / 2
  28.             X1 = -R0 * SIN(W) / 2 + 3 ^ .5 / 2
  29.         ELSE
  30.             IF (A <= 3 / 4) THEN
  31.                 W = ARCTG#(X + 1 / 2, Y + 3 ^ .5 / 2)
  32.                 Y1 = -R0 * COS(W) / 2 - 1 / 2
  33.                 X1 = -R0 * SIN(W) / 2 - 3 ^ .5 / 2
  34.             ELSE
  35.                 W = ARCTG#(X, Y)
  36.                 Y1 = -R0 * COS(W) / 2
  37.                 X1 = -R0 * SIN(W) / 2
  38.             END IF
  39.         END IF
  40.     END IF
  41.     '{END WHILE}
  42.     X = X1
  43.     Y = Y1
  44.     'POX = 160 + 65 * X
  45.     'POY = 100 + 65 * Y
  46.     POX = 320 + 130 * X
  47.     POY = 200 + 130 * Y
  48.     M = POINT(POX, POY): IF M > 62 THEN M = 62
  49.     PSET (POX, POY), M + 9
  50.     FOR QU = 1 TO FOTON
  51.         POX = 320 + 129 * X + RND * 2
  52.         POY = 200 + 129 * Y + RND * 2
  53.         M = POINT(POX, POY): IF M > 62 THEN M = 62
  54.         PSET (POX, POY), M + 1
  55.     NEXT
  56.     POX = 320 + 130 * X
  57.     POY = 200 + 130 * Y
  58.     T1 = POINT(POX - 1, POY - 1)
  59.     T2 = POINT(POX, POY - 1)
  60.     T3 = POINT(POX + 1, POY - 1)
  61.     T4 = POINT(POX - 1, POY)
  62.     T5 = POINT(POX, POY)
  63.     T6 = POINT(POX + 1, POY)
  64.     T7 = POINT(POX - 1, POY + 1)
  65.     T8 = POINT(POX, POY + 1)
  66.     T9 = POINT(POX + 1, POY + 1)
  67.     TT = (T1 + T2 + T3 + T4 + T5 + T6 + T7 + T8 + T9) / 9
  68.     PSET (POX, POY), TT
  69. WEND
  70.  
  71. DIM EK%(64, 48)
  72. FOR Y = 0 TO 479 STEP 48
  73.     FOR X = 0 TO 639 STEP 64
  74.         IF INKEY$ <> "" THEN END
  75.         FOR SCY = 0 TO 47
  76.             FOR SCX = 0 TO 63
  77.                 'PSET (SCX + X, SCY + Y), 8
  78.                 EK%(SCX, SCY) = POINT(SCX + X, SCY + Y)
  79.             NEXT
  80.         NEXT
  81.         FOR SCY = 1 TO 47
  82.             FOR SCX = 1 TO 63
  83.                 TT% = EK%(SCX - 1, SCY - 1) + EK%(SCX, SCY - 1) + EK%(SCX + 1, SCY - 1)
  84.                 TT% = TT% + EK%(SCX - 1, SCY) + EK%(SCX, SCY) + EK%(SCX + 1, SCY)
  85.                 TT% = (TT% + EK%(SCX - 1, SCY + 1) + EK%(SCX, SCY + 1) + EK%(SCX + 1, SCY + 1)) / 9
  86.                 PSET (SCX + X, SCY + Y), TT% + EK%(SCX, SCY)
  87.             NEXT
  88.         NEXT
  89.     NEXT
  90. NEXT
  91.  
  92. FUNCTION ARCTG# (XF AS DOUBLE, YF AS DOUBLE)
  93. DIM W AS DOUBLE
  94. W = ATN(ABS(YF / XF))
  95. IF (YF > 0) AND (XF < 0) THEN W = PI - W
  96. IF (YF < 0) AND (XF < 0) THEN W = W + PI
  97. IF (YF < 0) AND (XF > 0) THEN W = -W
  98. ARCTG# = W
  99. END FUNCTION

Рисунок 1 – Исходный текст фрактала Джоса Лейса

Рисунок 1 – Исходный текст фрактала Джоса Лейса

Рисунок 2 – Результат построения фрактала Джоса Лейса

Рисунок 2 – Результат построения фрактала Джоса Лейса

Спасибо за прочтение этой статьи.

 

Прикрепленные файлы:

< Предыдущая статья
Интерполяция
Следующая статья >
Фракталы STARS и MARTIN

Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.