$search
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 #ifndef _VECTORN_H_ 00018 #define _VECTORN_H_ 00019 #include <assert.h> 00020 #include <iostream> 00021 #include <stuff/array_allocator.h> 00022 00025 00026 template <int Rows, int Cols, typename Base> 00027 struct _Matrix; 00028 00046 template <int N, typename Base=double> 00047 struct _Vector{ 00048 typedef Base BaseType; 00049 00052 inline int size() const {return _allocator.size();} 00053 00056 inline const Base& operator[](int i) const {return _allocator[i];} 00057 inline bool operator==(const _Vector<N, Base>& other) const; 00058 00060 inline Base& operator[](int i) {return _allocator[i];} 00061 00063 _Vector(int s=N): _allocator(s){} 00064 static const int TemplateSize=N; 00065 00069 template <typename Base2> 00070 _Vector(const _Vector<N, Base2>& v); 00071 00076 _Vector(Base v0, Base v1){_allocator[0]=v0; _allocator[1]=v1;} 00077 00083 _Vector(Base v0, Base v1, Base v2) {_allocator[0]=v0; _allocator[1]=v1; _allocator[2]=v2;} 00084 00091 _Vector(Base v0, Base v1, Base v2, Base v3) {_allocator[0]=v0; _allocator[1]=v1; _allocator[2]=v2; _allocator[3]=v3;} 00092 00093 00094 // convenience accessor functions for transformations 00096 inline const Base& x() const {return _allocator[0];} 00097 00099 inline const Base& y() const {return _allocator[1];} 00100 00102 inline const Base& z() const {return _allocator[2];} 00103 00105 inline const Base& w() const {return _allocator[3];} 00106 00108 inline Base& x() {return _allocator[0];} 00109 00111 inline Base& y() {return _allocator[1];} 00112 00114 inline Base& z() {return _allocator[2];} 00115 00117 inline Base& w() {return _allocator[3];} 00118 00119 // rotational view 00121 inline const Base& roll() const {if (size() == 6) return _allocator[3]; return _allocator[0];} 00122 00124 inline const Base& pitch() const {if (size() == 6) return _allocator[4]; return _allocator[1];} 00125 00127 inline const Base& yaw() const {if (size() == 6) return _allocator[5]; return _allocator[2];} 00128 00130 inline Base& roll() {if (size() == 6) return _allocator[3]; return _allocator[0];} 00131 00133 inline Base& pitch() {if (size() == 6) return 00134 _allocator[4]; return _allocator[1];} 00135 00137 inline Base& yaw() {if (size() == 6) return _allocator[5]; return _allocator[2];} 00138 00139 00143 _Vector<N,Base> operator + (const _Vector<N,Base>& v) const; 00144 00148 _Vector<N,Base>& operator += (const _Vector<N,Base>& v); 00149 00153 _Vector<N,Base> operator - (const _Vector<N,Base>& v) const; 00154 00158 _Vector<N,Base>& operator -= (const _Vector<N,Base>& v); 00159 00162 Base operator *(const _Vector<N,Base>& v) const; 00163 00166 _Vector<N,Base>& operator *= (Base c); 00167 00170 _Vector<N,Base> operator * (Base c) const; 00171 00174 Base squaredNorm() const; 00175 00178 Base norm() const; 00179 00182 void normalize(); 00183 00187 void fill(Base scalar); 00188 00191 _Vector<N,Base> normalized() const; 00192 00195 operator _Matrix<N, 1, Base>() const; 00196 00199 _ArrayAllocator<N,Base> _allocator; 00200 00201 }; 00202 00205 template <int N, typename Base> 00206 std::ostream& operator << (std::ostream& os, const _Vector<N, Base>& v); 00207 00209 template <int N, typename Base> 00210 _Vector<N, Base> operator* (Base x, const _Vector<N, Base>& v); 00211 00212 typedef _Vector<2,int> Vector2i; 00213 typedef _Vector<2,float> Vector2f; 00214 typedef _Vector<3,float> Vector3f; 00215 typedef _Vector<6,float> Vector6f; 00216 00217 00218 typedef _Vector<2,double> Vector2; 00219 typedef _Vector<3,double> Vector3; 00220 typedef _Vector<6,double> Vector6; 00221 00222 // dynamic size vectors 00223 typedef _Vector<0,double> VectorX; 00224 typedef _Vector<0,float> VectorXf; 00225 00226 template <int N, typename Base> 00227 void st2dyn(_Vector<0,Base>& dest, const _Vector<N,Base> src){ 00228 std2dyn(dest._allocator, src._allocator); 00229 } 00230 00231 template <int N, typename Base> 00232 void dyn2st(_Vector<0,Base>& dest, const _Vector<N,Base> src){ 00233 dyn2st(dest._allocator, src._alloator); 00234 } 00235 00237 00238 #include "vector_n.hpp" 00239 00240 #endif