Revision 384285f1e4152e7b962f0081e629c268bb50d8d7 authored by Jonas on 04 October 2023, 08:33:42 UTC, committed by Jonas on 04 October 2023, 08:33:42 UTC
1 parent ad43f9c
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 ...