Documentation for EulerAngles + change Return of Set

Former-commit-id: 7e269b89e880156d66d92cff202095c4e30f344d
This commit is contained in:
Gawaboumga 2015-12-30 15:30:13 +01:00
parent e2213cac61
commit 5d0624f03f
3 changed files with 191 additions and 27 deletions

View File

@ -28,15 +28,15 @@
#ifndef NAZARA_CONFIG_MATH_HPP #ifndef NAZARA_CONFIG_MATH_HPP
#define NAZARA_CONFIG_MATH_HPP #define NAZARA_CONFIG_MATH_HPP
/// Chaque modification d'un paramètre du module nécessite une recompilation de celui-ci /// Each modification of a paramater of the module needs a recompilation of the unit
// Définit le radian comme l'unité utilisée pour les angles // Define the radian as unit for angles
#define NAZARA_MATH_ANGLE_RADIAN 0 #define NAZARA_MATH_ANGLE_RADIAN 0
// Optimise automatiquement les opérations entre matrices affines (Demande plusieurs comparaisons pour déterminer si une matrice est affine) // Optimize automatically the operation on affine matrices (Ask several comparisons to determine if the matrix is affine)
#define NAZARA_MATH_MATRIX4_CHECK_AFFINE 0 #define NAZARA_MATH_MATRIX4_CHECK_AFFINE 0
// Active les tests de sécurité basés sur le code (Conseillé pour le développement) // Enable tests of security based on the code (Advised for the developpement)
#define NAZARA_MATH_SAFE 1 #define NAZARA_MATH_SAFE 1
#endif // NAZARA_CONFIG_MATH_HPP #endif // NAZARA_CONFIG_MATH_HPP

View File

@ -28,14 +28,14 @@ namespace Nz
void MakeZero(); void MakeZero();
void Normalize(); EulerAngles& Normalize();
void Set(T P, T Y, T R); EulerAngles& Set(T P, T Y, T R);
void Set(const T angles[3]); EulerAngles& Set(const T angles[3]);
void Set(const EulerAngles<T>& angles); EulerAngles& Set(const EulerAngles<T>& angles);
//void Set(const Matrix3<T>& mat); //EulerAngles& Set(const Matrix3<T>& mat);
void Set(const Quaternion<T>& quat); EulerAngles& Set(const Quaternion<T>& quat);
template<typename U> void Set(const EulerAngles<U>& angles); template<typename U> EulerAngles& Set(const EulerAngles<U>& angles);
//Matrix3<T> ToRotationMatrix() const; //Matrix3<T> ToRotationMatrix() const;
Quaternion<T> ToQuaternion() const; Quaternion<T> ToQuaternion() const;

View File

