private void square(Layer2DObject layer, int size, float ap, int depth, IRandom2 rand) { int squareSize = (int)(size * JryMath.Pow(.5f, depth)); int squareHalfSize = (int)(squareSize / 2); for (int iy = 0; iy < JryMath.Pow(2, depth); iy++) { for (int ix = 0; ix < JryMath.Pow(2, depth); ix++) { var xCorL = ix * squareSize; var xCorR = (ix + 1) * squareSize; var yCorT = iy * squareSize; var yCorB = (iy + 1) * squareSize; var tl = layer[xCorL, yCorT].Value; var bl = layer[xCorL, yCorB].Value; var tr = layer[xCorR, yCorT].Value; var br = layer[xCorR, yCorB].Value; int xph = xCorL + squareHalfSize; int yph = yCorT + squareHalfSize; var c = (tl + tr + br + bl) / 4 + rnd(rand, xph, yph) * ap; var b = (br + bl + c + getClipped(layer, xph, yph + squareSize)) / 4 + rnd(rand, xph, yph + squareSize) * ap; var t = (tr + tl + c + getClipped(layer, xph, yph - squareSize)) / 4 + rnd(rand, xph, yph - squareSize) * ap; var r = (tr + br + c + getClipped(layer, xph + squareSize, yph)) / 4 + rnd(rand, xph + squareSize, yph) * ap; var l = (tl + bl + c + getClipped(layer, xph - squareSize, yph)) / 4 + rnd(rand, xph - squareSize, yph) * ap; layer[xph, yCorT] = t; layer[xph, yCorB] = b; layer[xCorL, yph] = l; layer[xCorR, yph] = r; } } }
public SegmentDivider(IRandom2 random, int amplitude, float persistance) { _random = random; _amplitude = amplitude; _persistance = persistance; }
private void diamond(ILayer layer, int size, float ap, int l, IRandom2 rand) { int squareSize = (int)(size * JryMath.Pow(.5f, l)); int squareHalfSize = (int)(squareSize / 2); for (int iy = 0; iy < JryMath.Pow(2, l); iy++) { for (int ix = 0; ix < JryMath.Pow(2, l); ix++) { var xCorL = ix * squareSize; var xCorR = (ix + 1) * squareSize; var yCorT = iy * squareSize; var yCorB = (iy + 1) * squareSize; var tl = layer[xCorL, yCorT].Value; var bl = layer[xCorL, yCorB].Value; var tr = layer[xCorR, yCorT].Value; var br = layer[xCorR, yCorB].Value; int xph = xCorL + squareHalfSize; int yph = yCorT + squareHalfSize; var c = (tl + tr + br + bl) / 4 + rnd(rand, xph, yph) * ap; layer[xph, yph] = c; } } }
private void setupBaseDS(int sizePow2, Layer2DObject layer, IRandom2 rand) { int blockSize = sizePow2; int xstart = 0; int ystart = 0; int xend = xstart + blockSize - 1; int yend = ystart + blockSize - 1; var tl = rnd(rand, xstart, ystart); var tr = rnd(rand, xend, ystart); var bl = rnd(rand, xstart, yend); var br = rnd(rand, xend, yend); layer[xend, ystart] = tr; layer[xstart, yend] = bl; layer[xstart, ystart] = tl; layer[xend, yend] = br; }
private void ds(Layer2DObject layer, int sizePow2, float ba, INoiseParameters np, IRandom2 rand) { int size = sizePow2 - 1; int log = (int)JryMath.Log(size, 2); // HACK var x = np as DsNoiseParameters; for (int l = 0; l < log; l++) { if (l == 0 && x != null) { hackeddiamond(layer, ba, x.HillProbability); } else { diamond(layer, size, ba, l, rand); } square(layer, size, ba, l, rand); ba *= np.Amplitude; if (l >= np.ToDepth) { ba *= np.Amplitude; } } }
private static float rnd(IRandom2 r, int x, int y) { var rr = r.NextD(x, y); return(rr - .5f); }
public DiamondSquare(IRandom2 rand) { _rand = rand; }