axis_angle.hpp
Go to the documentation of this file.
00001 // HOG-Man - Hierarchical Optimization for Pose Graphs on Manifolds
00002 // Copyright (C) 2010 G. Grisetti, R. Kümmerle, C. Stachniss
00003 // 
00004 // HOG-Man is free software: you can redistribute it and/or modify
00005 // it under the terms of the GNU Lesser General Public License as published
00006 // by the Free Software Foundation, either version 3 of the License, or
00007 // (at your option) any later version.
00008 // 
00009 // HOG-Man is distributed in the hope that it will be useful,
00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012 // GNU Lesser General Public License for more details.
00013 // 
00014 // You should have received a copy of the GNU Lesser General Public License
00015 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
00016 
00017 template <typename Base>
00018 _AxisAngle<Base>::_AxisAngle():_Vector<3, Base> (Base(0.),Base(0.),Base(0.)) {}
00019 
00020 template <typename Base>
00021 _AxisAngle<Base>::_AxisAngle(const _Quaternion<Base>& q) {
00022   Base angle=q.angle();
00023   Base imNorm = sqrt(q.x()*q.x()+q.y()*q.y()+q.z()*q.z());
00024   if (imNorm < std::numeric_limits<Base>::min()){
00025     this->x()=Base(0.);
00026     this->y()=Base(0.);
00027     this->z()=Base(0.);
00028   } else {
00029     Base alpha=angle/imNorm;
00030     this->x()=q.x()*alpha;
00031     this->y()=q.y()*alpha;
00032     this->z()=q.z()*alpha;
00033   }
00034 }
00035 
00036 template <typename Base>
00037 _AxisAngle<Base>::_AxisAngle(const _RotationMatrix3<Base>& m) {
00038   *this=_Quaternion<Base>(m);
00039 }
00040 
00041 template <typename Base>
00042 _AxisAngle<Base>::_AxisAngle(const _Vector<3, Base>& vec) {
00043   *this=_Quaternion<Base>(vec);
00044 }
00045 
00046 template <typename Base>
00047 _AxisAngle<Base>::_AxisAngle(Base roll, Base pitch, Base yaw){
00048   *this=_AxisAngle(_Quaternion<Base>(roll, pitch, yaw));
00049 }
00050 
00051 template <typename Base>
00052 _AxisAngle<Base>::_AxisAngle(const _Vector<3, Base>& axis, Base angle){
00053   *this = axis.normalized() * angle;
00054 }
00055 
00056 template <typename Base>
00057 _AxisAngle<Base>& _AxisAngle<Base>::operator*=(const _AxisAngle& a){
00058   *this=(*this)*a;
00059   return *this;
00060 }
00061   
00062   
00063 template <typename Base>
00064 _AxisAngle<Base>  _AxisAngle<Base>::operator* (const _AxisAngle& a) const{
00065   return _AxisAngle<Base>(quaternion()*a.quaternion());
00066 }
00067   
00068 template <typename Base>
00069 _Vector<3, Base> _AxisAngle<Base>::operator*(const _Vector<3, Base>& v) const {
00070   return rotationMatrix()*v;
00071 }
00072 
00073 template <typename Base>
00074 inline _AxisAngle<Base> _AxisAngle<Base>::inverse() const {
00075   _AxisAngle a(*this);
00076   a._Vector<3, Base>::operator*=(Base(-1.));
00077   return a;
00078 }
00079   
00080 template <typename Base>
00081 inline _Vector<3, Base> _AxisAngle<Base>::angles() const {
00082   return quaternion().angles();
00083 }
00084 
00085 template <typename Base>
00086 _RotationMatrix3<Base> _AxisAngle<Base>::rotationMatrix() const{
00087   return quaternion().rotationMatrix();
00088 }
00089 
00090 template <typename Base>
00091 _Quaternion<Base> _AxisAngle<Base>::quaternion() const {
00092   Base n=this->norm();
00093   if (n<=0){
00094     return _Quaternion<Base>();
00095   }
00096   Base s=sin(n*Base(.5))/n;
00097   Base c=cos(n*Base(.5));
00098   return _Quaternion<Base> (this->x()*s, this->y()*s, this->z()*s, c);
00099 }
00100 


hogman_minimal
Author(s): Maintained by Juergen Sturm
autogenerated on Mon Oct 6 2014 00:06:58