📄 octonion.hpp
字号:
b(requested_b),
c(requested_c),
d(requested_d),
e(requested_e),
f(requested_f),
g(requested_g),
h(requested_h)
{
// nothing to do!
}
// constructor for H seen as C^4
explicit octonion( ::std::complex<T> const & z0,
::std::complex<T> const & z1 = ::std::complex<T>(),
::std::complex<T> const & z2 = ::std::complex<T>(),
::std::complex<T> const & z3 = ::std::complex<T>())
: a(z0.real()),
b(z0.imag()),
c(z1.real()),
d(z1.imag()),
e(z2.real()),
f(z2.imag()),
g(z3.real()),
h(z3.imag())
{
// nothing to do!
}
// constructor for O seen as H^2
explicit octonion( ::boost::math::quaternion<T> const & q0,
::boost::math::quaternion<T> const & q1 = ::boost::math::quaternion<T>())
: a(q0.R_component_1()),
b(q0.R_component_2()),
c(q0.R_component_3()),
d(q0.R_component_4()),
e(q1.R_component_1()),
f(q1.R_component_2()),
g(q1.R_component_3()),
h(q1.R_component_4())
{
// nothing to do!
}
// UNtemplated copy constructor
// (this is taken care of by the compiler itself)
// templated copy constructor
template<typename X>
explicit octonion(octonion<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())),
e(static_cast<T>(a_recopier.R_component_5())),
f(static_cast<T>(a_recopier.R_component_6())),
g(static_cast<T>(a_recopier.R_component_7())),
h(static_cast<T>(a_recopier.R_component_8()))
{
// nothing to do!
}
// destructor
// (this is taken care of by the compiler itself)
// accessors
//
// Note: Like complex number, octonions 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 an octonion, 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_OCTONION_ACCESSOR_GENERATOR(T)
// assignment operators
BOOST_OCTONION_MEMBER_ASSIGNMENT_GENERATOR(T)
// other assignment-related operators
//
// NOTE: Octonion multiplication is *NOT* commutative;
// symbolically, "q *= rhs;" means "q = q * rhs;"
// and "q /= rhs;" means "q = q * inverse_of(rhs);";
// octonion multiplication is also *NOT* associative
octonion<T> & operator += (T const & rhs)
{
T at = a + rhs; // exception guard
a = at;
return(*this);
}
octonion<T> & operator += (::std::complex<T> const & rhs)
{
T at = a + rhs.real(); // exception guard
T bt = b + rhs.imag(); // exception guard
a = at;
b = bt;
return(*this);
}
octonion<T> & operator += (::boost::math::quaternion<T> const & rhs)
{
T at = a + rhs.R_component_1(); // exception guard
T bt = b + rhs.R_component_2(); // exception guard
T ct = c + rhs.R_component_3(); // exception guard
T dt = d + rhs.R_component_4(); // exception guard
a = at;
b = bt;
c = ct;
d = dt;
return(*this);
}
template<typename X>
octonion<T> & operator += (octonion<X> const & rhs)
{
T at = a + static_cast<T>(rhs.R_component_1()); // exception guard
T bt = b + static_cast<T>(rhs.R_component_2()); // exception guard
T ct = c + static_cast<T>(rhs.R_component_3()); // exception guard
T dt = d + static_cast<T>(rhs.R_component_4()); // exception guard
T et = e + static_cast<T>(rhs.R_component_5()); // exception guard
T ft = f + static_cast<T>(rhs.R_component_6()); // exception guard
T gt = g + static_cast<T>(rhs.R_component_7()); // exception guard
T ht = h + static_cast<T>(rhs.R_component_8()); // exception guard
a = at;
b = bt;
c = ct;
d = dt;
e = et;
f = ft;
g = gt;
h = ht;
return(*this);
}
octonion<T> & operator -= (T const & rhs)
{
T at = a - rhs; // exception guard
a = at;
return(*this);
}
octonion<T> & operator -= (::std::complex<T> const & rhs)
{
T at = a - rhs.real(); // exception guard
T bt = b - rhs.imag(); // exception guard
a = at;
b = bt;
return(*this);
}
octonion<T> & operator -= (::boost::math::quaternion<T> const & rhs)
{
T at = a - rhs.R_component_1(); // exception guard
T bt = b - rhs.R_component_2(); // exception guard
T ct = c - rhs.R_component_3(); // exception guard
T dt = d - rhs.R_component_4(); // exception guard
a = at;
b = bt;
c = ct;
d = dt;
return(*this);
}
template<typename X>
octonion<T> & operator -= (octonion<X> const & rhs)
{
T at = a - static_cast<T>(rhs.R_component_1()); // exception guard
T bt = b - static_cast<T>(rhs.R_component_2()); // exception guard
T ct = c - static_cast<T>(rhs.R_component_3()); // exception guard
T dt = d - static_cast<T>(rhs.R_component_4()); // exception guard
T et = e - static_cast<T>(rhs.R_component_5()); // exception guard
T ft = f - static_cast<T>(rhs.R_component_6()); // exception guard
T gt = g - static_cast<T>(rhs.R_component_7()); // exception guard
T ht = h - static_cast<T>(rhs.R_component_8()); // exception guard
a = at;
b = bt;
c = ct;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -