18-02-2017, 21:55
Вот собственно код функции, которая создает эту красоту. К ней достаточно создать двумерный квадратный массив world, и указать в вызове функции в переменную max. Размеры массива - степени 4 и плюс единица (поскольку С++ ведет счет с нуля).
4,8,16,32,64,128,256,512,1024,2048, и т.д.
ins -костыль, проверяет первая ли интерация, и заполняет углы случайными значениями если это так.
void SquareDiamond(int max)
{
boolean ins=true;
double A,B,D,C,E,F,G,H,I;
srand(time(NULL));
int n=1,xmin, ymin,xmax,ymax,xmid,ymid;
for (int step=max; step>=1; step/=2)
{
for (int y=0; y<n; y++)
{
for (int x=0; x<n; x++)
{
xmin=x*step;
ymin=y*step;
xmax=xmin+step;
ymax=ymin+step;
xmid=(xmin+xmax)/2;
ymid=(ymin+ymax)/2;
if (ins==true){
world[xmin][ymin]=(rand()%max/2)-(rand()%max/4);
world[xmax][ymin]=(rand()%max/2)-(rand()%max/4);
world[xmax][ymax]=(rand()%max/2)-(rand()%max/4);
world[xmin][ymax]=(rand()%max/2)-(rand()%max/4);
ins=false;}
A=world[xmin][ymin];
B=world[xmax][ymin];
D=world[xmax][ymax];
C=world[xmin][ymax];
E=((A+B+C+D)/4)+(rand()%step/2)-(rand()%step/4);
world[xmid][ymid]=E;
F=((A+C+E)/3)+(rand()%step/2)-(rand()%step/4);
G=((A+B+E)/3)+(rand()%step/2)-(rand()%step/4);
H=((B+D+E)/3)+(rand()%step/2)-(rand()%step/4);
I=((C+D+E)/3)+(rand()%step/2)-(rand()%step/4);
world[xmin][ymid]=F;
world[xmid][ymin]=G;
world[xmax][ymid]=H;
world[xmid][ymax]=I;
}
}
if (n<=max-1) n=n*2;
}
ins=true;
}
4,8,16,32,64,128,256,512,1024,2048, и т.д.
ins -костыль, проверяет первая ли интерация, и заполняет углы случайными значениями если это так.
void SquareDiamond(int max)
{
boolean ins=true;
double A,B,D,C,E,F,G,H,I;
srand(time(NULL));
int n=1,xmin, ymin,xmax,ymax,xmid,ymid;
for (int step=max; step>=1; step/=2)
{
for (int y=0; y<n; y++)
{
for (int x=0; x<n; x++)
{
xmin=x*step;
ymin=y*step;
xmax=xmin+step;
ymax=ymin+step;
xmid=(xmin+xmax)/2;
ymid=(ymin+ymax)/2;
if (ins==true){
world[xmin][ymin]=(rand()%max/2)-(rand()%max/4);
world[xmax][ymin]=(rand()%max/2)-(rand()%max/4);
world[xmax][ymax]=(rand()%max/2)-(rand()%max/4);
world[xmin][ymax]=(rand()%max/2)-(rand()%max/4);
ins=false;}
A=world[xmin][ymin];
B=world[xmax][ymin];
D=world[xmax][ymax];
C=world[xmin][ymax];
E=((A+B+C+D)/4)+(rand()%step/2)-(rand()%step/4);
world[xmid][ymid]=E;
F=((A+C+E)/3)+(rand()%step/2)-(rand()%step/4);
G=((A+B+E)/3)+(rand()%step/2)-(rand()%step/4);
H=((B+D+E)/3)+(rand()%step/2)-(rand()%step/4);
I=((C+D+E)/3)+(rand()%step/2)-(rand()%step/4);
world[xmin][ymid]=F;
world[xmid][ymin]=G;
world[xmax][ymid]=H;
world[xmid][ymax]=I;
}
}
if (n<=max-1) n=n*2;
}
ins=true;
}