📄 quaternion.hpp
字号:
\ a = tt[0]; \ b = tt[1]; \ c = tt[2]; \ d = tt[3]; \ \ return(*this); \ }#elif defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP) #define BOOST_QUATERNION_MEMBER_DIV_GENERATOR_3(type) \ template<typename X> \ quaternion<type> & operator /= (quaternion<X> const & rhs) \ { \ using ::std::valarray; \ using ::std::abs; \ \ valarray<type> tr(4); \ \ tr[0] = static_cast<type>(rhs.R_component_1()); \ tr[1] = static_cast<type>(rhs.R_component_2()); \ tr[2] = static_cast<type>(rhs.R_component_3()); \ tr[3] = static_cast<type>(rhs.R_component_4()); \ \ type mixam = static_cast<type>(1)/(abs(tr).max)(); \ \ tr *= mixam; \ \ valarray<type> tt(4); \ \ tt[0] = +a*tr[0]+b*tr[1]+c*tr[2]+d*tr[3]; \ tt[1] = -a*tr[1]+b*tr[0]-c*tr[3]+d*tr[2]; \ tt[2] = -a*tr[2]+b*tr[3]+c*tr[0]-d*tr[1]; \ tt[3] = -a*tr[3]-b*tr[2]+c*tr[1]+d*tr[0]; \ \ tr *= tr; \ \ tt *= (mixam/tr.sum()); \ \ a = tt[0]; \ b = tt[1]; \ c = tt[2]; \ d = tt[3]; \ \ return(*this); \ }#else #define BOOST_QUATERNION_MEMBER_DIV_GENERATOR_3(type) \ template<typename X> \ quaternion<type> & operator /= (quaternion<X> const & rhs) \ { \ using ::std::valarray; \ \ valarray<type> tr(4); \ \ tr[0] = static_cast<type>(rhs.R_component_1()); \ tr[1] = static_cast<type>(rhs.R_component_2()); \ tr[2] = static_cast<type>(rhs.R_component_3()); \ tr[3] = static_cast<type>(rhs.R_component_4()); \ \ type mixam = static_cast<type>(1)/(abs(tr).max)(); \ \ tr *= mixam; \ \ valarray<type> tt(4); \ \ tt[0] = +a*tr[0]+b*tr[1]+c*tr[2]+d*tr[3]; \ tt[1] = -a*tr[1]+b*tr[0]-c*tr[3]+d*tr[2]; \ tt[2] = -a*tr[2]+b*tr[3]+c*tr[0]-d*tr[1]; \ tt[3] = -a*tr[3]-b*tr[2]+c*tr[1]+d*tr[0]; \ \ tr *= tr; \ \ tt *= (mixam/tr.sum()); \ \ a = tt[0]; \ b = tt[1]; \ c = tt[2]; \ d = tt[3]; \ \ return(*this); \ }#endif /* defined(__GNUC__) && (__GNUC__ < 3) */ /* BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP */ #define BOOST_QUATERNION_MEMBER_ADD_GENERATOR(type) \ BOOST_QUATERNION_MEMBER_ADD_GENERATOR_1(type) \ BOOST_QUATERNION_MEMBER_ADD_GENERATOR_2(type) \ BOOST_QUATERNION_MEMBER_ADD_GENERATOR_3(type) #define BOOST_QUATERNION_MEMBER_SUB_GENERATOR(type) \ BOOST_QUATERNION_MEMBER_SUB_GENERATOR_1(type) \ BOOST_QUATERNION_MEMBER_SUB_GENERATOR_2(type) \ BOOST_QUATERNION_MEMBER_SUB_GENERATOR_3(type) #define BOOST_QUATERNION_MEMBER_MUL_GENERATOR(type) \ BOOST_QUATERNION_MEMBER_MUL_GENERATOR_1(type) \ BOOST_QUATERNION_MEMBER_MUL_GENERATOR_2(type) \ BOOST_QUATERNION_MEMBER_MUL_GENERATOR_3(type) #define BOOST_QUATERNION_MEMBER_DIV_GENERATOR(type) \ BOOST_QUATERNION_MEMBER_DIV_GENERATOR_1(type) \ BOOST_QUATERNION_MEMBER_DIV_GENERATOR_2(type) \ BOOST_QUATERNION_MEMBER_DIV_GENERATOR_3(type) #define BOOST_QUATERNION_MEMBER_ALGEBRAIC_GENERATOR(type) \ BOOST_QUATERNION_MEMBER_ADD_GENERATOR(type) \ BOOST_QUATERNION_MEMBER_SUB_GENERATOR(type) \ BOOST_QUATERNION_MEMBER_MUL_GENERATOR(type) \ BOOST_QUATERNION_MEMBER_DIV_GENERATOR(type) template<> class quaternion<float> { public: typedef float value_type; BOOST_QUATERNION_CONSTRUCTOR_GENERATOR(float) // UNtemplated copy constructor // (this is taken care of by the compiler itself) // explicit copy constructors (precision-loosing converters) explicit quaternion(quaternion<double> const & a_recopier) { *this = detail::quaternion_type_converter<float, double>(a_recopier); } explicit quaternion(quaternion<long double> const & a_recopier) { *this = detail::quaternion_type_converter<float, long double>(a_recopier); } // destructor // (this is taken care of by the compiler itself) // accessors // // Note: Like complex number, quaternions do have a meaningful notion of "real part", // but unlike them there is no meaningful notion of "imaginary part". // Instead there is an "unreal part" which itself is a quaternion, and usually // nothing simpler (as opposed to the complex number case). // However, for practicallity, there are accessors for the other components // (these are necessary for the templated copy constructor, for instance). BOOST_QUATERNION_ACCESSOR_GENERATOR(float) // assignment operators BOOST_QUATERNION_MEMBER_ASSIGNMENT_GENERATOR(float) // other assignment-related operators // // NOTE: Quaternion multiplication is *NOT* commutative; // symbolically, "q *= rhs;" means "q = q * rhs;" // and "q /= rhs;" means "q = q * inverse_of(rhs);" BOOST_QUATERNION_MEMBER_ALGEBRAIC_GENERATOR(float) protected: BOOST_QUATERNION_MEMBER_DATA_GENERATOR(float) private: }; template<> class quaternion<double> { public: typedef double value_type; BOOST_QUATERNION_CONSTRUCTOR_GENERATOR(double) // UNtemplated copy constructor // (this is taken care of by the compiler itself) // converting copy constructor explicit quaternion(quaternion<float> const & a_recopier) { *this = detail::quaternion_type_converter<double, float>(a_recopier); } // explicit copy constructors (precision-loosing converters) explicit quaternion(quaternion<long double> const & a_recopier) { *this = detail::quaternion_type_converter<double, long double>(a_recopier); } // destructor // (this is taken care of by the compiler itself) // accessors // // Note: Like complex number, quaternions do have a meaningful notion of "real part", // but unlike them there is no meaningful notion of "imaginary part". // Instead there is an "unreal part" which itself is a quaternion, and usually // nothing simpler (as opposed to the complex number case). // However, for practicallity, there are accessors for the other components // (these are necessary for the templated copy constructor, for instance). BOOST_QUATERNION_ACCESSOR_GENERATOR(double) // assignment operators BOOST_QUATERNION_MEMBER_ASSIGNMENT_GENERATOR(double) // other assignment-related operators // // NOTE: Quaternion multiplication is *NOT* commutative; // symbolically, "q *= rhs;" means "q = q * rhs;" // and "q /= rhs;" means "q = q * inverse_of(rhs);" BOOST_QUATERNION_MEMBER_ALGEBRAIC_GENERATOR(double) protected: BOOST_QUATERNION_MEMBER_DATA_GENERATOR(double) private: }; template<> class quaternion<long double> { public: typedef long double value_type; BOOST_QUATERNION_CONSTRUCTOR_GENERATOR(long double) // UNtemplated copy constructor
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -