【问题标题】:Fitting any Vector3 (x,y,z) into a linear array index将任何 Vector3 (x,y,z) 拟合到线性数组索引中
【发布时间】:2020-03-05 09:24:50
【问题描述】:

下面函数的目的是使用种子 - rnd[] 生成一个随机数数组,下面的查找是查找与给定坐标关联的随机数的快速方法。似乎此函数将 3D 空间中的任何坐标 (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];
}

【问题讨论】:

    标签: c# math vector


    【解决方案1】:

    怎么样

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

    这将采用任何向量,使用 GetHashCode 将向量转换为 int,并使用模运算符将结果限制为数组的长度。这假设 GetHashCode 定义明确。

    如果您希望将彼此靠近的向量映射到相同的数字,您可以使用类似的方法:

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

    而不是 GetHashCode。

    另一种替代方法是将随机数放入 3D 数组中,并使用向量对其进行索引,使用模运算符确保每个坐标都映射到有效范围。

    【讨论】:

    • 很酷,谢谢,我想知道如何做到这一点,它可能很有用,但我相信代码故意错开结果,这样 X、Y、Z 值靠近在一起就不会得到相同的索引. 5,5,5 的位置不应获得与 5,5,4 相同的索引,并且该代码实现了它,但我想扩展数组以获取更多随机值可供选择,因为我认为相同的值即将出现太频繁了。 26 位移位总是导致零,直到你有非常大的数字,所以我认为它已经占了 X、Y、Z 的很大范围,我只是想增加数组大小。
    • 如果您对哈希方法感到满意,只需将 hash & 8191 替换为 hash % rnd.Length 并使用您想要的任意长度的数组。
    猜你喜欢
    • 2013-02-26
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    相关资源
    最近更新 更多