Эффективное вычисление величины 3D вектора

Я работаю над проектом инерциальных измерений с использованием 3-осевого акселерометра и Arduino. Я хочу, чтобы Arduino принял значения x, y и z g и выплеснул величину. Поскольку |a| = sqrt(x^2 + y^2 + z^2) требует больших вычислительных ресурсов, я хотел выяснить, существует ли альтернативный алгоритм, который можно было бы использовать для его ускорения (я готов пожертвовать небольшой точностью).

Я читал о методе Alpha-max, Beta-min, но, похоже, он работает только для 2D векторов. Есть ли что-нибудь похожее для 3D векторов?

РЕДАКТИРОВАТЬ: язык программирования C++

3 ответа

Если у вас есть быстрый способ расчета two-dimensional величина, то, возможно, three-dimensional величина может быть реструктурирована в этих условиях.

Трехмерная величина может быть выведена из теоремы Пифагора.

|a| = sqrt(sqrt(x^2 + y^2)^2 + z^2) = sqrt(x^2 + y^2 + z^2)

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

Существует также std::hypot, который вычисляет длину 2D-вектора (начиная с C++11) или 3D-вектора (начиная с C++17). В промежуточных версиях C++ вы можете вычислить длину трехмерного вектора, используя двумерную версию функции какstd::hypot(std::hypot(x, y), z).

Hypot более устойчив к переполнению и недостатку (особенно при возведении в квадрат отдельных компонентов) по сравнению с вычислением формулы вручную. Это может быть или не быть быстрее, в зависимости от вашей стандартной библиотеки и оборудования.

Другие вопросы по тегам