41 using namespace mrpt::math;
85 inline CPose3DQuat() : m_quat() { m_coords[0]=m_coords[1]=m_coords[2]=0.; }
112 v[0] = m_coords[0]; v[1] = m_coords[1]; v[2] = m_coords[2];
113 v[3] = m_quat[0]; v[4] = m_quat[1]; v[5] = m_quat[2]; v[6] = m_quat[3];
120 void composeFrom(
const CPose3DQuat& A,
const CPose3DQuat& B );
126 void inverseComposeFrom(
const CPose3DQuat& A,
const CPose3DQuat& B );
131 void composePoint(
const double lx,
const double ly,
const double lz,
double &gx,
double &gy,
double &gz,
138 void inverseComposePoint(
const double gx,
const double gy,
const double gz,
double &lx,
double &ly,
double &lz,
145 template <
class POINT1,
class POINT2>
inline void composePoint(
const POINT1 &L, POINT2 &G)
const {
composePoint(L[0],L[1],L[2], G[0],G[1],G[2]); }
169 composeFrom(*
this,b);
182 inline CPose3DQuat& operator -= (
const CPose3DQuat& b)
184 inverseComposeFrom(*
this,b);
199 void asString(std::string &s)
const { s =
mrpt::format(
"[%f %f %f %f %f %f %f]",m_coords[0],m_coords[1],m_coords[2],m_quat[0],m_quat[1],m_quat[2],m_quat[3]); }
208 if (!m.fromMatlabStringFormat(s))
THROW_EXCEPTION(
"Malformed expression in ::fromString");
210 m_coords[0] = m.get_unsafe(0,0); m_coords[1] = m.get_unsafe(0,1); m_coords[2] = m.get_unsafe(0,2);
211 m_quat[0] = m.get_unsafe(0,3); m_quat[1] = m.get_unsafe(0,4); m_quat[2] = m.get_unsafe(0,5); m_quat[3] = m.get_unsafe(0,6);
215 inline const double &operator[](
unsigned int i)
const
219 case 0:
return m_coords[0];
220 case 1:
return m_coords[1];
221 case 2:
return m_coords[2];
222 case 3:
return m_quat[0];
223 case 4:
return m_quat[1];
224 case 5:
return m_quat[2];
225 case 6:
return m_quat[3];
227 throw std::runtime_error(
"CPose3DQuat::operator[]: Index of bounds.");
231 inline double &operator[](
unsigned int i)
235 case 0:
return m_coords[0];
236 case 1:
return m_coords[1];
237 case 2:
return m_coords[2];
238 case 3:
return m_quat[0];
239 case 4:
return m_quat[1];
240 case 5:
return m_quat[2];
241 case 6:
return m_quat[3];
243 throw std::runtime_error(
"CPose3DQuat::operator[]: Index of bounds.");
251 void sphericalCoordinates(
262 enum { is_3D_val = 1 };
263 static inline bool is_3D() {
return is_3D_val!=0; }
264 enum { rotation_dimensions = 3 };
265 enum { is_PDF_val = 1 };
266 static inline bool is_PDF() {
return is_PDF_val!=0; }
282 static inline bool empty() {
return false; }
284 static inline void resize(
const size_t n) {
if (n!=
static_size)
throw std::logic_error(
format(
"Try to change the size of CPose3DQuat to %u.",static_cast<unsigned>(n))); }
286 inline void assign(
const size_t N,
const double val)
288 if (N!=7)
throw std::runtime_error(
"CPose3DQuat::assign: Try to resize to length!=7.");
296 typedef std::iterator<std::random_access_iterator_tag,value_type>
iterator_base;
299 typedef value_type
T;
301 inline void check_limits(
bool allow_end =
false)
const
304 ASSERTMSG_(m_obj!=NULL,
"non initialized iterator");
305 if (m_cur_idx> (allow_end ? 7u : 6u) )
THROW_EXCEPTION(
"Index out of range in iterator.")
312 inline iterator(CPose3DQuat &obj,
size_t start_idx) : m_obj(&obj),m_cur_idx(start_idx) { check_limits(
true); }
345 return (*
this)+=(-off);
361 typedef std::iterator<std::random_access_iterator_tag,value_type>
iterator_base;
364 typedef value_type
T;
366 inline void check_limits(
bool allow_end =
false)
const
369 ASSERTMSG_(m_obj!=NULL,
"non initialized iterator");
370 if (m_cur_idx> (allow_end ? 7u : 6u) )
THROW_EXCEPTION(
"Index out of range in iterator.")
377 inline const_iterator(
const CPose3DQuat &obj,
size_t start_idx) : m_obj(&obj),m_cur_idx(start_idx) { check_limits(
true); }
410 return (*
this)+=(-off);
429 inline reverse_iterator
rbegin() {
return reverse_iterator(
end()); }
430 inline const_reverse_iterator
rbegin()
const {
return const_reverse_iterator(
end()); }
431 inline reverse_iterator
rend() {
return reverse_iterator(
begin()); }
432 inline const_reverse_iterator
rend()
const {
return const_reverse_iterator(
begin()); }
435 void swap (CPose3DQuat& o)