Я принял код от "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-версии, но я уверен, что сделал это точно, так что это не источник каких-либо проблем.
Отличный ответ. На данный момент, однако, мне интересно, не отличается ли это от того, что он просто умножает 'delta' на двойной диапазон от (0,1)? Я больше не вижу цели в ограничении' factor' до 1/2, 1/4, 1/8 и т. Д. –
@ KartikChugh ヅ «если это не что иное, как просто умножение дельта на двойной диапазон от (0,1]?» .В конце концов, поскольку «шероховатость» '(по их терминологии) увеличивается, ** гладкость ** кривой/поверхности действительно увеличивается, я бы назвал их термин неправильным.Я полагаю, что высокие значения коэффициента умножения, близкого к 1 (и почему ограничение при 1?), Приведут к довольно неровной местности. –