Revision fba30097ae6ca68f2e397f176863fb3d3edd301c authored by Jonas on 04 October 2023, 14:52:00 UTC, committed by Jonas on 04 October 2023, 14:52:00 UTC
1 parent 384285f
sosnoise.py
from numba import njit
from math import cos, exp, sin, pi
from random import gauss, seed, uniform
from common import vec2, vec4
from numpy import empty, dot
dir = []
def init_noise_vectors(N):
'''Initialize random vectors used to generate the 2D sine waves that form the basis of the noise'''
# The sum-of-sines noise depends on random vectors. This seed has been observed to work
# well as the basis of the noise function that we use to produce the curl noise
seed(25)
global dir
dir = empty((N,4))
sigma = 7
for i in range(N):
alpha = uniform(0, 2*pi)
w = gauss(mu=0,sigma=sigma)
v_2d = vec2(cos(alpha), sin(alpha))*(sigma+w)
v = vec4(v_2d[0], v_2d[1],exp(-w*w/sigma**2), uniform(0,2*pi))
dir[i] = v
init_noise_vectors(256)
@njit
def sos_noise(x):
'''Noise function. Simply sums a number of sine functions'''
I = 0.0
for d in dir:
I += sin(dot(x,d[0:2])+d[3])*d[2]
return 0.5 + 0.5 * (I / float(len(dir)))
@njit
def sos_noise_grad(p):
x = p[0:2]
'''Gradient of noise function computed analytically'''
g = vec2(0,0)
for d in dir:
g += d[2]*d[0:2]*cos(dot(x,d[0:2])+d[3])
return 0.5 * g / len(dir) 
Computing file changes ...