Подгонка любого Vector3 (x, y, z) в индекс линейного массива - PullRequest
0 голосов
/ 05 марта 2020

Назначение функции, приведенной ниже, состоит в том, что массив случайных чисел генерируется с использованием seed-rnd [], и приведенный ниже поиск - это быстрый способ найти случайное число, связанное с данной координатой. Похоже, эта функция преобразует любые координаты (x, y, z) в трехмерном пространстве в индекс массива фиксированной длины 8192. Я не уверен, точна ли функция, я предполагаю, что это так, но я хотел использовать гораздо больший массив, чем ниже. Я чувствую, что он не достаточно случайный, чтобы использовать только 8192 случайных чисел.

Как бы я изменил код для работы с массивом длиной 262144 вместо 8192?

public static float GetValue(Vector3 position) {
    long hash = 17 * 23 + (long)position.x;
    hash = hash * 23 + (long)position.y;
    hash = hash * 23 + (long)position.z;
    hash += (hash >> 26) + (hash >> 13);
    rndIndex = (uint)(hash & 8191);
    return (float)rnd[rndIndex];
}

1 Ответ

1 голос
/ 05 марта 2020

как насчет

 rnd[position.GetHashCode() % rnd.Length];

для этого потребуется любой вектор, используйте GetHashCode, чтобы преобразовать вектор в целое число, и используйте оператор модуля, чтобы ограничить результат длиной массива. Это предполагает, что GetHashCode хорошо определен.

Если вы хотите, чтобы векторы, близкие друг к другу, отображались на одно и то же число, вы можете использовать что-то вроде:

var hashCode = (long)position.X;
hashCode = (hashCode * 397) ^  (long)position.Y;
hashCode = (hashCode * 397) ^  (long)position.Z;

вместо GetHashCode.

Другой альтернативой было бы вместо этого поместить случайные числа в трехмерный массив и использовать вектор для индексации в нем вместо этого, используя оператор модуля, чтобы убедиться, что каждая координата отображается в допустимый диапазон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...