将向量 (x,y,z) 坐标转换为 0 到 32767 之间的整数
Convert a vector(x,y,z) coordinate into an integer between 0 and 32767
非常简单的问题 - 谁能提供一个公式,将 3 个数字 (x,y,z) 转换为 0 到 32767 之间的单个整数。
1,1,2 和 2,1,1 不应该是相同的结果值(简单地将数字相加不是我想要的)而是将无限数量的 x,y,z 压缩成一个小范围的数字显然会经常得到相同的值。
该公式还需要处理大数字,例如 5000,5000,1000
如果您需要介于 0 和 131068 之间,那很好,但不应该超过这个范围。
我能想到的一个解决方案是获取每个 x、y、z 并将它们分别分配给 [0, 32767] 中 2^15 个可能值中的 5 位范围。这样做的一种方法是对每个 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),但正如您所说,这是不可避免的。
非常简单的问题 - 谁能提供一个公式,将 3 个数字 (x,y,z) 转换为 0 到 32767 之间的单个整数。
1,1,2 和 2,1,1 不应该是相同的结果值(简单地将数字相加不是我想要的)而是将无限数量的 x,y,z 压缩成一个小范围的数字显然会经常得到相同的值。
该公式还需要处理大数字,例如 5000,5000,1000
如果您需要介于 0 和 131068 之间,那很好,但不应该超过这个范围。
我能想到的一个解决方案是获取每个 x、y、z 并将它们分别分配给 [0, 32767] 中 2^15 个可能值中的 5 位范围。这样做的一种方法是对每个 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),但正如您所说,这是不可避免的。