Доброго времени суток.
Пытаюсь реализовать алгоритм diamond square для процедурной генерации ландшафта. Моя реализация работает, но выдаёт странный результат: ландшафт выглядит как семитричные пятна (как в тесте Германа Роршаха).
private float[][] diamondSquare(int sizeSide, int amplitude) {
float[][] map = new float[sizeSide][sizeSide];
for(int y = 0; y < map.length; y++) {
for(int x = 0; x < map[0].length; x++) {
map[y][x] = Integer.MIN_VALUE;/*Это значение используется как метка.
Если ячейка массива содержит его - значит в
ней не делали никаких изминеий.*/
}
}
//задаем в углах карты случайные значения
map[0][sizeSide - 1] = (float)(Math.random());
map[0][0] = (float)(Math.random());
map[sizeSide - 1][0] = (float)(Math.random());
map[sizeSide - 1][sizeSide - 1] = (float)(Math.random());
for(int partOfSide = sizeSide - 1; partOfSide >= 2; partOfSide /= 2) {
int half = partOfSide / 2;
//шаг square
for(int y = 0; y < sizeSide - 1; y += partOfSide) {
for(int x = 0; x < sizeSide - 1; x += partOfSide) {
float value = (map[y][x] + map[y + partOfSide][x]
+ map[y][x + partOfSide]
+ map[y + partOfSide][x + partOfSide]) / 4;
float noise = (float)(Math.random() - Math.random())
* partOfSide / 2;
map[x + half][ y + half] = value + noise;
}
}
//шаг diamond
for(int y = 0; y <= sizeSide - 1; y += half) {
for(int x = 0; x <= sizeSide - 1; x += half) {
if(map[y][x] != Integer.MIN_VALUE) continue;
/* y1
|
x1-O-x2
|
y2 */
/*проверяем - выходит ли индекс одной из ячеек за границы
массива, если да - выберем другую ячейку в пределах
массива*/
int y1 = y - half >= 0 ? y - half : y + half;
int y2 = y + half <= sizeSide - 1 ? y + half : y - half;
int x1 = x - half >= 0 ? x - half : x + half;
int x2 = x + half <= sizeSide - 1 ? x + half : x - half;
float value = (map[y][x1] + map[y][x2] +
map[y1][x] + map[y2][x]) / 4;
float noise = (float)(Math.random() - Math.random())
* partOfSide / 2;
map[y][x] = value + noise;
}
}
}
/*умножим значение в каждой ячейке на амплитуду, а также проследим, чтобы
чтобы получившееся значение было >= 0 и было на 1 меньше amplitude*/
for(int y = 0; y < map.length; y++) {
for(int x = 0; x < map[0].length; x++) {
if(map[y][x] * amplitude >= amplitude) map[y][x] = amplitude - 1;
else if(map[y][x] * amplitude < 0) map[y][x] = 0;
else map[y][x] = map[y][x] * amplitude;
}
}
return map;
}
Предпологаю что ошибка в этом фрагменте кода:
int y1 = y - half >= 0 ? y - half : y + half;
int y2 = y + half <= sizeSide - 1 ? y + half : y - half;
int x1 = x - half >= 0 ? x - half : x + half;
int x2 = x + half <= sizeSide - 1 ? x + half : x - half;
Виртуальный выделенный сервер (VDS) становится отличным выбором
Помогите с написанием программы в Java) Плиииииз Дана дійсна квадратна матриця n n елементівСформувати дійсний вектор з елементів матриці,...
Суть задачи распарсить страницу, вытащить список доменов, каждый из них проверить через jsoup(или нет?) на site:xdomaincom , дабы узнать количество страниц