首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >vec3的平移尺寸

vec3的平移尺寸
EN

Stack Overflow用户
提问于 2012-12-30 12:08:08
回答 2查看 175关注 0票数 1

问题

我想把三维向量vec3的维数x,y,z,移动到n。

代码语言:javascript
复制
vec3 shift(int n, vec3 vector);

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

算法

代码语言:javascript
复制
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表示。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-30 12:28:46

在你的情况下,你可以移动2次,第三次将是原来的。因此,我建议不要为两个不同的轮班创建一个泛型函数,而应该使两个更简单的函数由此而来。

代码语言:javascript
复制
vec3 shiftOnce(vec3 Vector)
{
    return vec3(Vector.z, Vector.x, Vector.y);
}

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

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

如果需要维度参数:

代码语言:javascript
复制
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;
}
票数 2
EN

Stack Overflow用户

发布于 2012-12-30 12:58:21

您可以更多地优化算法:

代码语言:javascript
复制
// 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

输出矢量(输出向量)

代码语言:javascript
复制
         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 = vec3 (42,30,12)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14090584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档