§ Основа алгоритма
Суть этого алгоритма крайне проста. С помощью специальной функции псевдогенератора случайных чисел генерируется сетка из значений. Для каждого значения извлекается методом линейной или квадратной (или кубической) интерполяции значение и складывается с несколькими такими октавами разной частоты.Алгоритм очень прост.
§ Программа на 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