Start atlas
This commit is contained in:
52
util/perlin.c
Normal file
52
util/perlin.c
Normal file
@@ -0,0 +1,52 @@
|
||||
|
||||
#include <math.h>
|
||||
|
||||
double rawnoise(int n) {
|
||||
n = (n << 13) ^ n;
|
||||
return (1.0 - ((n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff) / 1073741824.0);
|
||||
}
|
||||
|
||||
double noise2d(int x, int y, int octave, int seed) {
|
||||
return rawnoise(x * 1619 + y * 31337 + octave * 3463 + seed * 13397);
|
||||
}
|
||||
|
||||
double interpolate(double a, double b, double x) {
|
||||
double f = (1 - cos(x * 3.141593)) * 0.5;
|
||||
|
||||
return a * (1 - f) + b * f;
|
||||
}
|
||||
|
||||
double smooth2d(double x, double y, int octave, int seed) {
|
||||
int intx = (int) x;
|
||||
double fracx = x - intx;
|
||||
int inty = (int) y;
|
||||
double fracy = y - inty;
|
||||
|
||||
double v1 = noise2d(intx, inty, octave, seed);
|
||||
double v2 = noise2d(intx + 1, inty, octave, seed);
|
||||
double v3 = noise2d(intx, inty + 1, octave, seed);
|
||||
double v4 = noise2d(intx + 1, inty + 1, octave, seed);
|
||||
|
||||
double i1 = interpolate(v1, v2, fracx);
|
||||
double i2 = interpolate(v3, v4, fracx);
|
||||
|
||||
return interpolate(i1, i2, fracy);
|
||||
}
|
||||
|
||||
|
||||
double pnoise2d(double x, double y, double persistence, int octaves, int seed) {
|
||||
double total = 0.0;
|
||||
double frequency = 1.0;
|
||||
double amplitude = 1.0;
|
||||
double max = 0.0;
|
||||
|
||||
for (int i = 0; i < octaves; i++) {
|
||||
total += smooth2d(x * frequency, y * frequency, i, seed) * amplitude;
|
||||
max += amplitude;
|
||||
frequency /= 2.0;
|
||||
amplitude *= persistence;
|
||||
}
|
||||
|
||||
// Normalize to [0, 1]
|
||||
return (total + max) / (2.0 * max);
|
||||
}
|
Reference in New Issue
Block a user