§ Основа алгоритма

Суть этого алгоритма крайне проста. С помощью специальной функции псевдогенератора случайных чисел генерируется сетка из значений. Для каждого значения извлекается методом линейной или квадратной (или кубической) интерполяции значение и складывается с несколькими такими октавами разной частоты.
Алгоритм очень прост.

§ Программа на Quick Basic

1SCREEN 13
2
3COLOR 63
4FOR i = 0 TO 63: OUT 968, i: OUT 969, i: OUT 969, i: OUT 969, i: NEXT
5
6' Draw motion
7FOR y = 0 TO 200
8FOR x = 0 TO 320
9
10  mx = x / 320 * 8
11  my = y / 200 * 8
12  r = fbm(mx, my)
13  PSET (x, y), r * 63
14
15NEXT
16NEXT
17
18' Fractal Brownian Motion
19FUNCTION fbm (x, y)
20
21  value = 0
22  amp = .5
23  freq = 0
24
25  FOR i = 0 TO 5
26
27    value = value + amp * noise(x, y)
28    x = x * 2
29    y = y * 2
30    amp = amp * .5
31
32  NEXT
33
34  fbm = value
35
36END FUNCTION
37
38' Get interpolated noise
39FUNCTION noise (x, y)
40
41  ix = INT(x): fx = x - ix
42  iy = INT(y): fy = y - iy
43
44  a = rand(ix, iy)
45  b = rand(ix + 1, iy)
46  c = rand(ix, iy + 1)
47  d = rand(ix + 1, iy + 1)
48
49  ux = fx ^ 2 * (3 - 2 * fx)
50  uy = fy ^ 2 * (3 - 2 * fy)
51
52  noise = a * (1 - ux) + b * ux + (c - a) * uy * (1 - ux) + (d - b) * ux * uy
53
54END FUNCTION
55
56' Get pseudorandom value
57FUNCTION rand (x AS SINGLE, y AS SINGLE)
58
59  m = SIN(x * 12.9898 + y * 78.233) * 43758.54531229992#
60  rand = m - INT(m)
61
62END FUNCTION