Playzone.in.ua - Форум
Square Diamond - Версия для печати

+- Playzone.in.ua - Форум (https://playzone.in.ua/forum)
+-- Форум Флуд (https://playzone.in.ua/forum/forum-25.html)
+--- Форум Флуд (https://playzone.in.ua/forum/forum-17.html)
+--- Темы: Square Diamond (/thread-2203.html)



Square Diamond - Asriel - 18-02-2017

4 дня колдовал но таки-то получилось сделать генератор Square Diamond. Сегодня спустил с гор реки с помощью расположенных случайно источников, но по ходу дела алгоритм как-то странно себя ведёт. Но визуально мне показалось более-менее приемлемым чтобы похвастаться. Как всем известно, Minecraft использует шум Перлина в 3Д, хотя обычно его используют для генерации карты высот. Но увы с помощью карты высот не получить пещер и нависающих в воздухе участков. так что его заменили на несколько более сложную вещь в последних выпусках. Не знаю, насколько такой шум сложнее, но мне уж больно понравился результат работ генератора карт Square Diamond. Возможно буду пробовать и сделать и шум Перлина. Хмм... к чему я все это? Ах да, я это делал на С++. На моем железе жаба бы повесилась. Но таки не раз вышел за границы массива.... Что же, прилагаю скриншоты:


RE: Square Diamond - Asriel - 18-02-2017

Вот собственно код функции, которая создает эту красоту. К ней достаточно создать двумерный квадратный массив 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;
}