1

質問

vec33次元ベクトルの次元x、y、zを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 を保持します。これは、z である次元 2 に 2 だけシフトされます。したがって、z は 12 です。
  • 次元 1 は y であり、42 を保持します。2 だけシフトすると、存在しない次元 4 になるため、ラップアラウンドし、その値は次元 0 の値 x になります。
  • 次元 2 は z であり、またエッジをラップし、その値は y になります。
4

2 に答える 2

2

あなたの場合、2回シフトできます.3回目は再び元になります。したがって、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])
   }

ベクトル コンポーネントをシフトする方法の 1 つは、インデックスと次元値の合計と
ベクトルの次元 (3 である) の間の除算のモジュールを取得することです。

例えば。あなたの場合。入力ベクトル (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 に答える