алгоритм diamond square генерирует симметричное изображение

309
25 апреля 2017, 06:24

Доброго времени суток.

Пытаюсь реализовать алгоритм 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; 
READ ALSO
Программа в Java [требует правки]

Программа в Java [требует правки]

Помогите с написанием программы в Java) Плиииииз Дана дійсна квадратна матриця n n елементівСформувати дійсний вектор з елементів матриці,...

244
Работа с интерфейсами в Java

Работа с интерфейсами в Java

Есть интерфейс:

225
Не могу подключить proxy к jsoup

Не могу подключить proxy к jsoup

Суть задачи распарсить страницу, вытащить список доменов, каждый из них проверить через jsoup(или нет?) на site:xdomaincom , дабы узнать количество страниц

314