Skip to content

Instantly share code, notes, and snippets.

@PatrickMurphy
Last active February 12, 2017 06:42
Show Gist options
  • Save PatrickMurphy/508f4102a62069acaa5912c336f338bd to your computer and use it in GitHub Desktop.
Save PatrickMurphy/508f4102a62069acaa5912c336f338bd to your computer and use it in GitHub Desktop.
Cubic Noise
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;
}
}
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