Быстрый способ обновления на месте одного вектора с другим - PullRequest
0 голосов
/ 18 ноября 2011

У меня есть вектор A, представленный углом и длиной. Я хочу добавить вектор B, обновив исходный A. B получен из справочной таблицы, чтобы его можно было представить, каким образом облегчая вычисления.

В частности, A определяется следующим образом:

uint16_t A_angle; // 0-65535 = 0-2π
int16_t A_length;

Аппроксимации в порядке. Проверка на переполнение не требуется. Доступно быстрое приближение sin / cos.

Самый быстрый способ, который я могу себе представить, - это представить B как вектор-компонент, преобразовать A в компонент, добавить A и B, преобразовать результат обратно в угол / длину и заменить A. (Это требует добавления быстрого asin / экоса)

Я не особенно хорош в математике, и мне интересно, упускаю ли я более разумный подход?

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

1 Ответ

2 голосов
/ 18 ноября 2011

Если вам нужно выполнить много аддитивных операций, возможно, стоит подумать о сохранении всего в декартовых координатах, а не в полярных.

Polar хорошо подходит для операций вращения (и, я думаю, масштабирования)), но придерживаться декартовой системы (где поворот равен четырем умножениям, см. ниже), вероятно, будет дешевле, чем использовать cos / sin / acos / asin каждый раз, когда вы хотите добавить вектор.Хотя, конечно, это зависит от распределения операций в вашем случае.

К вашему сведению, поворот в декартовых координатах выглядит следующим образом (см. http://en.wikipedia.org/wiki/Rotation_matrix):

x' = x.cos(a) - y.sin(a)
y' = x.sin(a) + y.cos(a)

Если aизвестен заранее, тогда можно вычислить cos(a) и sin(a).

...