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; } |