Смещение размеров vec3

Вопрос

Я хочу сместить размеры х, у и г трехмерного вектора 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.

1

Решение

В вашем случае вы можете сдвинуться 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;
}
2

Другие решения

Вы можете оптимизировать алгоритм немного больше:

// 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])
}

чтобы сдвинуть векторную составляющую, одним из способов является получение модуля деления
между суммой индекса плюс значение измерения и размерность
вектор, который равен трем.

например.
в твоем случае.
входной вектор (в): 12, 42, 30

размерность: 2

выходной вектор (выход)

         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.

Итак, выходной вектор должен быть:
в [1], в [2], в [0] = vec3 (42,30,12)

1

По вопросам рекламы [email protected]