Last active
February 12, 2017 06:42
-
-
Save PatrickMurphy/508f4102a62069acaa5912c336f338bd to your computer and use it in GitHub Desktop.
Cubic Noise
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
final int CUBIC_NOISE_RAND_A = 134775813; | |
final int CUBIC_NOISE_RAND_B = 1103515245; | |
class CubicNoise { | |
class cubicNoiseConfig { | |
public long seed; | |
public int octave; | |
public int periodx; | |
public int periody; | |
} | |
float cubicNoiseRandom(long seed, int x, int y) { | |
return (float) | |
((((x ^ y) * CUBIC_NOISE_RAND_A) ^ (seed + x)) * | |
(((CUBIC_NOISE_RAND_B * x) << 16) ^ (CUBIC_NOISE_RAND_B * y) - CUBIC_NOISE_RAND_A)) / | |
Long.MAX_VALUE; | |
} | |
int cubicNoiseTile(int coordinate, int period) { | |
return coordinate % period; | |
} | |
float cubicNoiseInterpolate(float a, float b, float c, float d, float x) { | |
float p = (d - c) - (a - b); | |
return x * x * x * p + x * x * ((a - b) - p) + x * (c - a) + b; | |
} | |
cubicNoiseConfig cubicNoiseConfig1D(long seed, int octave, int period) { | |
cubicNoiseConfig config = new cubicNoiseConfig(); | |
config.seed = seed; | |
config.octave = octave; | |
config.periodx = period / octave; | |
return config; | |
} | |
cubicNoiseConfig cubicNoiseConfig2D(long seed, int octave, int periodx, int periody) { | |
cubicNoiseConfig config = new cubicNoiseConfig(); | |
config.seed = seed; | |
config.octave = octave; | |
config.periodx = periodx / octave; | |
config.periody = periody / octave; | |
return config; | |
} | |
float cubicNoiseSample1D(cubicNoiseConfig config, float x) { | |
int xi = (int)(x / config.octave); | |
float lerp = x / config.octave - xi; | |
return cubicNoiseInterpolate( | |
cubicNoiseRandom(config.seed, cubicNoiseTile(xi - 1, config.periodx), 0), | |
cubicNoiseRandom(config.seed, cubicNoiseTile(xi, config.periodx), 0), | |
cubicNoiseRandom(config.seed, cubicNoiseTile(xi + 1, config.periodx), 0), | |
cubicNoiseRandom(config.seed, cubicNoiseTile(xi + 2, config.periodx), 0), | |
lerp) * 0.5 + 0.25; | |
} | |
float cubicNoiseSample2D(cubicNoiseConfig config, float x, float y) { | |
int i; | |
int xi = (int)Math.floor(x / config.octave); | |
float lerpx = x / config.octave - xi; | |
int yi = (int)Math.floor(y / config.octave); | |
float lerpy = y / config.octave - yi; | |
float[] xSamples = new float[4]; | |
for (i = 0; i < 4; ++i) | |
xSamples[i] = cubicNoiseInterpolate( | |
cubicNoiseRandom(config.seed, | |
cubicNoiseTile(xi - 1, config.periodx), | |
cubicNoiseTile(yi - 1 + i, config.periody)), | |
cubicNoiseRandom(config.seed, | |
cubicNoiseTile(xi, config.periodx), | |
cubicNoiseTile(yi - 1 + i, config.periody)), | |
cubicNoiseRandom(config.seed, | |
cubicNoiseTile(xi + 1, config.periodx), | |
cubicNoiseTile(yi - 1 + i, config.periody)), | |
cubicNoiseRandom(config.seed, | |
cubicNoiseTile(xi + 2, config.periodx), | |
cubicNoiseTile(yi - 1 + i, config.periody)), | |
lerpx); | |
return (cubicNoiseInterpolate(xSamples[0], xSamples[1], xSamples[2], xSamples[3], lerpy) * 0.5) + 0.25; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
float[][] noise_map; | |
int rows = 200; | |
int cols = 200; | |
int cellScale; | |
CubicNoise cn; | |
void setup() { | |
size(800, 800); | |
cellScale = width/cols; | |
noise_map = new float[cols][rows]; | |
cn = new CubicNoise(); | |
generateMap(); | |
} | |
void generateMap() { | |
long seedval = (long)(random(0, 1)*102120312); | |
// seedval = 0; | |
println(seedval); | |
CubicNoise.cubicNoiseConfig config = cn.cubicNoiseConfig2D(seedval, 27, 200, 200); | |
float scale = .0012; | |
float high_val = -1000; | |
float low_val = 100000000; | |
long yoff = config.seed; | |
for (int y = 0; y<rows; y++) { | |
long xoff = config.seed; | |
for (int x = 0; x<cols; x++) { | |
//noise_map[x][y] = noise(x, y); | |
noise_map[x][y] = cn.cubicNoiseSample2D(config, x, y); | |
if (noise_map[x][y]>high_val) { | |
high_val = noise_map[x][y]; | |
} | |
if (noise_map[x][y] < low_val) { | |
low_val = noise_map[x][y]; | |
} | |
//println(noise_map[x][y]); | |
xoff += scale; | |
} | |
yoff += scale; | |
} | |
println(high_val, low_val); | |
} | |
void mousePressed() { | |
generateMap(); | |
} | |
void draw() { | |
background(0); | |
fill(255); | |
noStroke(); | |
for (int y = 0; y<rows; y++) { | |
for (int x = 0; x<cols; x++) { | |
float cellHeight = noise_map[x][y]; | |
fill(map(cellHeight, 0, 1, 0, 255)); | |
rect(x*cellScale, y*cellScale, cellScale, cellScale); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment