public static Channel CratersAlgo(int sizeX, int sizeY, int numCraters, int seed) { Channel chan = new Channel(sizeX, sizeY); Console.WriteLine(); Random rand = new Random(seed); for (int i = 0; i < numCraters; ) { int x = rand.Next(0, sizeX); int y = rand.Next(0, sizeY); double radius = (rand.NextDouble() * 84.0) - 20; // Clamp //x=(x<0) ? 0 : ((x>size-1) ? size-1 : x); //x=(y<0) ? 0 : ((y>size-1) ? size-1 : y); //radius=(radius<20.0) ? 20.0 : ((radius>84.0) ? 84.0 : radius); Channel crater = (new Crater(sizeX, sizeY, x, y, radius)).toChannel(); if (crater.findMax() != 1.0) { continue; } //if(crater.findMin()!=0.0) //{ // Console.Write("!"); // continue; //} i++; drawTextProgressBar(i, numCraters); //crater.toLayer().saveAsPNG("../sims/crater_debug.png"); chan.channelAdd(crater.normalize(-0.01f, 0.01f)); } chan.normalize(); Console.WriteLine("\nRange [{0},{1}]", chan.findMin(), chan.findMax()); return chan; }
public Channel getDistance(float c1, float c2, float c3) { Channel channel = new Channel(sizeX, sizeY); for (int y = 0; y < sizeY; y++) { for (int x = 0; x < sizeX; x++) { channel.putPixel(x, y, c1*dist1.getPixel(x, y) + c2*dist2.getPixel(x, y) + c3*dist3.getPixel(x, y)); } } return channel.normalize(); }
public Hill(int size,int xp,int yp,float radius) { double r=(double)radius; channel = new Channel(size,size); double hill_height=5.0d*(radius/40.0d); for(int x=0;x<size;x++) { for(int y=0;y<size;y++) { double dx = (double)(yp-x); double dy = (double)(xp-y); double dist = Math.Sqrt(dx*dx + dy*dy); if(dist<radius) { double height = 1.0d-((dx*dx + dy*dy) / (r*r)); height = (height*hill_height); channel.putPixel(x,y,Convert.ToSingle(height));//$radius^2 + (($x-$hx)^2 - ($y-(256-$hy))^2); } //channel.putPixel(x,y,(radius*radius) + (((x-dx)*(x-dx)) - ((y-dy)*(y-dy)))); } } channel.normalize(); }
public Midpoint(int size, int base_freq, float pers, long seed) { if(!Utils.isPowerOf2(size)) throw new Exception("size must be power of 2"); int iterations = Utils.powerOf2Log2(size); base_freq = Math.Max(base_freq, 0); base_freq = Math.Min(base_freq, iterations); random = new Random((int)seed); channel = new Channel(size, size); int x_block, y_block, x, y; if (base_freq > 0) { int block_size = size>>base_freq; for (x_block = 0; x_block < (1<<base_freq); x_block++) { for (y_block = 0; y_block < (1<<base_freq); y_block++) { x = x_block*block_size; y = y_block*block_size; channel.putPixel(x, y, (float)random.NextDouble()); } } } float v1, v2, v3, v4, v5, v6, v7, v8, v9; for (int i = base_freq; i < iterations; i++) { int block_size = size>>i; int block_size_half = size>>(i + 1); float amp = (float)Math.Pow(pers, i - base_freq); float amp_half = 0.5f*amp; // calculate center midpoints if (i < 2) { for (x_block = 0, x = 0; x_block < (1<<i); x_block++) { for (y_block = 0, y = 0; y_block < (1<<i); y_block++) { v1 = channel.getPixel(x, y); v2 = channel.getPixel((x + block_size) % size, y); v3 = channel.getPixel(x, (y + block_size) % size); v4 = channel.getPixel((x + block_size) % size, (y + block_size) % size); v5 = 0.25f*(v1 + v2 + v3 + v4) + (float)random.NextDouble()*amp - amp_half; channel.putPixel(x + block_size_half, y + block_size_half, v5); y+= block_size; } x+= block_size; } } else { // safe blocks for (x_block = 1, x = block_size; x_block < (1<<i) - 1; x_block++) { for (y_block = 1, y = block_size; y_block < (1<<i) - 1; y_block++) { v1 = channel.getPixel(x, y); v2 = channel.getPixel(x + block_size, y); v3 = channel.getPixel(x, y + block_size); v4 = channel.getPixel(x + block_size, y + block_size); v5 = 0.25f*(v1 + v2 + v3 + v4) + (float)random.NextDouble()*amp - amp_half; channel.putPixel(x + block_size_half, y + block_size_half, v5); y+= block_size; } x+= block_size; } // left and right edge blocks for (x_block = 0; x_block < (1<<i); x_block+= (1<<i) - 1) { x = x_block*block_size; for (y_block = 0, y = 0; y_block < (1<<i); y_block++) { v1 = channel.getPixel(x, y); v2 = channel.getPixel((x + block_size) % size, y); v3 = channel.getPixel(x, (y + block_size) % size); v4 = channel.getPixel((x + block_size) % size, (y + block_size) % size); v5 = 0.25f*(v1 + v2 + v3 + v4) + (float)random.NextDouble()*amp - amp_half; channel.putPixel(x + block_size_half, y + block_size_half, v5); y+= block_size; } } // top and bottom edge blocks for (x_block = 1, x = block_size; x_block < (1<<i) - 1; x_block++) { for (y_block = 0; y_block < (1<<i); y_block+= (1<<i) - 1) { y = y_block*block_size; v1 = channel.getPixel(x, y); v2 = channel.getPixel((x + block_size) % size, y); v3 = channel.getPixel(x, (y + block_size) % size); v4 = channel.getPixel((x + block_size) % size, (y + block_size) % size); v5 = 0.25f*(v1 + v2 + v3 + v4) + (float)random.NextDouble()*amp - amp_half; channel.putPixel(x + block_size_half, y + block_size_half, v5); } x+= block_size; } } // calculate left and bottom edge midpoints if (i < 2) { for (x_block = 0, x = 0; x_block < (1<<i); x_block++) { for (y_block = 0, y = 0; y_block < (1<<i); y_block++) { v1 = channel.getPixel(x, y); v5 = channel.getPixel(x + block_size_half, y + block_size_half); v2 = channel.getPixel((x + block_size) % size, y); v3 = channel.getPixel(x, (y + block_size) % size); v6 = channel.getPixel(((x - block_size_half) + size) % size, (y + block_size_half) % size); v7 = channel.getPixel((x + block_size_half) % size, ((y - block_size_half) + size) % size); v8 = 0.25f*(v1 + v3 + v5 + v6) + (float)random.NextDouble()*amp - amp_half; v9 = 0.25f*(v1 + v2 + v5 + v7) + (float)random.NextDouble()*amp - amp_half; channel.putPixel(x, y + block_size_half, v8); channel.putPixel(x + block_size_half, y, v9); y+= block_size; } x+= block_size; } } else { // safe blocks for (x_block = 1, x = block_size; x_block < (1<<i) - 1; x_block++) { for (y_block = 1, y = block_size; y_block < (1<<i) - 1; y_block++) { v1 = channel.getPixel(x, y); v5 = channel.getPixel(x + block_size_half, y + block_size_half); v2 = channel.getPixel(x + block_size, y); v3 = channel.getPixel(x, y + block_size); v6 = channel.getPixel(x - block_size_half, y + block_size_half); v7 = channel.getPixel(x + block_size_half, y - block_size_half); v8 = 0.25f*(v1 + v3 + v5 + v6) + (float)random.NextDouble()*amp - amp_half; v9 = 0.25f*(v1 + v2 + v5 + v7) + (float)random.NextDouble()*amp - amp_half; channel.putPixel(x, y + block_size_half, v8); channel.putPixel(x + block_size_half, y, v9); y+= block_size; } x+= block_size; } // left and right edge blocks for (x_block = 0; x_block < (1<<i); x_block+= (1<<i) - 1) { x = x_block*block_size; for (y_block = 0, y = 0; y_block < (1<<i); y_block++) { v1 = channel.getPixel(x, y); v5 = channel.getPixel(x + block_size_half, y + block_size_half); v2 = channel.getPixel((x + block_size) % size, y); v3 = channel.getPixel(x, (y + block_size) % size); v6 = channel.getPixel(((x - block_size_half) + size) % size, (y + block_size_half) % size); v7 = channel.getPixel((x + block_size_half) % size, ((y - block_size_half) + size) % size); v8 = 0.25f*(v1 + v3 + v5 + v6) + (float)random.NextDouble()*amp - amp_half; v9 = 0.25f*(v1 + v2 + v5 + v7) + (float)random.NextDouble()*amp - amp_half; channel.putPixel(x, y + block_size_half, v8); channel.putPixel(x + block_size_half, y, v9); y+= block_size; } } // top and bottom edge blocks for (x_block = 1, x = block_size; x_block < (1<<i) - 1; x_block++) { for (y_block = 0; y_block < (1<<i); y_block+= (1<<i) - 1) { y = y_block*block_size; v1 = channel.getPixel(x, y); v5 = channel.getPixel(x + block_size_half, y + block_size_half); v2 = channel.getPixel((x + block_size) % size, y); v3 = channel.getPixel(x, (y + block_size) % size); v6 = channel.getPixel(((x - block_size_half) + size) % size, (y + block_size_half) % size); v7 = channel.getPixel((x + block_size_half) % size, ((y - block_size_half) + size) % size); v8 = 0.25f*(v1 + v3 + v5 + v6) + (float)random.NextDouble()*amp - amp_half; v9 = 0.25f*(v1 + v2 + v5 + v7) + (float)random.NextDouble()*amp - amp_half; channel.putPixel(x, y + block_size_half, v8); channel.putPixel(x + block_size_half, y, v9); } x+= block_size; } } } channel.normalize(); }
private void Gen(int sizeX, int sizeY, int base_freq, float pers, long seed, int x_o, int y_o) { if (!Utils.isPowerOf2(sizeX)) throw new Exception("sizeX must be power of 2"); if (!Utils.isPowerOf2(sizeY)) throw new Exception("sizeY must be power of 2"); int iterationsX = Utils.powerOf2Log2(sizeX); int iterationsY = Utils.powerOf2Log2(sizeY); base_freq = Math.Max(base_freq, 0); base_freq = Math.Min(base_freq, iterationsX); random = new Random((int)seed); channel = new Channel(sizeX, sizeY); int x_block, y_block, x, y; if (base_freq > 0) { int block_size = sizeX>>base_freq; for (int x_b = 0; x_b < (1<<base_freq); x_b++) { for (int y_b = 0; y_b < (1<<base_freq); y_b++) { x = x_b*block_size; y = y_b*block_size; channel.putPixel(x, y, (float)random.NextDouble()); } } } float v1, v2, v3, v4, v5, v6, v7, v8, v9; for (int i = base_freq; i < iterationsX; i++) { int block_size = sizeX>>i; int block_size_half = sizeX>>(i + 1); float amp = (float)Math.Pow(pers, i - base_freq); float amp_half = 0.5f*amp; float avr; // calculate center midpoints if (i < 2) { for (x_block = 0, x = 0; x_block < (1<<i); x_block++) { for (y_block = 0, y = 0; y_block < (1<<i); y_block++) { v1 = channel.getPixel(x, y); v2 = channel.getPixel((x + block_size) % sizeX, y); v3 = channel.getPixel(x, (y + block_size) % sizeY); v4 = channel.getPixel((x + block_size) % sizeX, (y + block_size) % sizeY); avr = 0.25f*(v1 + v2 + v3 + v4); v5 = avr*(1f + (float)random.NextDouble()*amp - amp_half); channel.putPixel(x + block_size_half, y + block_size_half, v5); y+= block_size; } x+= block_size; } } else { // safe blocks for (x_block = 1, x = block_size; x_block < (1<<i) - 1; x_block++) { for (y_block = 1, y = block_size; y_block < (1<<i) - 1; y_block++) { v1 = channel.getPixel(x, y); v2 = channel.getPixel(x + block_size, y); v3 = channel.getPixel(x, y + block_size); v4 = channel.getPixel(x + block_size, y + block_size); avr = 0.25f*(v1 + v2 + v3 + v4); v5 = avr*(1f + (float)random.NextDouble()*amp - amp_half); channel.putPixel(x + block_size_half, y + block_size_half, v5); y+= block_size; } x+= block_size; } // left and right edge blocks for (x_block = 0; x_block < (1<<i); x_block+= (1<<i) - 1) { x = x_block*block_size; for (y_block = 0, y = 0; y_block < (1<<i); y_block++) { v1 = channel.getPixel(x, y); v2 = channel.getPixel((x + block_size) % sizeX, y); v3 = channel.getPixel(x, (y + block_size) % sizeY); v4 = channel.getPixel((x + block_size) % sizeX, (y + block_size) % sizeY); avr = 0.25f*(v1 + v2 + v3 + v4); v5 = avr*(1f + (float)random.NextDouble()*amp - amp_half); channel.putPixel(x + block_size_half, y + block_size_half, v5); y+= block_size; } } // top and bottom edge blocks for (x_block = 1, x = block_size; x_block < (1<<i) - 1; x_block++) { for (y_block = 0; y_block < (1<<i); y_block+= (1<<i) - 1) { y = y_block*block_size; v1 = channel.getPixel(x, y); v2 = channel.getPixel((x + block_size) % sizeX, y); v3 = channel.getPixel(x, (y + block_size) % sizeY); v4 = channel.getPixel((x + block_size) % sizeX, (y + block_size) % sizeY); avr = 0.25f*(v1 + v2 + v3 + v4); v5 = avr*(1f + (float)random.NextDouble()*amp - amp_half); channel.putPixel(x + block_size_half, y + block_size_half, v5); } x+= block_size; } } // calculate left and bottom edge midpoints if (i < 2) { for (x_block = 0, x = 0; x_block < (1<<i); x_block++) { for (y_block = 0, y = 0; y_block < (1<<i); y_block++) { v1 = channel.getPixel(x, y); v5 = channel.getPixel(x + block_size_half, y + block_size_half); v2 = channel.getPixel((x + block_size) % sizeX, y); v3 = channel.getPixel(x, (y + block_size) % sizeY); v6 = channel.getPixel(((x - block_size_half) + sizeX) % sizeX, (y + block_size_half) % sizeY); v7 = channel.getPixel((x + block_size_half) % sizeX, ((y - block_size_half) + sizeY) % sizeY); avr = 0.25f*(v1 + v3 + v5 + v6); v8 = avr*(1f + (float)random.NextDouble()*amp - amp_half); avr = 0.25f*(v1 + v2 + v5 + v7); v9 = avr*(1f + (float)random.NextDouble()*amp - amp_half); channel.putPixel(x, y + block_size_half, v8); channel.putPixel(x + block_size_half, y, v9); y+= block_size; } x+= block_size; } } else { // safe blocks for (x_block = 1, x = block_size; x_block < (1<<i) - 1; x_block++) { for (y_block = 1, y = block_size; y_block < (1<<i) - 1; y_block++) { v1 = channel.getPixel(x, y); v5 = channel.getPixel(x + block_size_half, y + block_size_half); v2 = channel.getPixel(x + block_size, y); v3 = channel.getPixel(x, y + block_size); v6 = channel.getPixel(x - block_size_half, y + block_size_half); v7 = channel.getPixel(x + block_size_half, y - block_size_half); avr = 0.25f*(v1 + v3 + v5 + v6); v8 = avr*(1f + (float)random.NextDouble()*amp - amp_half); avr = 0.25f*(v1 + v2 + v5 + v7); v9 = avr*(1f + (float)random.NextDouble()*amp - amp_half); channel.putPixel(x, y + block_size_half, v8); channel.putPixel(x + block_size_half, y, v9); y+= block_size; } x+= block_size; } // left and right edge blocks for (x_block = 0; x_block < (1<<i); x_block+= (1<<i) - 1) { x = x_block*block_size; for (y_block = 0, y = 0; y_block < (1<<i); y_block++) { v1 = channel.getPixel(x, y); v5 = channel.getPixel(x + block_size_half, y + block_size_half); v2 = channel.getPixel((x + block_size) % sizeX, y); v3 = channel.getPixel(x, (y + block_size) % sizeY); v6 = channel.getPixel(((x - block_size_half) + sizeX) % sizeX, (y + block_size_half) % sizeY); v7 = channel.getPixel((x + block_size_half) % sizeX, ((y - block_size_half) + sizeY) % sizeY); avr = 0.25f*(v1 + v3 + v5 + v6); v8 = avr*(1f + (float)random.NextDouble()*amp - amp_half); avr = 0.25f*(v1 + v2 + v5 + v7); v9 = avr*(1f + (float)random.NextDouble()*amp - amp_half); channel.putPixel(x, y + block_size_half, v8); channel.putPixel(x + block_size_half, y, v9); y+= block_size; } } // top and bottom edge blocks for (x_block = 1, x = block_size; x_block < (1<<i) - 1; x_block++) { for (y_block = 0; y_block < (1<<i); y_block+= (1<<i) - 1) { y = y_block*block_size; v1 = channel.getPixel(x, y); v5 = channel.getPixel(x + block_size_half, y + block_size_half); v2 = channel.getPixel((x + block_size) % sizeX, y); v3 = channel.getPixel(x, (y + block_size) % sizeY); v6 = channel.getPixel(((x - block_size_half) + sizeX) % sizeX, (y + block_size_half) % sizeY); v7 = channel.getPixel((x + block_size_half) % sizeX, ((y - block_size_half) + sizeY) % sizeY); avr = 0.25f*(v1 + v3 + v5 + v6); v8 = avr*(1f + (float)random.NextDouble()*amp - amp_half); avr = 0.25f*(v1 + v2 + v5 + v7); v9 = avr*(1f + (float)random.NextDouble()*amp - amp_half); channel.putPixel(x, y + block_size_half, v8); channel.putPixel(x + block_size_half, y, v9); } x+= block_size; } } } float[] mm=channel.findMinMax(); //Console.WriteLine("Range Mountain->[{0},{1}]",mm[0],mm[1]); channel.normalize(); mm=channel.findMinMax(); //Console.WriteLine("Range Mountain->[{0},{1}]",mm[0],mm[1]); }
public static Channel HillsAlgo(int sizeX, int sizeY, int numHills, int seed) { Console.WriteLine(); Channel chan = new Channel(sizeX, sizeY); Random rand = new Random(seed); for (int i = 0; i < numHills; ) { int x = rand.Next(0, sizeX); int y = rand.Next(0, sizeY); double radius = ((rand.NextDouble() * 84.0) - 20); Channel crater = (new Hill(sizeX, sizeY, x, y, (float)radius)).toChannel(); if (crater.findMax() != 1.0) { continue; } i++; drawTextProgressBar(i, numHills); //crater.toLayer().saveAsPNG("../sims/crater_debug.png"); chan.channelAdd(crater.normalize(0f, 0.01f)); } chan.normalize(); Console.WriteLine("\nRange [{0},{1}]", chan.findMin(), chan.findMax()); return chan; }