1#ifndef __JQUATERNION3D__ 
    2#define __JQUATERNION3D__ 
   78      const double theta = atan2(
__u, 
__a) * y;
 
 
   96      return in >> quaternion.
__a >> quaternion.
__u;
 
 
  111      return out << format << quaternion.
__a << 
' ' 
  112                 << format << quaternion.
__u;
 
 
  125      return in >> quaternion.
__a >> quaternion.
__u;
 
 
  138      return out << quaternion.
__a << quaternion.
__u;
 
 
 
  304    public JMath  <JQuaternion3D>,
 
  305    public JMath  <JQuaternion3D, JQuaternion3X>,
 
  306    public JMath  <JQuaternion3D, JQuaternion3Y>,
 
  307    public JMath  <JQuaternion3D, JQuaternion3Z>,
 
  364      const double ct = cos(0.5*theta);
 
  365      const double st = sin(0.5*theta);
 
 
  533      return atan2(sqrt(this->
getB()*this->
getB() +
 
 
  805    void rotate(
double& __x, 
double& __y, 
double& __z)
 const 
  807      const double qx = 2.0 * (
__c*__z - 
__d*__y);
 
  808      const double qy = 2.0 * (
__d*__x - 
__b*__z);
 
  809      const double qz = 2.0 * (
__b*__y - 
__c*__x);
 
 
  826      const double qx = 2.0 * (
__d*__y - 
__c*__z);
 
  827      const double qy = 2.0 * (
__b*__z - 
__d*__x);
 
  828      const double qz = 2.0 * (
__c*__x - 
__b*__y);
 
 
  844                const double         precision = std::numeric_limits<double>::min())
 const 
  846      return (fabs(
getA() - quaternion.
getA()) <= precision && 
 
  847              fabs(
getB() - quaternion.
getB()) <= precision &&
 
  848              fabs(
getC() - quaternion.
getC()) <= precision &&
 
  849              fabs(
getD() - quaternion.
getD()) <= precision);
 
 
  859    bool isIdentity(
const double precision = std::numeric_limits<double>::min())
 const 
  861      if (fabs(
getA()) <= precision) {
 
  863        if (fabs(
getB()) <= precision)
 
  864          return ((fabs(
getC())       <= precision && fabs(fabs(
getD()) - 1.0) <= precision)  ||
 
  865                  (fabs(fabs(
getC()) - 1.0) <= precision && fabs(
getD())       <= precision));
 
  867          return (fabs(fabs(
getB()) - 1.0) <= precision && 
 
  868                  fabs(
getC())             <= precision &&
 
  869                  fabs(
getD())             <= precision);
 
  873        return (fabs(fabs(
getA()) - 1.0) <= precision && 
 
  874                fabs(
getB())             <= precision &&
 
  875                fabs(
getC())             <= precision &&
 
  876                fabs(
getD())             <= precision);
 
 
  911      return JQuaternion3D(quaternion).sub(*this).getLengthSquared();
 
 
  979      const double v = sqrt(
getB() * 
getB()  +
 
  987        const double theta = atan2(v, 
getA());
 
 
 1007      const double MAXIMAL_DOT_PRODUCT = 0.9995;
 
 1015      double dot = v0.
getDot(v1);
 
 1023      double s0 = 1.0 - alpha;
 
 1025      if (dot <= MAXIMAL_DOT_PRODUCT) {
 
 1027        const double theta_0 = acos(dot);
 
 1028        const double theta_1 = theta_0 * alpha;
 
 1030        s1 = sin(theta_1) / sin(theta_0);
 
 1031        s0 = cos(theta_1) - dot * s1;
 
 1034      *
this = (s0 * v0)  +  (s1 * v1);
 
 
 1049      in >> quaternion.
__a;
 
 1050      in >> quaternion.
__b;
 
 1051      in >> quaternion.
__c;
 
 1052      in >> quaternion.
__d;
 
 
 1071      out << format << quaternion.
getA() << 
' ' 
 1072          << format << quaternion.
getB() << 
' ' 
 1073          << format << quaternion.
getC() << 
' ' 
 1074          << format << quaternion.
getD();
 
 
 1089      in >> quaternion.
__a;
 
 1090      in >> quaternion.
__b;
 
 1091      in >> quaternion.
__c;
 
 1092      in >> quaternion.
__d;
 
 
 1107      out << quaternion.
__a;
 
 1108      out << quaternion.
__b;
 
 1109      out << quaternion.
__c;
 
 1110      out << quaternion.
__d;
 
 
 
 1168    double dot = (first.
getA() * second.
getA()  +
 
 1173    dot = 2.0 * dot * dot  -  1.0;
 
 1177    else if (dot < -1.0)
 
 1180      return 0.5 * acos(dot) * 180.0 / 
JMATH::PI;
 
 
JFormat_t & getFormat()
Get format for given type.
 
Base class for data structures with artithmetic capabilities.
 
Data structure for unit quaternion in three dimensions.
 
JQuaternion3D(const JQuaternion3Y &qy)
Constructor.
 
JQuaternion3D(const JQuaternion3X &qx, const JQuaternion3Y &qy, const JQuaternion3Z &qz)
Constructor.
 
const JQuaternion3D & getQuaternion() const
Get quaternion.
 
double getDistanceSquared(const JQuaternion3D &quaternion) const
Get squared of distance to quaternion.
 
JQuaternion3D & mul(const JQuaternion3D &first, const JQuaternion3Z &second)
Quaternion multiplication.
 
JQuaternion3D(const JQuaternion3Z &qz)
Constructor.
 
JQuaternion3D & sub(const JQuaternion3D &quaternion)
Subtract quaternion.
 
JQuaternion3D(const JQuaternion3X &qx)
Constructor.
 
JQuaternion3D & mul(const JQuaternion3D &first, const JQuaternion3D &second)
Quaternion multiplication.
 
JQuaternion3D()
Default constructor.
 
void setQuaternion(const JQuaternion3D &quaternion)
Set quaternion.
 
JQuaternion3D & normalise()
Normalise quaternion.
 
JQuaternion3D getConjugate() const
Get conjugate of this quaternion.
 
void rotate(double &__x, double &__y, double &__z) const
Rotate.
 
bool isIdentity(const double precision=std::numeric_limits< double >::min()) const
Test identity.
 
JQuaternion3D & interpolate(const JQuaternion3D &object, const double alpha)
Interpolation between quaternions.
 
double getAngle() const
Get rotation angle.
 
double getB() const
Get b value.
 
JQuaternion3D & getQuaternion()
Get quaternion.
 
double getD() const
Get d value.
 
JQuaternion3D & mul(const JQuaternion3D &first, const JQuaternion3Y &second)
Quaternion multiplication.
 
double getDistance(const JQuaternion3D &quaternion) const
Get distance to quaternion.
 
JQuaternion3D & conjugate()
Conjugate quaternion.
 
double getLength() const
Get length.
 
void rotate_back(double &__x, double &__y, double &__z) const
Rotate back.
 
double getC() const
Get c value.
 
JQuaternion3D(const double theta, const JVersor3D &dir)
Constructor.
 
JQuaternion3D & mul(const double factor)
Scale quaternion.
 
JQuaternion3D & pow(const double y)
Raise quaternion to given power.
 
friend std::istream & operator>>(std::istream &in, JQuaternion3D &quaternion)
Write quaternion from input.
 
JQuaternion3D(const double a, const double b, const double c, const double d)
Constructor.
 
JQuaternion3D & setIdentity()
Set to identity quaternion.
 
JQuaternion3D & div(const double factor)
Scale quaternion.
 
bool equals(const JQuaternion3D &quaternion, const double precision=std::numeric_limits< double >::min()) const
Check equality.
 
double getDot(const JQuaternion3D &quaternion) const
Get dot product.
 
static const JQuaternion3D & getIdentity()
Get identity quaternion.
 
friend std::ostream & operator<<(std::ostream &out, const JQuaternion3D &quaternion)
Write quaternion to output.
 
friend JWriter & operator<<(JWriter &out, const JQuaternion3D &quaternion)
Write quaternion to output.
 
friend JReader & operator>>(JReader &in, JQuaternion3D &quaternion)
Read quaternion from input.
 
double getA() const
Get a value.
 
JQuaternion3D & negate()
Negate quaternion.
 
double getLengthSquared() const
Get length squared.
 
JQuaternion3D & add(const JQuaternion3D &quaternion)
Add quaternion.
 
JQuaternion3D(const double w, const JVector3D &dir)
Constructor.
 
JQuaternion3D & mul(const JQuaternion3X &qx, const JQuaternion3Y &qy, const JQuaternion3Z &qz)
Quaternion multiplication.
 
JQuaternion3D & mul(const JQuaternion3D &first, const JQuaternion3X &second)
Quaternion multiplication.
 
Data structure for vector in three dimensions.
 
double getY() const
Get y position.
 
double getZ() const
Get z position.
 
double getDot(const JVector3D &vector) const
Get dot product.
 
double getX() const
Get x position.
 
Data structure for normalised vector in three dimensions.
 
double getDY() const
Get y direction.
 
double getDX() const
Get x direction.
 
double getDZ() const
Get z direction.
 
Interface for binary input.
 
Interface for binary output.
 
Auxiliary classes and methods for 3D geometrical objects and operations.
 
double getAngle(const JQuaternion3D &first, const JQuaternion3D &second)
Get space angle between quanternions.
 
static const double PI
Mathematical constants.
 
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
 
This class represents a rotation.
 
friend JWriter & operator<<(JWriter &out, const JQuaternion2D &quaternion)
Write quaternion to output.
 
double getA() const
Get a value.
 
friend std::ostream & operator<<(std::ostream &out, const JQuaternion2D &quaternion)
Write quaternion to output.
 
friend std::istream & operator>>(std::istream &in, JQuaternion2D &quaternion)
Write quaternion from input.
 
JQuaternion2D & pow(const double y)
Raise quaternion to given power.
 
JQuaternion2D(const double theta)
Constructor.
 
JQuaternion2D()
Default constructor.
 
friend JReader & operator>>(JReader &in, JQuaternion2D &quaternion)
Read quaternion from input.
 
Auxiliary data structure for decomposition of quaternion in twist and swing quaternions.
 
JQuaternion3D getQuaternion() const
Get quaternion.
 
JQuaternion3D swing
rotation around perpendicular axis
 
JQuaternion3D twist
rotation around parallel axis
 
decomposition(const JQuaternion3D &Q, const JVector3D &dir)
Constructor.
 
This class represents a rotation around the x-axis.
 
JQuaternion3X(const double theta)
Constructor.
 
JQuaternion3X & pow(const double y)
Raise quaternion to given power.
 
double getB() const
Get b value.
 
JQuaternion3X()
Default constructor.
 
This class represents a rotation around the y-axis.
 
JQuaternion3Y()
Default constructor.
 
JQuaternion3Y & pow(const double y)
Raise quaternion to given power.
 
JQuaternion3Y(const double theta)
Constructor.
 
double getC() const
Get c value.
 
This class represents a rotation around the z-axis.
 
JQuaternion3Z & pow(const double y)
Raise quaternion to given power.
 
double getD() const
Get d value.
 
JQuaternion3Z()
Default constructor.
 
JQuaternion3Z(const double theta)
Constructor.
 
Template definition of auxiliary base class for comparison of data structures.
 
Auxiliary base class for aritmetic operations of derived class types.