2016-12-08 15 views
0

Я принял код от "Midpoint displacement algorithm example", немного почистил его и поставил его на работу как генератор линейных рельефов 1D. Ниже моя новая версия методы doMidpoint():Что такое «константа шероховатости» этого алгоритма смещения средней точки и как его изменить?

public boolean setMidpointDisplacement(int x1, int x2) { 
     // Exit recursion if points are next to eachother 
     if (x2 - x1 < 2) { 
      return false; 
     } 

     final int midX = (x1 + x2)/2; 
     final int dist = x2 - x1; 
     final int distHalf = dist/2; 

     final int y1 = map[x1]; 
     final int y2 = map[x2]; 
     final int delta = random.nextInt(dist) - distHalf; // +/- half the distance 
     final int sum = y1 + y2; 
     map[midX] = (sum + delta)/2; // Sets the midpoint 

     // Divide and repeat 
     setMidpointDisplacement(x1, midX); 
     setMidpointDisplacement(midX, x2); 

     return true; 

} 

код кажется, работает хорошо и производит работоспособные местности (вы можете увидеть how I've tested it, с рудиментарным GUI)

После прочтения "Generating Random Fractal Terrain" и "Mid Point Displacement Algorithm", мой вопрос is:

Как я могу определить «константу шероховатости», неявно используемую этим кодом? И потом, как я могу его изменить?

Кроме того, это может быть или не быть напрямую связано с моим основным вопросом, но я заметил, что код добавляет сумму значений y к «дельта» (сумму изменения) и делит это на 2 - хотя это то же самое, что и усреднение суммы, а затем добавление дельта/2. Оказывает ли это какое-либо отношение к «константе шероховатости»? Я думаю, что я мог бы сделать

map[midX] = sum/2 + delta/K; 

и K теперь будет представитель из «шероховатости постоянной», но я не уверен, если это точно или нет, так как он, кажется, позволяет мне контролировать сглаживание но напрямую не контролирует «насколько диапазон случайных чисел уменьшается каждый раз через цикл», как определено «Генерация случайной фрактальной поверхности».

Как я уже говорил, я портировал генератор шума 2D MDP, который я нашел в 1D-версии, но я уверен, что сделал это точно, так что это не источник каких-либо проблем.

ответ

1

Как определить константу шероховатости, неявно используемую этим кодом?

В cited шероховатость - это сумма, которую вы уменьшаете максимальное случайное смещение. По мере смещение random.nextInt(dist) = dist*random.nextDouble(), ваш dist = x2-x1 и вы переходите от одного шага рекурсии к другим с половиной этого дист, то отсюда следует, что roughness == 1 (в цитируемой терминологии)

А потом, как я могу изменить его?

public boolean setMidpointDisplacement(int x1, int x2, int roughness) { 
    // Exit recursion if points are next to eachother 
    if (x2 - x1 < 2) { 
     return false; 
    } 

    // this is 2^-roughness as per cited 
    // you can pass it precalculated as a param, using it as such here 
    // is only to put it into a relation with the cited 
    double factor=1.0/(1<<roughness); 

    final int midX = (x1 + x2)/2; 
    final int dist = x2 - x1; 
    final int distHalf = dist/2; 

    final int y1 = map[x1]; 
    final int y2 = map[x2]; 
    // and you apply it here. A cast will be necessary though 
    final int delta = factor*(random.nextInt(dist) - distHalf); // +/- half the distance 

    final int sum = y1 + y2; 
    map[midX] = (sum + delta)/2; // Sets the midpoint 

    // Divide and repeat 
    setMidpointDisplacement(x1, midX, roughness); 
    setMidpointDisplacement(midX, x2, roughness); 

    return true; 

} 

Кроме того, и это может быть или не быть непосредственно связанно с моим основным вопросом, но я заметил, что код добавляет сумму у значений в «дельту» (изменение сумма) и делит это на 2

Их путь имеет то преимущество, что делает это с одним делением. Когда вы работаете с int s, накопленные ошибки усечения будут меньше с одним div (не говоря уже немного быстрее).

+0

Отличный ответ. На данный момент, однако, мне интересно, не отличается ли это от того, что он просто умножает 'delta' на двойной диапазон от (0,1)? Я больше не вижу цели в ограничении' factor' до 1/2, 1/4, 1/8 и т. Д. –

+0

@ KartikChugh ヅ «если это не что иное, как просто умножение дельта на двойной диапазон от (0,1]?» .В конце концов, поскольку «шероховатость» '(по их терминологии) увеличивается, ** гладкость ** кривой/поверхности действительно увеличивается, я бы назвал их термин неправильным.Я полагаю, что высокие значения коэффициента умножения, близкого к 1 (и почему ограничение при 1?), Приведут к довольно неровной местности. –