91 lines
2.4 KiB
C++
91 lines
2.4 KiB
C++
/* -*- C++ -*- ------------------------------------------------------------
|
|
|
|
Copyright (c) 2007 Jesse Anders and Demian Nave http://cmldev.net/
|
|
|
|
The Configurable Math Library (CML) is distributed under the terms of the
|
|
Boost Software License, v1.0 (see cml/LICENSE for details).
|
|
|
|
*-----------------------------------------------------------------------*/
|
|
/** @file
|
|
* @brief
|
|
*/
|
|
|
|
#ifndef quaternion_print_h
|
|
#define quaternion_print_h
|
|
|
|
#include <iostream>
|
|
|
|
namespace cml {
|
|
|
|
/* NOTE: Made 'plain' quaternion output the default (Jesse) */
|
|
|
|
/* #if !defined(CML_PLAIN_QUATERNION_OUTPUT) */
|
|
#if defined(CML_COMPLEX_QUATERNION_OUTPUT)
|
|
|
|
template<typename E, class AT, class CT> std::ostream&
|
|
operator<<(std::ostream& os, const cml::quaternion<E,AT,scalar_first,CT>& q)
|
|
{
|
|
os << ((q[0] < 0)?" - ":"") << std::fabs(q[0]);
|
|
os << ((q[1] < 0)?" - ":" + ") << std::fabs(q[1]) << "i";
|
|
os << ((q[2] < 0)?" - ":" + ") << std::fabs(q[2]) << "j";
|
|
os << ((q[3] < 0)?" - ":" + ") << std::fabs(q[3]) << "k";
|
|
return os;
|
|
}
|
|
|
|
template<typename E, class AT, class CT> std::ostream&
|
|
operator<<(std::ostream& os, const cml::quaternion<E,AT,vector_first,CT>& q)
|
|
{
|
|
os << ((q[0] < 0)?" - ":"") << std::fabs(q[0]) << "i";
|
|
os << ((q[1] < 0)?" - ":" + ") << std::fabs(q[1]) << "j";
|
|
os << ((q[2] < 0)?" - ":" + ") << std::fabs(q[2]) << "k";
|
|
os << ((q[3] < 0)?" - ":" + ") << std::fabs(q[3]);
|
|
return os;
|
|
}
|
|
|
|
#else
|
|
|
|
/** Output a quaternion to a std::ostream. */
|
|
template<typename E, class AT, class OT, typename CT> std::ostream&
|
|
operator<<(std::ostream& os, const cml::quaternion<E,AT,OT,CT>& q)
|
|
{
|
|
typedef typename cml::quaternion<E,AT,OT,CT>::order_type order_type;
|
|
enum {
|
|
W = order_type::W,
|
|
X = order_type::X,
|
|
Y = order_type::Y,
|
|
Z = order_type::Z
|
|
};
|
|
|
|
os << "[ "
|
|
<< " " << q[W]
|
|
<< " " << q[X]
|
|
<< " " << q[Y]
|
|
<< " " << q[Z]
|
|
<< " ]";
|
|
|
|
return os;
|
|
}
|
|
|
|
#endif
|
|
|
|
/** Output a quaternion expression to a std::ostream. */
|
|
template< class XprT > inline std::ostream&
|
|
operator<<(std::ostream& os, const et::QuaternionXpr<XprT>& q)
|
|
{
|
|
typedef typename et::QuaternionXpr<XprT>::result_type quaternion_type;
|
|
|
|
os << quaternion_type(q);
|
|
/* XXX This temporary can be removed by templating the stream insertion
|
|
* operators above.
|
|
*/
|
|
|
|
return os;
|
|
}
|
|
|
|
} // namespace cml
|
|
|
|
#endif
|
|
|
|
// -------------------------------------------------------------------------
|
|
// vim:ft=cpp
|