q2 = SGQuat<T>::fromAngleAxis(y, e2);
q3 = SGQuat<T>::fromAngleAxis(x, e1);
v2 = q3.transform(q2.transform(q1.transform(v1)));
- q4 = SGQuat<T>::fromEuler(z, y, x);
+ q4 = SGQuat<T>::fromEulerRad(z, y, x);
if (!equivalent(q4.transform(v1), v2))
return false;
{
SGVec3f v3f = SGVec3f::e2();
SGVec4f v4f = SGVec4f::e2();
- SGQuatf qf = SGQuatf::fromEuler(1.2, 1.3, -0.4);
+ SGQuatf qf = SGQuatf::fromEulerRad(1.2, 1.3, -0.4);
SGMatrixf mf(qf, v3f);
// Copy to and from plibs types check if result is equal,
{
SGVec3d v3d = SGVec3d::e2();
SGVec4d v4d = SGVec4d::e2();
- SGQuatd qd = SGQuatd::fromEuler(1.2, 1.3, -0.4);
+ SGQuatd qd = SGQuatd::fromEulerRad(1.2, 1.3, -0.4);
SGMatrixd md(qd, v3d);
// Copy to and from plibs types check if result is equal,
{ return fromRealImag(1, SGVec3<T>(0)); }
/// Return a quaternion from euler angles
- static SGQuat fromEuler(T z, T y, T x)
+ static SGQuat fromEulerRad(T z, T y, T x)
{
SGQuat q;
T zd2 = T(0.5)*z; T yd2 = T(0.5)*y; T xd2 = T(0.5)*x;
return q;
}
+ /// Return a quaternion from euler angles in degrees
+ static SGQuat fromEulerDeg(T z, T y, T x)
+ {
+ return fromEulerRad(SGMisc<T>::deg2rad(z), SGMisc<T>::deg2rad(y),
+ SGMisc<T>::deg2rad(x));
+ }
+
/// Return a quaternion from euler angles
static SGQuat fromYawPitchRoll(T y, T p, T r)
- { return fromEuler(y, p, r); }
+ { return fromEulerRad(y, p, r); }
+
+ /// Return a quaternion from euler angles
+ static SGQuat fromYawPitchRollDeg(T y, T p, T r)
+ { return fromEulerDeg(y, p, r); }
/// Return a quaternion from euler angles
static SGQuat fromHeadAttBank(T h, T a, T b)
- { return fromEuler(h, a, b); }
+ { return fromEulerRad(h, a, b); }
+
+ /// Return a quaternion from euler angles
+ static SGQuat fromHeadAttBankDeg(T h, T a, T b)
+ { return fromEulerDeg(h, a, b); }
/// Return a quaternion rotation the the horizontal local frame from given
/// longitude and latitude
- static SGQuat fromLonLat(T lon, T lat)
+ static SGQuat fromLonLatRad(T lon, T lat)
{
SGQuat q;
T zd2 = T(0.5)*lon;
return q;
}
+ /// Return a quaternion rotation the the horizontal local frame from given
+ /// longitude and latitude
+ static SGQuat fromLonLatDeg(T lon, T lat)
+ { return fromLonLatRad(SGMisc<T>::deg2rad(lon), SGMisc<T>::deg2rad(lat)); }
+
/// Create a quaternion from the angle axis representation
static SGQuat fromAngleAxis(T angle, const SGVec3<T>& axis)
{
return fromRealImag(cos(angle2), T(sin(angle2))*axis);
}
+ /// Create a quaternion from the angle axis representation
+ static SGQuat fromAngleAxisDeg(T angle, const SGVec3<T>& axis)
+ { return fromAngleAxis(SGMisc<T>::deg2rad(angle), axis); }
+
/// Create a quaternion from the angle axis representation where the angle
/// is stored in the axis' length
static SGQuat fromAngleAxis(const SGVec3<T>& axis)
void getEulerDeg(T& zDeg, T& yDeg, T& xDeg) const
{
getEulerRad(zDeg, yDeg, xDeg);
- zDeg *= 180/SGMisc<value_type>::pi();
- yDeg *= 180/SGMisc<value_type>::pi();
- xDeg *= 180/SGMisc<value_type>::pi();
+ zDeg = SGMisc<T>::rad2deg(zDeg);
+ yDeg = SGMisc<T>::rad2deg(yDeg);
+ xDeg = SGMisc<T>::rad2deg(xDeg);
}
/// write the angle axis representation into the references
T& operator()(unsigned i)
{ return _data[i]; }
+ /// Access raw data by index, the index is unchecked
+ const T& operator[](unsigned i) const
+ { return _data[i]; }
+ /// Access raw data by index, the index is unchecked
+ T& operator[](unsigned i)
+ { return _data[i]; }
+
/// Access the x component
const T& x(void) const
{ return _data[0]; }