/*! \file piquaternion.h * \ingroup Math * \~\brief * \~english Quaternion * \~russian Кватернион */ /* PIP - Platform Independent Primitives Class for quaternions Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . */ #ifndef PIQUATERNION_H #define PIQUATERNION_H #include "pimathmatrix.h" class PIP_EXPORT PIQuaternion { friend PIP_EXPORT PIQuaternion operator*(const PIQuaternion & q0, const PIQuaternion & q1); friend PIP_EXPORT PIQuaternion operator*(const double & a, const PIQuaternion & q); public: PIQuaternion(const PIMathVectorT3d & u = PIMathVectorT3d(), double a = 0.); PIQuaternion conjugate() const { return PIQuaternion(-vector(), scalar()); } PIQuaternion rotated(const PIMathVectorT3d & u, double a) const; void rotate(const PIMathVectorT3d & u, double a); void normalize(); double & scalar() { return q[0]; } double scalar() const { return q[0]; } PIMathVectorT3d vector() const { return PIMathVectorT3d({q[1], q[2], q[3]}); } PIMathVectorT3d eyler() const; PIMathMatrixT33d rotationMatrix() const; void axis(PIMathVectorT3d * ret) const; static PIQuaternion fromEyler(double ax, double ay, double az); static PIQuaternion fromRotationMatrix(const PIMathMatrixT33d & m); static PIQuaternion fromAngles(double ax, double ay, double az); static PIQuaternion fromAngles2(double ax, double ay, double az); protected: double q[4]; }; PIP_EXPORT PIQuaternion operator*(const double & a, const PIQuaternion & q); PIP_EXPORT PIQuaternion operator*(const PIQuaternion & q0, const PIQuaternion & q1); inline PIQuaternion operator+(const PIQuaternion & q0, const PIQuaternion & q1) { return PIQuaternion(q0.vector() + q1.vector(), q0.scalar() + q1.scalar()); } inline PIQuaternion operator-(const PIQuaternion & q0, const PIQuaternion & q1) { return PIQuaternion(q0.vector() - q1.vector(), q0.scalar() - q1.scalar()); } inline PIQuaternion operator-(const PIQuaternion & q0) { return PIQuaternion(-q0.vector(), -q0.scalar()); } #endif // PIQUATERNION_H