aurorae2
Now with randomized variations on the horizon palette and procedural terrain.
class TerrainGen {
static final int maxDepth = 6;
static final float spreadX = 0.75f;
static final float spreadY = 0.35f;
static private void gen(float[] xs,
float[] ys,
float leftX,
float rightX,
float leftY,
float rightY,
int idx,
int depth) {
if(depth > 0) {
float fracX = (1-spreadX)*0.5f + spreadX*(float)Math.random();
float midX = (1-fracX)*leftX + fracX*rightX;
float midY = (1-fracX)*leftY + fracX*rightY;
float midYPrime = midY + spreadY*(float)Math.random()/(1<<depth);
gen(xs, ys, leftX, midX, leftY, midYPrime, idx, depth-1);
gen(xs, ys, midX, rightX, midYPrime, rightY, idx+(1<<(depth-1)), depth-1);
} else {
xs[idx] = (leftX+rightX)/2;
ys[idx] = (leftY+rightY)/2;
}
}
static public float[] gen() {
int terms = 1 << maxDepth;
float[] xs = new float[terms];
float[] ys = new float[terms];
gen(xs, ys, 0f, 1f, 0.5f, 0.5f, 0, maxDepth);
float[] result = new float[4*terms+4+4];
result[0] = 0.0f;
result[1] = transfer(0.5f, 0);
result[2] = 0.0f;
result[3] = 0.0f;
for(int i = 0; i < terms; i++) {
result[4*i+4 + 0] = xs[i];
result[4*i+4 + 1] = transfer(ys[i], (float)(i+0.5)/terms);
result[4*i+4 + 2] = xs[i];
result[4*i+4 + 3] = 0;
}
result[4*terms + 0] = 1.0f;
result[4*terms + 1] = transfer(0.5f, 1f);
result[4*terms + 2] = 1.0f;
result[4*terms + 3] = 0.0f;
return result;
}
static float transfer(float h, float d) {
return 0.2f*(float)Math.pow(h,5) + 0.2f*(d-0.5f)*(d-0.5f);
}
}
aurorae2
Now with randomized variations on the horizon palette and procedural terrain.
class TerrainGen {
static final int maxDepth = 6;
static final float spreadX = 0.75f;
static final float spreadY = 0.35f;
static private void gen(float[] xs,
float[] ys,
float leftX,
float rightX,
float leftY,
float rightY,
int idx,
int depth) {
if(depth > 0) {
float fracX = (1-spreadX)*0.5f + spreadX*(float)Math.random();
float midX = (1-fracX)*leftX + fracX*rightX;
float midY = (1-fracX)*leftY + fracX*rightY;
float midYPrime = midY + spreadY*(float)Math.random()/(1<<depth);
gen(xs, ys, leftX, midX, leftY, midYPrime, idx, depth-1);
gen(xs, ys, midX, rightX, midYPrime, rightY, idx+(1<<(depth-1)), depth-1);
} else {
xs[idx] = (leftX+rightX)/2;
ys[idx] = (leftY+rightY)/2;
}
}
static public float[] gen() {
int terms = 1 << maxDepth;
float[] xs = new float[terms];
float[] ys = new float[terms];
gen(xs, ys, 0f, 1f, 0.5f, 0.5f, 0, maxDepth);
float[] result = new float[4*terms+4+4];
result[0] = 0.0f;
result[1] = transfer(0.5f, 0);
result[2] = 0.0f;
result[3] = 0.0f;
for(int i = 0; i < terms; i++) {
result[4*i+4 + 0] = xs[i];
result[4*i+4 + 1] = transfer(ys[i], (float)(i+0.5)/terms);
result[4*i+4 + 2] = xs[i];
result[4*i+4 + 3] = 0;
}
result[4*terms + 0] = 1.0f;
result[4*terms + 1] = transfer(0.5f, 1f);
result[4*terms + 2] = 1.0f;
result[4*terms + 3] = 0.0f;
return result;
}
static float transfer(float h, float d) {
return 0.2f*(float)Math.pow(h,5) + 0.2f*(d-0.5f)*(d-0.5f);
}
}