Я попытался создать программу, которая генерирует градиентный шум для генерации ландшафта. Он должен печатать массив чисел от 40 до 99, но на этом он останавливается:
for(int k=16; k>1; k/=2)
for(int y=Y; y<Y+16; y+=k+1)
for(int x=X; x<X+16; x+=k+1)
{
tab[y+k/2][x]=rand()%(max(tab[y][x],tab[y+16][x])-min(tab[y][x],tab[y+16][x]))+min(tab[y][x],tab[y+16][x]);
tab[y][x+k/2]=rand()%(max(tab[y][x],tab[y][x+16])-min(tab[y][x],tab[y][x+16]))+min(tab[y][x],tab[y][x+16]);
tab[y+k/2][x+k/2]=rand()%(max(tab[y][x],tab[y+16][x+16])-min(tab[y][x],tab[y+16][x+16]))+min(tab[y][x],tab[y+16][x+16]);
}
Когда я удаляю содержимое l oop, он не останавливается. Он хорошо компилируется, но возвращает -1 (0xFFFFFFFF)
Вот весь код:
#include<ctime>
#include<iostream>
using namespace std;
const short int Size=8;
short int tab[Size*16+1][Size*16+1];
void chunk(int X, int Y)
{
srand(time(NULL));
for(int k=16; k>1; k/=2)
for(int y=Y; y<Y+16; y+=k+1)
for(int x=X; x<X+16; x+=k+1)
{
tab[y+k/2][x]=rand()%(max(tab[y][x],tab[y+16][x])-min(tab[y][x],tab[y+16][x]))+min(tab[y][x],tab[y+16][x]);
tab[y][x+k/2]=rand()%(max(tab[y][x],tab[y][x+16])-min(tab[y][x],tab[y][x+16]))+min(tab[y][x],tab[y][x+16]);
tab[y+k/2][x+k/2]=rand()%(max(tab[y][x],tab[y+16][x+16])-min(tab[y][x],tab[y+16][x+16]))+min(tab[y][x],tab[y+16][x+16]);
}
}
int main()
{
srand(time(NULL));
for(int i=0; i<Size; i+=16)
for(int j=0; j<Size; j+=16)
tab[16*i][16*j]=rand()%(100-40)+40;
for(int x=0; x<Size*16+1; x+=16)
for(int y=0; y<Size*16+1; y+=16)
chunk(x,y);
return 0;
}
Редактировать: он не работал из-за
rand()%(max(tab[y][x],tab[y+16][x])-min(tab[y][x],tab[y+16][x]))
элементов в массив может быть равен. Я также сделал несколько глупых ошибок при чтении массива, что привело к превышению его размера. Теперь он работает без ошибок, но показывает некоторые цифры ниже 40, что не должно происходить. Вот код после правок:
#include<ctime>
#include<iostream>
using namespace std;
const short int Size=1;
short int tab[Size*16+1][Size*16+1];
void chunk(int X, int Y)
{
for(int k=16; k>1; k/=2)
for(int y=Y; y<Y+16; y+=k)
for(int x=X; x<X+16; x+=k)
{
if(Y!=Size*16)
if(tab[y][x]==tab[y+k][x])
tab[y+k/2][x]=tab[y][x];
else
tab[y+k/2][x]=rand()%(max(tab[y][x],tab[y+k][x])-min(tab[y][x],tab[y+k][x]))+min(tab[y][x],tab[y+k][x]);
if(X!=Size*16)
if(tab[y][x]==tab[y][x+k])
tab[y+k/2][x]=tab[y][x];
else
tab[y][x+k/2]=rand()%(max(tab[y][x],tab[y][x+k])-min(tab[y][x],tab[y][x+k]))+min(tab[y][x],tab[y][x+k]);
if(X!=Size*16||Y!=Size*16)
if(tab[y][x]==tab[y+k][x+k])
tab[y+k/2][x]=tab[y][x];
else
tab[y+k/2][x+k/2]=rand()%(max(tab[y][x],tab[y+k][x+k])-min(tab[y][x],tab[y+k][x+k]))+min(tab[y][x],tab[y+k][x+k]);
}
}
int main()
{
srand(time(NULL));
for(int i=0; i<=Size*16; i+=16)
for(int j=0; j<=Size*16; j+=16)
tab[j][i]=rand()%60+40;
for(int x=0; x<=Size*16; x+=16)
for(int y=0; y<=Size*16; y+=16)
chunk(x,y);
for(int a=0; a<Size*16; a++){
for(int b=0; b<Size*16; b++)
{
cout<<tab[b][a]<<' ';
if(tab[b][a]<10)
cout<<' ';
}
cout<<'\n';
}
return 0;
}
правка 2: Алгоритм записывает псевдослучайное значение между двумя выбранными значениями каждые 16 строк и столбцов в массив. Затем он перепрыгивает каждые 16 ячеек, чтобы поместить псевдослучайное значение между ячейками, которые уже заполнены следующим образом:
XOOOOOOO+OOOOOOF
OOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOO
+OOOOOOO+OOOOOOO
OOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOO
FOOOOOOOOOOOOOOF
X - проверяемая ячейка F - заполненные ячейки + - ячейки для заполнения 0 - пустые ячейки Алгоритм заполняет ячейки «+» псевдослучайным значением между значениями ячейки «X» и ячейки «F». Когда алгоритм перепрыгивает через все ячейки «F», он снова переходит на половину прыжка, как и раньше, и существующие ячейки «+» становятся ячейками «F». Это продолжается до тех пор, пока длина прыжка не станет равной 1, что означает, что массив заполнен.