15 #ifndef __IPSDKMATH_ANGLES3D_H__ 16 #define __IPSDKMATH_ANGLES3D_H__ 34 template <
typename TOut,
typename TIn>
35 IPSDK_FORCEINLINE TOut
37 const TIn cosTheta,
const TIn sinTheta,
38 const TIn cosPhi,
const TIn sinPhi)
40 return math::round<TOut>(rho * sinTheta * cosPhi);
42 template <
typename TOut,
typename TIn>
43 IPSDK_FORCEINLINE TOut
45 const TIn cosTheta,
const TIn sinTheta,
46 const TIn cosPhi,
const TIn sinPhi)
48 return math::round<TOut>(rho * sinTheta * sinPhi);
50 template <
typename TOut,
typename TIn>
51 IPSDK_FORCEINLINE TOut
53 const TIn cosTheta,
const TIn sinTheta,
54 const TIn cosPhi,
const TIn sinPhi)
56 return math::round<TOut>(rho * cosTheta);
58 template <
typename TOut,
typename TIn>
59 IPSDK_FORCEINLINE
void 61 const TIn cosPhi,
const TIn sinPhi, TOut& x, TOut& y, TOut& z)
63 x = sphericalToXCartesian<TOut>(rho, cosTheta, sinTheta, cosPhi, sinPhi);
64 y = sphericalToYCartesian<TOut>(rho, cosTheta, sinTheta, cosPhi, sinPhi);
65 z = sphericalToZCartesian<TOut>(rho, cosTheta, sinTheta, cosPhi, sinPhi);
67 template <
typename TOut,
typename TIn>
68 IPSDK_FORCEINLINE
void 70 TOut& x, TOut& y, TOut& z)
73 std::cos(phi), std::sin(phi), x, y, z);
80 template <
typename TOut,
typename TIn>
81 IPSDK_FORCEINLINE
void 83 TOut& rho, TOut& theta, TOut& phi)
85 rho = math::round<TOut>(
normL2(x, y, z));
87 theta = std::acos(z / rho);
90 phi = std::atan2(y, x);
98 IPSDK_FORCEINLINE
void 100 const T cosBeta,
const T sinBeta,
101 const T cosAlpha,
const T sinAlpha,
102 T& rxx, T& rxy, T& rxz,
103 T& ryx, T& ryy, T& ryz,
104 T& rzx, T& rzy, T& rzz)
106 rxx = cosChi*cosBeta;
107 rxy = cosChi*sinBeta*sinAlpha - sinChi*cosAlpha;
108 rxz = cosChi*sinBeta*cosAlpha + sinChi*sinAlpha;
109 ryx = sinChi*cosBeta;
110 ryy = sinChi*sinBeta*sinAlpha + cosChi*cosAlpha;
111 ryz = sinChi*sinBeta*cosAlpha - cosChi*sinAlpha;
113 rzy = cosBeta*sinAlpha;
114 rzz = cosBeta*cosAlpha;
116 template <
typename T>
117 IPSDK_FORCEINLINE
void 119 T& rxx, T& rxy, T& rxz,
120 T& ryx, T& ryy, T& ryz,
121 T& rzx, T& rzy, T& rzz)
124 std::cos(beta), std::sin(beta),
125 std::cos(alpha), std::sin(alpha),
135 matRot(0, 0), matRot(0, 1), matRot(0, 2),
136 matRot(1, 0), matRot(1, 1), matRot(1, 2),
137 matRot(2, 0), matRot(2, 1), matRot(2, 2));
149 template <
typename T>
150 IPSDK_FORCEINLINE
void 152 const T ryx,
const T ryy,
const T ryz,
153 const T rzx,
const T rzy,
const T rzz,
154 T& chi, T& beta, T& alpha)
160 if ((1-
std::abs(rzx)) > epsilonValue) {
162 beta = -std::asin(rzx);
163 const T cosBeta = cos(beta);
164 chi = std::atan2(ryx/cosBeta, rxx/cosBeta);
166 alpha = std::atan2(rzy/cosBeta, rzz/cosBeta);
172 beta =
static_cast<T
>(M_PI / 2);
173 alpha = std::atan2(rxy, rxz);
176 beta =
static_cast<T
>(-M_PI / 2);
177 alpha = std::atan2(-rxy, -rxz);
181 IPSDK_FORCEINLINE
void 186 matRot(1, 0), matRot(1, 1), matRot(1, 2),
187 matRot(2, 0), matRot(2, 1), matRot(2, 2),
213 template <
typename T>
214 IPSDK_FORCEINLINE
void 219 T& xOut, T& yOut, T& zOut)
221 xOut = math::round<T>(rxx * xIn + rxy * yIn + rxz * zIn);
222 yOut = math::round<T>(ryx * xIn + ryy * yIn + ryz * zIn);
223 zOut = math::round<T>(rzx * xIn + rzy * yIn + rzz * zIn);
225 template <
typename T>
226 IPSDK_FORCEINLINE
void 242 template <
typename T>
243 IPSDK_FORCEINLINE
void 248 T& xOut, T& yOut, T& zOut)
250 ipReal64 rxx, rxy, rxz, ryx, ryy, ryz, rzx, rzy, rzz;
251 eulerToMatrix(cosChi, sinChi, cosBeta, sinBeta, cosAlpha, sinAlpha,
252 rxx, rxy, rxz, ryx, ryy, ryz, rzx, rzy, rzz);
259 template <
typename T>
260 IPSDK_FORCEINLINE
void 276 template <
typename T>
277 IPSDK_FORCEINLINE
void 280 T& xOut, T& yOut, T& zOut)
283 std::cos(chi), std::sin(chi),
284 std::cos(beta), std::sin(beta),
285 std::cos(alpha), std::sin(alpha),
296 #endif // __IPSDKMATH_ANGLES3D_H__ Definition of import/export macro for library.
Main namespace for IPSDK library.
Definition: AlgorithmFunctionEfficiency.h:22
IPSDKMATH_API void quaternionToEuler(const ipReal64 q0, const ipReal64 q1, const ipReal64 q2, const ipReal64 q3, ipReal64 &chi, ipReal64 &beta, ipReal64 &alpha)
Convertion from quaternion representation to euler angles.
IPSDK_FORCEINLINE void eulerToMatrix(const T cosChi, const T sinChi, const T cosBeta, const T sinBeta, const T cosAlpha, const T sinAlpha, T &rxx, T &rxy, T &rxz, T &ryx, T &ryy, T &ryz, T &rzx, T &rzy, T &rzz)
Convertion from euler angles to rotation matrix.
Definition: Angles3d.h:99
Predefined types for linear algebra management.
double ipReal64
Base types definition.
Definition: BaseTypes.h:57
IPSDKMATH_API void eulerToQuaternion(const ipReal64 chi, const ipReal64 beta, const ipReal64 alpha, ipReal64 &q0, ipReal64 &q1, ipReal64 &q2, ipReal64 &q3)
Convertion from euler angles to a quaternion representation.
Definition: NumericLimits.h:27
IPSDK_FORCEINLINE TOut sphericalToXCartesian(const TIn rho, const TIn cosTheta, const TIn sinTheta, const TIn cosPhi, const TIn sinPhi)
spherical to cartesian convertion
Definition: Angles3d.h:36
#define IPSDKMATH_API
Import/Export macro for library IPSDKMath.
Definition: IPSDKMathExports.h:27
Utility functions for angle management.
IPSDK_FORCEINLINE void sphericalToCartesian(const TIn rho, const TIn cosTheta, const TIn sinTheta, const TIn cosPhi, const TIn sinPhi, TOut &x, TOut &y, TOut &z)
spherical to cartesian convertion
Definition: Angles3d.h:60
IPSDK_FORCEINLINE void matrixToEuler(const T rxx, const T rxy, const T rxz, const T ryx, const T ryy, const T ryz, const T rzx, const T rzy, const T rzz, T &chi, T &beta, T &alpha)
Convertion from rotation matrix to euler angles.
Definition: Angles3d.h:151
Utility functions for ipsdk math library.
Utility functions used to handle points 3d.
boost::numeric::ublas::bounded_matrix< ipReal64, 3, 3 > Matrix3d
3d matrix (3x3) type associated to library
Definition: LinearAlgebraTypes.h:54
IPSDK_FORCEINLINE void rotate3d(const T xIn, const T yIn, const T zIn, const ipReal64 rxx, const ipReal64 rxy, const ipReal64 rxz, const ipReal64 ryx, const ipReal64 ryy, const ipReal64 ryz, const ipReal64 rzx, const ipReal64 rzy, const ipReal64 rzz, T &xOut, T &yOut, T &zOut)
rotation of a point using a rotation angle (rotation around origin)
Definition: Angles3d.h:215
IPSDK_FORCEINLINE void cartesianToSpherical(const TIn x, const TIn y, const TIn z, TOut &rho, TOut &theta, TOut &phi)
cartesian to spherical convertion
Definition: Angles3d.h:82
IPSDK_FORCEINLINE TOut sphericalToYCartesian(const TIn rho, const TIn cosTheta, const TIn sinTheta, const TIn cosPhi, const TIn sinPhi)
spherical to cartesian convertion
Definition: Angles3d.h:44
IPSDK_FORCEINLINE void rotate3dInSitu(const ipReal64 rxx, const ipReal64 rxy, const ipReal64 rxz, const ipReal64 ryx, const ipReal64 ryy, const ipReal64 ryz, const ipReal64 rzx, const ipReal64 rzy, const ipReal64 rzz, T &x, T &y, T &z)
rotation of a point using a rotation angle (rotation around origin)
Definition: Angles3d.h:227
IPSDK_FORCEINLINE PackT abs(const PackT &in)
returns the absolute value of a pack
Definition: abs.h:41
IPSDK_FORCEINLINE TOut sphericalToZCartesian(const TIn rho, const TIn cosTheta, const TIn sinTheta, const TIn cosPhi, const TIn sinPhi)
spherical to cartesian convertion
Definition: Angles3d.h:52
IPSDK_FORCEINLINE ipReal64 normL2(const T x, const T y)
L2 norm of a 2d vector.
Definition: Vector2d.h:32