@ -14,24 +14,58 @@
namespace Nz namespace Nz
{ {
/*!
* \class Nz::Vector4<T>
* \brief Math class that represents an Euler angle. Those describe a rotation transformation by rotating an object on its various axes in specified amounts per axis, and a specified axis order
*
* \remark Rotation are "left-handed", it means that you take your left hand, put your thumb finger in the direction you want and you other fingers represent the way of rotating
*/
/*!
* \brief Constructs a EulerAngles<T> object from its components
*
* \param P Pitch component = X axis
* \param Y Yaw component = Y axis
* \param R Roll component = Z axis
*/
template<typename T> template<typename T>
EulerAngles<T>::EulerAngles(T P, T Y, T R) EulerAngles<T>::EulerAngles(T P, T Y, T R)
{ {
Set(P, Y, R); Set(P, Y, R);
} }
/*!
* \brief Constructs a EulerAngles<T> object from an array of three elements
*
* \param angles[3] angles[0] is pitch component, angles[1] is yaw component and angles[2] is roll component
*/
template<typename T> template<typename T>
EulerAngles<T>::EulerAngles(const T angles[3]) EulerAngles<T>::EulerAngles(const T angles[3])
{ {
Set(angles); Set(angles);
} }
/*!
* \brief Constructs a EulerAngles<T> object from a quaternion
*
* \param quat Quaternion representing a rotation of space
*/
template<typename T> template<typename T>
EulerAngles<T>::EulerAngles(const Quaternion<T>& quat) EulerAngles<T>::EulerAngles(const Quaternion<T>& quat)
{ {
Set(quat); Set(quat);
} }
/*!
* \brief Constructs a EulerAngles<T> object from another type of EulerAngles
*
* \param angles EulerAngles of type U to convert to type T
*/
template<typename T> template<typename T>
template<typename U> template<typename U>
EulerAngles<T>::EulerAngles(const EulerAngles<U>& angles) EulerAngles<T>::EulerAngles(const EulerAngles<U>& angles)
@ -39,57 +73,125 @@ namespace Nz
Set(angles); Set(angles);
} }
/*!
* \brief Makes the euler angle (0, 0, 0)
* \return A reference to this euler angle with components (0, 0, 0)
*
* \see Zero
*/
template<typename T> template<typename T>
void EulerAngles<T>::MakeZero() void EulerAngles<T>::MakeZero()
{ {
Set(F(0.0), F(0.0), F(0.0)); Set(F(0.0), F(0.0), F(0.0));
} }
/*!
* \brief Normalizes the euler angle
* \return A reference to this euler angle with has been normalized
*
* \remark Normalization depends on NAZARA_MATH_ANGLE_RADIAN, between 0..2*pi
*
* \see NormalizeAngle
*/
template<typename T> template<typename T>
void EulerAngles<T>::Normalize() EulerAngles<T>& EulerAngles<T>::Normalize()
{ {
pitch = NormalizeAngle(pitch); pitch = NormalizeAngle(pitch);
yaw = NormalizeAngle(yaw); yaw = NormalizeAngle(yaw);
roll = NormalizeAngle(roll); roll = NormalizeAngle(roll);
return *this;
} }
/*!
* \brief Sets the components of the euler angle
* \return A reference to this euler angle
*
* \param P Pitch component = X axis
* \param Y Yaw component = Y axis
* \param R Roll component = Z axis
*/
template<typename T> template<typename T>
void EulerAngles<T>::Set(T P, T Y, T R) EulerAngles<T>& EulerAngles<T>::Set(T P, T Y, T R)
{ {
pitch = P; pitch = P;
yaw = Y; yaw = Y;
roll = R; roll = R;
return *this;
} }
/*!
* \brief Sets the components of the euler angle from an array of three elements
* \return A reference to this euler angle
*
* \param angles[3] angles[0] is pitch component, angles[1] is yaw component and angles[2] is roll component
*/
template<typename T> template<typename T>
void EulerAngles<T>::Set(const T angles[3]) EulerAngles<T>& EulerAngles<T>::Set(const T angles[3])
{ {
pitch = angles[0]; pitch = angles[0];
yaw = angles[1]; yaw = angles[1];
roll = angles[2]; roll = angles[2];
return *this;
} }
/*!
* \brief Sets the components of the euler angle from another euler angle
* \return A reference to this euler angle
*
* \param angles The other euler angle
*/
template<typename T> template<typename T>
void EulerAngles<T>::Set(const EulerAngles& angles) EulerAngles<T>& EulerAngles<T>::Set(const EulerAngles& angles)
{ {
std::memcpy(this, &angles, sizeof(EulerAngles)); std::memcpy(this, &angles, sizeof(EulerAngles));
return *this;
} }
/*!
* \brief Sets the components of the euler angle from a quaternion
* \return A reference to this euler angle
*
* \param quat Quaternion representing a rotation of space
*/
template<typename T> template<typename T>
void EulerAngles<T>::Set(const Quaternion<T>& quat) EulerAngles<T>& EulerAngles<T>::Set(const Quaternion<T>& quat)
{ {
Set(quat.ToEulerAngles()); return Set(quat.ToEulerAngles());
} }
/*!
* \brief Sets the components of the euler angle from another type of EulerAngles
* \return A reference to this euler angle
*
* \param angles EulerAngles of type U to convert its components
*/
template<typename T> template<typename T>
template<typename U> template<typename U>
void EulerAngles<T>::Set(const EulerAngles<U>& angles) EulerAngles<T>& EulerAngles<T>::Set(const EulerAngles<U>& angles)
{ {
pitch = F(angles.pitch); pitch = F(angles.pitch);
yaw = F(angles.yaw); yaw = F(angles.yaw);
roll = F(angles.roll); roll = F(angles.roll);
return *this;
} }
/*!
* \brief Converts the euler angle to quaternion
* \return A Quaternion which represents the rotation of this euler angle
*/
template<typename T> template<typename T>
Quaternion<T> EulerAngles<T>::ToQuaternion() const Quaternion<T> EulerAngles<T>::ToQuaternion() const
{ {
@ -102,11 +204,16 @@ namespace Nz
T s3 = std::sin(ToRadians(pitch) / F(2.0)); T s3 = std::sin(ToRadians(pitch) / F(2.0));
return Quaternion<T>(c1 * c2 * c3 - s1 * s2 * s3, return Quaternion<T>(c1 * c2 * c3 - s1 * s2 * s3,
s1 * s2 * c3 + c1 * c2 * s3, s1 * s2 * c3 + c1 * c2 * s3,
s1 * c2 * c3 + c1 * s2 * s3, s1 * c2 * c3 + c1 * s2 * s3,
c1 * s2 * c3 - s1 * c2 * s3); c1 * s2 * c3 - s1 * c2 * s3);
} }
/*!
* \brief Gives a string representation
* \return A string representation of the object: "EulerAngles(pitch, yaw, roll)"
*/
template<typename T> template<typename T>
String EulerAngles<T>::ToString() const String EulerAngles<T>::ToString() const
{ {
@ -115,22 +222,43 @@ namespace Nz
return ss << "EulerAngles(" << pitch << ", " << yaw << ", " << roll << ')'; return ss << "EulerAngles(" << pitch << ", " << yaw << ", " << roll << ')';
} }
/*!
* \brief Adds the components of the euler angle with other euler angle
* \return A euler angle where components are the sum of this euler angle and the other one
*
* \param angles The other euler angle to add components with
*/
template<typename T> template<typename T>
EulerAngles<T> EulerAngles<T>::operator+(const EulerAngles& angles) const EulerAngles<T> EulerAngles<T>::operator+(const EulerAngles& angles) const
{ {
return EulerAngles(pitch + angles.pitch, return EulerAngles(pitch + angles.pitch,
yaw + angles.yaw, yaw + angles.yaw,
roll + angles.roll); roll + angles.roll);
} }
/*!
* \brief Substracts the components of the euler angle with other euler angle
* \return A euler angle where components are the difference of this euler angle and the other one
*
* \param angles The other euler angle to substract components with
*/
template<typename T> template<typename T>
EulerAngles<T> EulerAngles<T>::operator-(const EulerAngles& angles) const EulerAngles<T> EulerAngles<T>::operator-(const EulerAngles& angles) const
{ {
return EulerAngles(pitch - angles.pitch, return EulerAngles(pitch - angles.pitch,
yaw - angles.yaw, yaw - angles.yaw,
roll - angles.roll); roll - angles.roll);
} }
/*!
* \brief Adds the components of other euler angle to this euler angle
* \return A reference to this euler angle where components are the sum of this euler angle and the other one
*
* \param angles The other euler angle to add components with
*/
template<typename T> template<typename T>
EulerAngles<T>& EulerAngles<T>::operator+=(const EulerAngles& angles) EulerAngles<T>& EulerAngles<T>::operator+=(const EulerAngles& angles)
{ {
@ -141,6 +269,13 @@ namespace Nz
return *this; return *this;
} }
/*!
* \brief Substracts the components of other euler angle to this euler angle
* \return A reference to this euler angle where components are the difference of this euler angle and the other one
*
* \param angle The other euler angle to substract components with
*/
template<typename T> template<typename T>
EulerAngles<T>& EulerAngles<T>::operator-=(const EulerAngles& angles) EulerAngles<T>& EulerAngles<T>::operator-=(const EulerAngles& angles)
{ {
@ -151,20 +286,41 @@ namespace Nz
return *this; return *this;
} }
/*!
* \brief Compares the euler angle to other one
* \return true if the euler angles are the same
*
* \param angles Other euler angle to compare with
*/
template<typename T> template<typename T>
bool EulerAngles<T>::operator==(const EulerAngles& angles) const bool EulerAngles<T>::operator==(const EulerAngles& angles) const
{ {
return NumberEquals(pitch, angles.pitch) && return NumberEquals(pitch, angles.pitch) &&
NumberEquals(yaw, angles.yaw) && NumberEquals(yaw, angles.yaw) &&
NumberEquals(roll, angles.roll); NumberEquals(roll, angles.roll);
} }
/*!
* \brief Compares the euler angle to other one
* \return false if the euler angles are the same
*
* \param angles Other euler angle to compare with
*/
template<typename T> template<typename T>
bool EulerAngles<T>::operator!=(const EulerAngles& angles) const bool EulerAngles<T>::operator!=(const EulerAngles& angles) const
{ {
return !operator==(angles); return !operator==(angles);
} }
/*!
* \brief Shorthand for the euler angle (0, 0, 0)
* \return A euler angle with components (0, 0, 0)
*
* \see MakeZero
*/
template<typename T> template<typename T>
EulerAngles<T> EulerAngles<T>::Zero() EulerAngles<T> EulerAngles<T>::Zero()
{ {
@ -175,6 +331,14 @@ namespace Nz
} }
} }
/*!
* \brief Output operator
* \return The stream
*
* \param out The stream
* \param angles The euler angle to output
*/
template<typename T> template<typename T>
std::ostream& operator<<(std::ostream& out, const Nz::EulerAngles<T>& angles) std::ostream& operator<<(std::ostream& out, const Nz::EulerAngles<T>& angles)
{ {