From 2afd89dbf3664d8c1564cc7627e3085a53e3a842 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Oudin?= Date: Tue, 13 Feb 2018 23:38:24 +0100 Subject: [PATCH] Fractional Brownian Motion --- PerlinNoise.cpp | 17 ++++++++++++++++- PerlinNoise.hpp | 2 ++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/PerlinNoise.cpp b/PerlinNoise.cpp index b649bf9..059d86d 100644 --- a/PerlinNoise.cpp +++ b/PerlinNoise.cpp @@ -44,7 +44,7 @@ PerlinNoise::PerlinNoise(unsigned int seed) : ImplicitSurface(Point(0,0,0)) { } double PerlinNoise::operator() (double x, double y, double z) const { - return z - noise(x, 0, y); + return z - fBm(x, 0, y, 2, 0.3, 2.0); } double PerlinNoise::noise(double _x, double _y, double _z) const { @@ -111,6 +111,21 @@ double PerlinNoise::grad(int hash, double x, double y, double z) const { return ((h & 1) == 0 ? u : -u) + ((h & 2) == 0 ? v : -v); } +double PerlinNoise::fBm(double x, double y, double z, int octaves, double + lacunarity, double gain) const { + double amplitude = 1.0; + double frequency = 1.0; + double sum = 0.0; + for(int i = 0; i < octaves; ++i) + { +// sum += amplitude * (1-abs(noise(x * frequency, y * frequency, z * frequency))); + sum += amplitude * noise(x * frequency, y * frequency, z * frequency); + amplitude *= gain; + frequency *= lacunarity; + } + return sum; +} + Point PerlinNoise::normal_vector(double x, double y) { double n_x_y = noise(x, y, 0); double n_dx_y = noise(x + 0.01, y, 0); diff --git a/PerlinNoise.hpp b/PerlinNoise.hpp index 00e613c..47bc41b 100644 --- a/PerlinNoise.hpp +++ b/PerlinNoise.hpp @@ -16,6 +16,8 @@ class PerlinNoise : public ImplicitSurface { double operator() (double _x, double _y, double _z) const; double noise(double x, double y) const; Point normal_vector(double x, double y); + double fBm(double x, double y, double z, int octaves, double + lacunarity, double gain) const; virtual Point location_hint() const; Point location_hint(double x, double z) const;