Преобразовать координату вектора (x, y, z) в целое число от 0 до 32767 - PullRequest
0 голосов
/ 02 апреля 2020

Довольно простой вопрос - может ли кто-нибудь предоставить формулу, которая принимает 3 числа (x, y, z) и преобразует их в одно целое число от 0 до 32767.

1,1,2 и 2,1 , 1 не должно быть одинаковым результирующим значением (просто сложение чисел - это не то, что мне нужно), но сжатие бесконечного числа x, y, z в небольшой диапазон чисел, очевидно, будет возвращать одни и те же значения довольно часто.

Формула также должна работать с большими числами, такими как 5000,5000,1000

Если вам нужно go между 0 и 131068, это было бы хорошо, но это не должно быть много более того.

1 Ответ

1 голос
/ 02 апреля 2020

Одно решение, которое я могу придумать, состоит в том, чтобы взять каждый x, y, z и назначить их каждому в диапазоне 5 битов из 2 ^ 15 возможных значений в [0, 32767]. Один из способов сделать это состоит в том, чтобы взять каждый x, y, z по модулю 2 ^ 5 (чтобы сжать их в необходимые 5 битов), а затем соответственно установить биты результата. Конечный результат должен выглядеть примерно так:

def compress(x,y,z):
    x %= 32
    y %= 32
    z %= 32
    return x + (y<<5) + (z<<10)

print (compress(5000,5000,1000))
>>> 8456

Очевидно, что в этом подходе очень часто встречаются выходы (когда x, y или z совпадают по модулю 32), но, как вы сказали, это довольно неизбежно.

...