Diamond-square Algorithm Not Working (rewrite Code From Js To Java)
Solution 1:
I was coding this same thing yesterday (from the same source) and the recursive approach is really tricky due to square step overlaps of the subdivided areas and the irregularities in the same step. So I decided to do this from scratch the iterative way (which is much faster due to no heap/stack trashing in my programing environment) as you can see I am down from 130 lines to around 50 with comments.
This is how I do it (non recursively) in C++:
voiddiamond_square(int size){
picture pic;
int x,y,xx,yy,xs,ys,d,d2,r;
for (xs=1;xs<size;xs<<=1); xs>>=1; ys=xs; // align to power of 2
pic.resize(xs+1,ys+1); pic.pf=_pf_u; // resize image to power of 2 +1
d=xs; d2=d>>1; r=128; // init step,half step and randomnessRandomize();
pic.p[ 0][ 0].dd=r; // set corners values (should be random but I want this)
pic.p[ 0][xs].dd=r;
pic.p[ys][ 0].dd=r;
pic.p[ys][xs].dd=r;
for (;d2;d=d2,d2>>=1) // subdivide step until full image is filled
{
// diamondfor (y=d2,yy=ys-d2;y<=yy;y+=d)
for (x=d2,xx=xs-d2;x<=xx;x+=d)
pic.p[y][x].dd=((pic.p[y-d2][x-d2].dd+pic.p[y-d2][x+d2].dd+pic.p[y+d2][x-d2].dd+pic.p[y+d2][x+d2].dd)>>2)+Random(r);
// squarefor (y=d2,yy=ys-d2;y<=yy;y+=d)
for (x=d ,xx=xs-d ;x<=xx;x+=d)
pic.p[y][x].dd=((pic.p[y][x-d2].dd+pic.p[y][x+d2].dd+pic.p[y-d2][x].dd+pic.p[y+d2][x].dd)>>2)+Random(r);
for (y=d ,yy=ys-d ;y<=yy;y+=d)
for (x=d2,xx=xs-d2;x<=xx;x+=d)
pic.p[y][x].dd=((pic.p[y][x-d2].dd+pic.p[y][x+d2].dd+pic.p[y-d2][x].dd+pic.p[y+d2][x].dd)>>2)+Random(r);
for (x=d2,xx=xs-d2;x<=xx;x+=d)
{
y= 0; pic.p[y][x].dd=((pic.p[y][x-d2].dd+pic.p[y][x+d2].dd+pic.p[y+d2][x].dd)/3)+Random(r);
y=ys; pic.p[y][x].dd=((pic.p[y][x-d2].dd+pic.p[y][x+d2].dd+pic.p[y-d2][x].dd)/3)+Random(r);
}
for (y=d2,yy=ys-d2;y<=yy;y+=d)
{
x= 0; pic.p[y][x].dd=((pic.p[y][x+d2].dd+pic.p[y-d2][x].dd+pic.p[y+d2][x].dd)/3)+Random(r);
x=xs; pic.p[y][x].dd=((pic.p[y][x-d2].dd+pic.p[y-d2][x].dd+pic.p[y+d2][x].dd)/3)+Random(r);
}
// adjust randomness
r=(r*220)>>8; if (r<2) r=2;
}
// here pic holds the terrain map
}
I use my own picture
class so here some members:
resize(xs,ys)
resize image to new resolutionp[ys][xs].dd
is pixel access in form of 32 unsigned intsDWORD
pf
is pixel format (you can ignore this)
This is the result for diamond_square(513);
You can play with the r
randomnes initial and adjustment values to change behavior. Also you can change the initial corner values.
Beware the local int xs,ys
variables in my program holds the power of 2 values not the power of 2 +1 !!!
Post a Comment for "Diamond-square Algorithm Not Working (rewrite Code From Js To Java)"