1

问题

我想将三维向量的维度 x、y 和 z 移动vec3一个数字 n。

vec3 shift(int n, vec3 vector);

如何改进我的算法以获得最佳性能并简化逻辑?我想这个任务有一个通用的方法,是吗?

算法

vec3 shift(int Dimension, vec3 Vector)
{
    float in[3] = { Vector.x, Vector.y, Vector.z };
    float out[3];
    for(int i = 0; i < 3; ++i)
    {
        int n = i + Dimension;
        while(n > Dimension - 1) n -= Dimension;
        out[i] = in[n];
    }
    return vec3(out[0], out[1], out[2]);
}

例子

比如shift(2, vec3(12, 42, 30))应该给我vec3(42, 30, 12)

  • 维度 0 是 x 并保存值 12。它移动 2 到维度 2,即 z。所以 z 为 12。
  • 维度 1 是 y 并保持 42。移动 2 会导致维度 4 不存在,因此我们将其环绕,它的值变成维度 0 的值,即 x。
  • 维度 2 是 z,也环绕边缘,其值落在 y 中。
4

2 回答 2

2

在您的情况下,您可以移动 2 次,第三次将是原来的。因此,我建议不要为 2 个不同的班次创建一个通用函数,而是从中创建两个更简单的函数。

vec3 shiftOnce(vec3 Vector)
{
    return vec3(Vector.z, Vector.x, Vector.y);
}

vec3 shiftTwice(vec3 Vector)
{
    return vec3(Vector.y, Vector.z, Vector.x);
}

这将更快,更容易阅读。我不是代码重复的朋友,但在这样的小情况下,它只是首选的解决方案。

如果需要维度参数:

vec3 shift(int dimension, vec3 v)
{
    if(dimension % 3 == 1)      return vec3(v.z, v.x, v.y); // shift once 
    else if(dimension % 3 == 2) return vec3(v.y, v.z, v.x); // shift twice
    else                        return v;
}
于 2012-12-30T12:28:46.073 回答
1

您可以进一步优化算法:

// copy a reference of your vector, is better than copy all it´s components.
   vec3 shift (int dimension, const vec3& Vector)
   {
       float in [3] = { Vector.x , Vector.y , Vector.z };
       float out [3];

       for (int i = 0; i < 3; i++)
              out [ (i + dimension) % 3 ] = in [i];
       return vec3 (out [0], out [1], out [2])
   }

为了移动向量分量,一种方法是获取索引加维度值之和与
向量维度之间的除模,即三。

例如。在你的情况下。输入向量(in):12、42、30

尺寸:2

输出向量(out)

         out [(0 + 2) % 3] = in [0] => out [2%3] = in [0] => out [2] = in [0]
         z holds the value of the x component.

         out [(1 + 2) % 3] = in [1] => out [3%3] = in [1] => out [0] = in [1]
         x holds the value of the y component

         out [(2 + 2) % 3] = in [2] => out [4%3] = in [2] => out [1] = in [2]
         y holds the value of z component.

所以,输出向量必须是: in [1] , in [2] , in [0] = vec3 (42,30,12)

于 2012-12-30T12:58:21.193 回答