The spica renderer
quaternion.h
1 #ifdef _MSC_VER
2 #pragma once
3 #endif
4 
5 #ifndef _SPICA_QUATERNION_H_
6 #define _SPICA_QUATERNION_H_
7 
8 #include <iostream>
9 
10 #include "core/core.hpp"
11 
12 #include "core/common.h"
13 
14 namespace spica {
15 
19  class SPICA_EXPORTS Quaternion {
20  private:
21  double _x, _y, _z, _w;
22 
23  public:
26  Quaternion();
27 
34  Quaternion(double x, double y, double z, double w = 0.0);
35 
39  explicit Quaternion(const Vector3d& v);
40 
43  Quaternion(const Quaternion& q);
44 
47  ~Quaternion();
48 
51  Quaternion& operator=(const Quaternion& q);
52 
55  Quaternion& operator*=(const Quaternion& q);
56 
61  static Quaternion rotation(const Vector3d& axis, double theta);
62 
65  Vector3d applyTo(const Vector3d& v);
66  Point3d applyTo(const Point3d& p);
67  Normal3d applyTo(const Normal3d& n);
68 
71  double squaredNorm() const;
72 
75  double norm() const;
76 
79  Quaternion inverse() const;
80 
83  Vector3d toVector3d() const;
84 
87  std::string toString() const;
88 
90  inline double x() const { return _x; }
91 
93  inline double y() const { return _y; }
94 
96  inline double z() const { return _z; }
97 
99  inline double w() const { return _w; }
100  };
101 
102 } // namespace spica
103 
104 SPICA_EXPORTS
105 spica::Quaternion operator*(const spica::Quaternion& q1,
106  const spica::Quaternion& q2);
107 
108 SPICA_EXPORTS
109 std::ostream& operator<<(std::ostream& os, const spica::Quaternion& q);
110 
111 #endif // _SPICA_QUATERNION_H_
double x() const
The first imaginary part.
Definition: quaternion.h:90
double z() const
The third imaginary part.
Definition: quaternion.h:96
double w() const
The real part.
Definition: quaternion.h:99
double y() const
The second imaginary part.
Definition: quaternion.h:93
Quaternion.
Definition: quaternion.h:19