Jafar
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
Repere3D.hpp
00001 #ifndef _REPERE_H_
00002 #define _REPERE_H_
00003 
00004 #include <kernel/jafarMacro.hpp>
00005 #include <geom/t3dEuler.hpp>
00006 #include <jmath/jblas.hpp>
00007 
00008 // #include "facetsmap/functions.hpp"
00009 
00010 namespace jafar {
00011 namespace geom {
00016   class Repere3D {
00017     private:
00021       inline Repere3D() : m_ref(0) , m_t3d_uptodate(false), range03(0,3) {
00022         JFR_DEBUG("Construct the global reference");
00023         initIdentityRepere3D();
00024       };
00025       void initIdentityRepere3D();
00026     public:
00030       Repere3D(const Repere3D* ref, jblas::vec3 origin,jblas::vec3 i, jblas::vec3 j, jblas::vec3 k);
00035       inline Repere3D(const Repere3D* ref) : m_ref(ref), m_t3d_uptodate(false), range03(0,3)
00036       {
00037         if(m_ref==0) m_ref = global();
00038         initIdentityRepere3D();
00039       };
00040     public:
00041       static inline Repere3D* copyRepere3D(Repere3D* r)
00042       {
00043         return new Repere3D(r->ref(), r->origin(), r->i(),r->j(),r->k());
00044       }
00045       static inline const Repere3D* global()
00046       { return (s_globalRef == 0) ? (s_globalRef = new Repere3D()) : s_globalRef ; }
00051       inline const Repere3D* ref() const { return m_ref; }
00055       void changeRef(const Repere3D*);
00059       inline void setRef(const Repere3D* ref) { m_ref = ref; }
00063       inline bool isGlobal() const { return (m_ref == 0); }
00067       inline jblas::vec4 i() const { return m_i; }
00068       inline jblas::vec4 globalI() const {
00069         if(isGlobal() or ref()->isGlobal()) return i();
00070         return ref()->localToGlobal(i());
00071       }
00075       inline jblas::vec4 j() const { return m_j; }
00076       inline jblas::vec4 globalJ() const {
00077         if(isGlobal() or ref()->isGlobal()) return j();
00078         return ref()->localToGlobal(j());
00079       }
00083       inline jblas::vec4 k() const { return m_k; }
00084       inline jblas::vec4 globalK() const {
00085         if(isGlobal() or ref()->isGlobal()) return k();
00086         return ref()->localToGlobal(k());
00087       }
00091       inline jblas::vec4 origin() const { return m_origin; }
00092       
00093       inline jblas::vec4 globalOrigin() const {
00094         if(isGlobal() or ref()->isGlobal()) return origin();
00095         return ref()->localToGlobal(origin());
00096       }
00097       
00098       void compose( const geom::T3DEuler& );
00099       
00103       jblas::vec toEuler() const;
00104       void fromEuler(const jblas::vec&);
00105     public: // Formula to change the repere
00106       inline jblas::vec4 localToGlobal(jblas::vec4 v) const {
00107         if(isGlobal()) return v;
00108         jblas::mat44 localToGlobalMat = localToGlobal().getM();
00109         return ublas::prod(localToGlobalMat, v);
00110       }
00111       inline jblas::vec4 globalToLocal(jblas::vec4 v) const {
00112         if(isGlobal()) return v;
00113         jblas::mat44 globalToLocalMat = globalToLocal().getM();
00114         return ublas::prod(globalToLocalMat, v);
00115       }
00116       geom::T3DEuler localToParent() const;
00117       void localToParent(geom::T3DEuler&) const;
00118       geom::T3DEuler parentToLocal() const;
00119       void parentToLocal(geom::T3DEuler&) const;
00120       geom::T3DEuler localToGlobal() const;
00121       void localToGlobal(geom::T3DEuler&) const;
00122       geom::T3DEuler globalToLocal() const;
00123       void globalToLocal(geom::T3DEuler&) const;
00124     public:
00128       template<typename _T>
00129       inline void setI(const _T& ni) {
00130           m_t3d_uptodate = false;
00131           ublas::vector_range<jblas::vec4>(m_i, range03) = ublas::vector_range<const _T>(ni, range03);;
00132       }
00136       template<typename _T>
00137       inline void setJ(const _T& nj) {
00138           m_t3d_uptodate = false;
00139           ublas::vector_range<jblas::vec4>(m_j, range03) = ublas::vector_range<const _T>(nj, range03);
00140       }
00144       template<typename _T>
00145       inline void setK(const _T& nk) {
00146           m_t3d_uptodate = false;
00147           ublas::vector_range<jblas::vec4>(m_k, range03) = ublas::vector_range<const _T>(nk, range03);
00148       }
00152       template<typename _T>
00153       inline void setOrigin(const _T& no) {
00154           m_t3d_uptodate = false;
00155           ublas::vector_range<jblas::vec4>(m_origin, range03) = ublas::vector_range<const _T>(no, range03);
00156       }
00157     private:
00158       static Repere3D* s_globalRef;
00159       const Repere3D* m_ref;
00160       jblas::vec4 m_i,m_j,m_k, m_origin;
00161       mutable bool m_t3d_uptodate;
00162       mutable geom::T3DEuler m_thisToRef;
00163       ublas::range range03;
00164   };
00165 
00166 }
00167 }
00168 
00169 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines

Generated on Wed Oct 15 2014 00:37:19 for Jafar by doxygen 1.7.6.1
LAAS-CNRS