#ifndef GEOMETRY_UTILS_TRANSFORM3_H #define GEOMETRY_UTILS_TRANSFORM3_H #include "Vector3.h" #include "Rotation3.h" #include "Transform2.h" namespace geometry_utils { template struct Transform3Base { typedef boost::shared_ptr Ptr; typedef boost::shared_ptr ConstPtr; Vector3Base translation; Rotation3Base rotation; Transform3Base() { translation.Zeros(); rotation.Eye(); } Transform3Base(const Vector3Base& translation_, const Rotation3Base& rotation_) : translation(translation_), rotation(rotation_) {} Transform3Base(const Transform3Base& in) : translation(in.translation), rotation(in.rotation) {} Transform3Base(const Transform2Base& in) { translation(0) = in.translation(0); translation(1) = in.translation(1); translation(2) = 0; rotation.Eye(); for (unsigned int i = 0; i < 2; i++) for (unsigned int j = 0; j < 2; j++) rotation(i, j) = in.Rotation(i, j); } Transform3Base& operator=(const Transform3Base& rhs) { if (this == &rhs) return *this; translation = rhs.translation; rotation = rhs.rotation; return *this; } Vector3Base operator*(const Vector3Base& p) const { return rotation * p + translation; } Transform3Base operator+(const Transform3Base& t) const { return Transform3Base(translation + rotation * t.translation, rotation * t.rotation); } bool operator==(const Transform3Base& that) const { return this->Equals(that); } bool operator!=(const Transform3Base& that) const { return !this->Equals(that); } bool Equals(const Transform3Base& that, const T ptol = 1e-5, const T rtol = 1e-5) const { return (translation.Equals(that.translation, ptol) && rotation.Equals(that.rotation, rtol)); } void Print(const std::string& prefix = std::string()) const { if (!prefix.empty()) std::cout << prefix << std::endl; std::cout << (*this) << std::endl; } static Transform3Base Identity() { return Transform3Base(); } }; template std::ostream& operator<<(std::ostream& out, const Transform3Base& m) { out << "Translation:" << std::endl << m.translation << std::endl; out << "Rotation:" << std::endl << m.rotation; return out; } template Transform3Base PoseUpdate(const Transform3Base& t1, const Transform3Base& t2) { return Transform3Base(t1.translation + t1.rotation * t2.translation, t1.rotation * t2.rotation); } template Transform3Base PoseInverse(const Transform3Base& t) { return Transform3Base(-1.0 * t.rotation.Trans() * t.translation, t.rotation.Trans()); } template Transform3Base PoseDelta(const Transform3Base& t1, const Transform3Base& t2) { return Transform3Base( t1.rotation.Trans() * (t2.translation - t1.translation), t1.rotation.Trans() * t2.rotation); } typedef Transform3Base Transform3f; typedef Transform3Base Transform3d; typedef Transform3d Transform3; typedef Transform3 Tr3; } #endif