1 /****************************************************************************
2  *
3  * ViSP, open source Visual Servoing Platform software.
4  * Copyright (C) 2005 - 2019 by Inria. All rights reserved.
5  *
6  * This software is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  * See the file LICENSE.txt at the root directory of this source
11  * distribution for additional information about the GNU GPL.
12  *
13  * For using ViSP with software that can not be combined with the GNU
14  * GPL, please contact Inria about acquiring a ViSP Professional
15  * Edition License.
16  *
17  * See http://visp.inria.fr for more information.
18  *
19  * This software was developed at:
20  * Inria Rennes - Bretagne Atlantique
21  * Campus Universitaire de Beaulieu
22  * 35042 Rennes Cedex
23  * France
24  *
25  * If you have questions regarding the use of this file, please contact
26  * Inria at visp@inria.fr
27  *
28  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
29  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
30  *
31  * Description:
32  * Generic rotation vector (cannot be used as is !).
33  *
34  * Authors:
35  * Eric Marchand
36  *
37  *****************************************************************************/
38 
39 #ifndef vpRotationVECTOR_H
40 #define vpRotationVECTOR_H
41 
42 /*!
43   \file vpRotationVector.h
44   \brief class that consider the case of a generic rotation vector
45   (cannot be used as is !)
46 */
47 
48 #include <iostream>
49 #include <math.h>
50 #include <stdio.h>
51 
52 #include <visp3/core/vpArray2D.h>
53 
54 class vpRowVector;
55 class vpColVector;
56 
57 /*!
58   \class vpRotationVector
59 
60   \ingroup group_core_transformations
61 
62   \brief Implementation of a generic rotation vector.
63 
64   Class that consider the case of a generic rotation vector
65   (cannot be used as is !) consisting in three or four angles.
66 
67   The vpRotationVector class is derived from vpArray2D<double>.
68   The vpRotationVector class is also the base class of specific rotations
69   vectors such as vpThetaUVector, vpRxyzVector, vpRzyxVector, vpRzyzVector and
70   vpQuaternionVector.
71 
72   The code below shows how this class can be used to manipulate a
73   vpRxyzVector.
74 
75   \code
76 #include <iostream>
77 #include <visp3/core/vpMath.h>
78 #include <visp3/core/vpRxyzVector.h>
79 
80 int main()
81 {
82   vpRxyzVector r;         // By default initialized to zero
83   // Rotation around x set to 45 degres converted in radians
84   r[0] = vpMath::rad(45);
85   // Rotation around y set to PI radians
86   r[1] = M_PI;
87   // Rotation around z set to 0 radians
88   r[2] = 0;
89 
90   std::cout << "Rxyz rotation vector: " << r << std::endl;
91 
92   double rx = r[0];       // Get the value of the angle around x axis
93   double ry = r[1];       // Get the value of the angle around y axis
94   double rz = r[2];       // Get the value of the angle around z axis
95 }
96   \endcode
97 
98 */
99 
100 class VISP_EXPORT vpRotationVector : public vpArray2D<double>
101 {
102 public:
103   //! Constructor that constructs a 0-size rotation vector.
vpRotationVector()104   vpRotationVector() : vpArray2D<double>(), m_index(0) {}
105 
106   //! Constructor that constructs a vector of size n and initialize all values
107   //! to zero.
vpRotationVector(unsigned int n)108   explicit vpRotationVector(unsigned int n) : vpArray2D<double>(n, 1), m_index(0) {}
109 
110   /*!
111     Copy operator.
112   */
vpRotationVector(const vpRotationVector & v)113   vpRotationVector(const vpRotationVector &v) : vpArray2D<double>(v), m_index(0) {}
114 
115   /*!
116     Destructor.
117   */
~vpRotationVector()118   virtual ~vpRotationVector(){};
119 
120   /** @name Inherited functionalities from vpRotationVector */
121   //@{
122 
123   /*!
124     Operator that allows to set the value of an element of the rotation
125     vector: r[i] = value
126   */
127   inline double &operator[](unsigned int i) { return *(data + i); }
128   /*!
129     Operator that allows to get the value of an element of the rotation
130     vector: value = r[i]
131   */
132   inline const double &operator[](unsigned int i) const { return *(data + i); }
133 
134   /*!
135     Affectation of two vectors.
136   */
137   vpRotationVector &operator=(const vpRotationVector &v)
138   {
139     resize(v.size(), 1);
140     for (unsigned int i = 0; i < v.size(); i++) {
141       data[i] = v.data[i];
142     }
143     return *this;
144   }
145 
146   vpColVector operator*(double x) const;
147 
148   vpRotationVector &operator<<(double val);
149   vpRotationVector &operator,(double val);
150 
151   double sumSquare() const;
152 
153   // Transpose of the rotation vector.
154   vpRowVector t() const;
155 
156   std::vector<double> toStdVector();
157 
158   //@}
159 
160 protected:
161   unsigned int m_index; // index used for operator<< and operator, to fill a vector
162 };
163 
164 #ifndef DOXYGEN_SHOULD_SKIP_THIS
165 VISP_EXPORT
166 #endif
167 vpColVector operator*(const double &x, const vpRotationVector &v);
168 
169 #endif
170