📄 quaternion.hpp
字号:
// boost quaternion.hpp header file
// (C) Copyright Hubert Holin 2001.
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history.
#ifndef BOOST_QUATERNION_HPP
#define BOOST_QUATERNION_HPP
#include <complex>
#include <iosfwd> // for the "<<" and ">>" operators
#include <sstream> // for the "<<" operator
#include <boost/config.hpp> // for BOOST_NO_STD_LOCALE
#include <boost/detail/workaround.hpp>
#ifndef BOOST_NO_STD_LOCALE
#include <locale> // for the "<<" operator
#endif /* BOOST_NO_STD_LOCALE */
#include <valarray>
#include <boost/math/special_functions/sinc.hpp> // for the Sinus cardinal
#include <boost/math/special_functions/sinhc.hpp> // for the Hyperbolic Sinus cardinal
namespace boost
{
namespace math
{
#if BOOST_WORKAROUND(__GNUC__, < 3)
// gcc 2.95.x uses expression templates for valarray calculations, but
// the result is not conforming. We need BOOST_GET_VALARRAY to get an
// actual valarray result when we need to call a member function
#define BOOST_GET_VALARRAY(T,x) ::std::valarray<T>(x)
// gcc 2.95.x has an "std::ios" class that is similar to
// "std::ios_base", so we just use a #define
#define BOOST_IOS_BASE ::std::ios
// gcc 2.x ignores function scope using declarations,
// put them in the scope of the enclosing namespace instead:
using ::std::valarray;
using ::std::sqrt;
using ::std::cos;
using ::std::sin;
using ::std::exp;
using ::std::cosh;
#endif /* BOOST_WORKAROUND(__GNUC__, < 3) */
#define BOOST_QUATERNION_ACCESSOR_GENERATOR(type) \
type real() const \
{ \
return(a); \
} \
\
quaternion<type> unreal() const \
{ \
return(quaternion<type>(static_cast<type>(0),b,c,d)); \
} \
\
type R_component_1() const \
{ \
return(a); \
} \
\
type R_component_2() const \
{ \
return(b); \
} \
\
type R_component_3() const \
{ \
return(c); \
} \
\
type R_component_4() const \
{ \
return(d); \
} \
\
::std::complex<type> C_component_1() const \
{ \
return(::std::complex<type>(a,b)); \
} \
\
::std::complex<type> C_component_2() const \
{ \
return(::std::complex<type>(c,d)); \
}
#define BOOST_QUATERNION_MEMBER_ASSIGNMENT_GENERATOR(type) \
template<typename X> \
quaternion<type> & operator = (quaternion<X> const & a_affecter) \
{ \
a = static_cast<type>(a_affecter.R_component_1()); \
b = static_cast<type>(a_affecter.R_component_2()); \
c = static_cast<type>(a_affecter.R_component_3()); \
d = static_cast<type>(a_affecter.R_component_4()); \
\
return(*this); \
} \
\
quaternion<type> & operator = (quaternion<type> const & a_affecter) \
{ \
a = a_affecter.a; \
b = a_affecter.b; \
c = a_affecter.c; \
d = a_affecter.d; \
\
return(*this); \
} \
\
quaternion<type> & operator = (type const & a_affecter) \
{ \
a = a_affecter; \
\
b = c = d = static_cast<type>(0); \
\
return(*this); \
} \
\
quaternion<type> & operator = (::std::complex<type> const & a_affecter) \
{ \
a = a_affecter.real(); \
b = a_affecter.imag(); \
\
c = d = static_cast<type>(0); \
\
return(*this); \
}
#define BOOST_QUATERNION_MEMBER_DATA_GENERATOR(type) \
type a; \
type b; \
type c; \
type d;
template<typename T>
class quaternion
{
public:
typedef T value_type;
// constructor for H seen as R^4
// (also default constructor)
explicit quaternion( T const & requested_a = T(),
T const & requested_b = T(),
T const & requested_c = T(),
T const & requested_d = T())
: a(requested_a),
b(requested_b),
c(requested_c),
d(requested_d)
{
// nothing to do!
}
// constructor for H seen as C^2
explicit quaternion( ::std::complex<T> const & z0,
::std::complex<T> const & z1 = ::std::complex<T>())
: a(z0.real()),
b(z0.imag()),
c(z1.real()),
d(z1.imag())
{
// nothing to do!
}
// UNtemplated copy constructor
// (this is taken care of by the compiler itself)
// templated copy constructor
template<typename X>
explicit quaternion(quaternion<X> const & a_recopier)
: a(static_cast<T>(a_recopier.R_component_1())),
b(static_cast<T>(a_recopier.R_component_2())),
c(static_cast<T>(a_recopier.R_component_3())),
d(static_cast<T>(a_recopier.R_component_4()))
{
// nothing to do!
}
// 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(T)
// assignment operators
BOOST_QUATERNION_MEMBER_ASSIGNMENT_GENERATOR(T)
// 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);"
quaternion<T> & operator += (T const & rhs)
{
T at = a + rhs; // exception guard
a = at;
return(*this);
}
quaternion<T> & operator += (::std::complex<T> const & rhs)
{
T at = a + rhs.real(); // exception guard
T bt = b + rhs.imag(); // exception guard
a = at;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -