Implemented Harmonic Perlin Noise
This commit is contained in:
		
							parent
							
								
									01e8b9f8d3
								
							
						
					
					
						commit
						1516cb765d
					
				@ -90,10 +90,10 @@ class SDE_Noise():
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Perlin_Noise():
 | 
					class Perlin_Noise():
 | 
				
			||||||
    def __init__(self, known_shape=None, scale=0.1, octaves=1):
 | 
					    def __init__(self, known_shape=None, scale=0.1, octave=1):
 | 
				
			||||||
        self.known_shape = known_shape
 | 
					        self.known_shape = known_shape
 | 
				
			||||||
        self.scale = scale
 | 
					        self.scale = scale
 | 
				
			||||||
        self.octaves = octaves
 | 
					        self.octave = octave
 | 
				
			||||||
        self.magic = 3.141592653589  # Axis offset, should be (kinda) irrational
 | 
					        self.magic = 3.141592653589  # Axis offset, should be (kinda) irrational
 | 
				
			||||||
        # We want to genrate samples, that approx ~N(0,1)
 | 
					        # We want to genrate samples, that approx ~N(0,1)
 | 
				
			||||||
        self.normal_factor = 14/99
 | 
					        self.normal_factor = 14/99
 | 
				
			||||||
@ -102,9 +102,30 @@ class Perlin_Noise():
 | 
				
			|||||||
    def __call__(self, shape):
 | 
					    def __call__(self, shape):
 | 
				
			||||||
        self.index += 1
 | 
					        self.index += 1
 | 
				
			||||||
        noise = [self.noise([self.index*self.scale, self.magic*a]) / self.normal_factor
 | 
					        noise = [self.noise([self.index*self.scale, self.magic*a]) / self.normal_factor
 | 
				
			||||||
                 for a in range(self.known_shape[-1])]
 | 
					                 for a in range(shape[-1])]
 | 
				
			||||||
        return th.Tensor(noise)
 | 
					        return th.Tensor(noise)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def reset(self):
 | 
					    def reset(self):
 | 
				
			||||||
        self.index = 0
 | 
					        self.index = 0
 | 
				
			||||||
        self.noise = PerlinNoise(octaves=self.octaves)
 | 
					        self.noise = PerlinNoise(octaves=self.octave)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Harmonic_Perlin_Noise():
 | 
				
			||||||
 | 
					    def __init__(self, known_shape=None, scale=0.1, octaves=8):
 | 
				
			||||||
 | 
					        self.known_shape = known_shape
 | 
				
			||||||
 | 
					        self.scale = scale
 | 
				
			||||||
 | 
					        if type(octaves) == int:
 | 
				
			||||||
 | 
					            octaves = [1/(i+1) for i in range(octaves)]
 | 
				
			||||||
 | 
					        octaves = np.array(octaves)
 | 
				
			||||||
 | 
					        self.octaves = octaves / np.linalg.norm(octaves)
 | 
				
			||||||
 | 
					        self.reset()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __call__(self, shape):
 | 
				
			||||||
 | 
					        harmonics = [noise(shape)*self.octaves[i] for i, noise in enumerate(self.noises)]
 | 
				
			||||||
 | 
					        return sum(harmonics)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def reset(self):
 | 
				
			||||||
 | 
					        self.index = 0
 | 
				
			||||||
 | 
					        self.noises = []
 | 
				
			||||||
 | 
					        for octave, amplitude in enumerate(self.octaves):
 | 
				
			||||||
 | 
					            self.noises += [Perlin_Noise(known_shape=self.known_shape, scale=self.scale, octave=(octave+1))]
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user