Чтобы убедиться, что я понимаю, что вы говорите, у вас есть массив длиной nk, где n - это количество кадров, а k - это количество вращений, которое вы допускаете.Затем вам дается индекс i и вращение θ (в радианах), и вы хотите определить, по какому индексу изображение, которое вы хотите найти, лежит.
Учитывая это, для этого нужно выполнить два шага:
- Определение базового смещения в мастер-массиве, в котором вы найдете блок изображений, соответствующий желаемому изображению.
- Определение относительного смещения от этой точки, которое приведет вас к правильно повернутому изображению.
Теперь, если есть k различных поворотов каждого изображения, то каждый раз, когда вы переходите от просмотра поворотов изображения i к поворотам изображения i + 1, вы пропустите k элементов.Это означает, что для изображения i базовое смещение равно i * k.
Теперь вопрос состоит в том, какое из k изображений здесь вы хотите.Если θ хранится в диапазоне [-2π, 2π], вы можете преобразовать его обратно в градусы, чтобы получить значение в диапазоне [-360, +360].Однако это не очень хорошо работает с индексами массива, поэтому мы, вероятно, предпочли бы отобразить это в диапазоне [0, 360], как вы заметили.Один из способов сделать это довольно чистым - просто добавить 2π к начальному углу перед выполнением преобразования и вычислить значение в градусах 360. То есть, если начальный угол находится в [0, 4π], сопоставьте его с [0, 720] и отсюда до [0, 360) довольно просто.
Наконец, чтобы преобразовать угол из [0, 360) в смещение, нам нужно посмотреть, в какую из k различныхугол области угол принадлежит.Мы можем сделать это путем умножения значения на k и деления их на 360, что является безопасным целочисленным способом умножения на k / 360.
В сумме, учитывая угол angle
и k
различные повороты на изображение, изображение, которое вы хотите для изображения frame
, можно найти следующим образом:
_frames[frame * k + (Utility.radiansToDegrees(angle + 2 * pi) % 360) * k / 360]
Однако есть гораздо более чистый способ сделать это.Если вы храните изображения в многомерном массиве nxk, где n - это число изображений, а k - это число вращений, то вы можете посмотреть это как
_frames[frame][(Utility.radiansToDegrees(angle + 2 * pi) % 360) * k / 360]
Я думаю, что это намного чище, поскольку это более явно указывает на то, что один из используемых вами индексов соответствует фрейму, а другой - смещению.Это также немного облегчает математику.
Надеюсь, это поможет!