6
6
*/
7
7
#pragma once
8
8
#include < cmath>
9
+ #include < type_traits>
10
+ #include < stdexcept>
9
11
namespace qtnion {
10
12
template <typename T>
11
13
struct quaternion {
12
14
T one;
13
15
T i;
14
16
T j;
15
17
T k;
18
+ static_assert (std::is_arithmetic<T>::value," quaternion requires arithmetic type." );
16
19
/* *
17
20
* @brief 四元数を表す構造体。
18
21
*/
19
- quaternion () { one = i = j = k = 0 ; }
22
+ quaternion () {one = i = j = k = 0 ;}
20
23
quaternion (T one_,T i_ , T j_,T k_) {
21
24
one = one_;
22
25
i=i_;
@@ -27,26 +30,14 @@ namespace qtnion{
27
30
* @brief 四元数に対する通常の加算
28
31
* @param rhs 加数
29
32
*/
30
- quaternion operator +(const quaternion& rhs) const {
31
- quaternion ret;
32
- ret.one = one + rhs.one ;
33
- ret.i = i + rhs.i ;
34
- ret.j = j + rhs.j ;
35
- ret.k = k + rhs.k ;
36
- return ret;
37
- }
33
+ inline quaternion operator +(const quaternion& rhs) const
34
+ { return {one+rhs.one ,i+rhs.i ,j+rhs.j ,k+rhs.k };}
38
35
/* *
39
36
* @brief 四元数に対する通常の減算
40
37
* @param rhs 減数
41
38
*/
42
- quaternion operator -(const quaternion& rhs) const {
43
- quaternion ret;
44
- ret.one = one - rhs.one ;
45
- ret.i = i - rhs.i ;
46
- ret.j = j - rhs.j ;
47
- ret.k = k - rhs.k ;
48
- return ret;
49
- }
39
+ inline quaternion operator -(const quaternion& rhs) const
40
+ {return {one-rhs.one ,i-rhs.i ,j-rhs.j ,k-rhs.k };}
50
41
/* *
51
42
* @brief 四元数に対する通常の乗算
52
43
* @remarks 非可換です。つまり、左辺と右辺を入れ替えると結果が変わ(ることがあ)ります。
@@ -64,53 +55,45 @@ namespace qtnion{
64
55
* @brief 四元数の実数による除算
65
56
* @param rhs 除数
66
57
*/
67
- quaternion operator /(const T rhs) const {
68
- quaternion ret;
69
- ret.one = one/rhs;
70
- ret.i = i/rhs;
71
- ret.j = j/rhs;
72
- ret.k = k/rhs;
73
- return ret;
58
+ inline quaternion operator /(const T rhs) const {
59
+ if (rhs == 0 ) throw std::invalid_argument (" Cannot divide by 0" );
60
+ return {one/rhs,i/rhs,j/rhs,k/rhs};
74
61
}
62
+ inline bool operator ==(const quaternion& rhs) const
63
+ { return (one==rhs.one &&i==rhs.i &&j==rhs.j &&k==rhs.k );}
75
64
};
76
65
/* *
77
66
* @brief 四元数に対する共役
78
67
* @return 四元数の共役
79
68
*/
80
69
template <typename T>
81
- quaternion<T> conjugate (quaternion<T> val) {
82
- quaternion<T> ret;
83
- ret.one =val.one ;
84
- ret.i =-val.i ;
85
- ret.j =-val.j ;
86
- ret.k =-val.k ;
87
- return ret;
88
- }
70
+ inline quaternion<T> conjugate (quaternion<T> val)
71
+ { return {val.one ,-val.i ,-val.j ,-val.k };}
89
72
/* *
90
73
* @brief 四元数に対するノルムの二乗を計算
91
74
* @return 引数のノルムの二乗
92
75
*/
93
76
template <typename T>
94
-
95
- T squ_norm (quaternion<T> val) {return val.one *val.one +val.i *val.i +val.j *val.j +val.k *val.k ;}
77
+ inline T squ_norm (quaternion<T> val)
78
+ {return val.one *val.one +val.i *val.i +val.j *val.j +val.k *val.k ;}
96
79
/* *
97
80
* @brief 四元数の逆数を計算
98
81
* @return 引数の逆数
99
82
*/
100
83
template <typename T>
101
- quaternion<T> inverse (quaternion<T> val) {return conjugate (val)/squ_norm (val);}
84
+ inline quaternion<T> inverse (quaternion<T> val) {return conjugate (val)/squ_norm (val);}
102
85
/* *
103
86
* @brief 四元数に対するノルムを計算
104
87
* @return 自身のノルム
105
88
* @remark 二乗を求めたい場合、squ_normの方がよいと思われます。
106
89
* @see squ_norm()
107
90
*/
108
91
template <typename T>
109
- T norm (const quaternion<T> arg){return sqrt (squ_norm (arg));}
92
+ inline T norm (const quaternion<T> arg){return sqrt (squ_norm (arg));}
110
93
/* *
111
94
* @brief 四元数の標準化をする
112
- * @return もともとの値/それのノルム
95
+ * @return もともとの値をそれのノルムで割ったもの
113
96
*/
114
97
template <typename T>
115
- quaternion<T> normalize (quaternion<T> val) {return val/norm (val);}
98
+ inline quaternion<T> normalize (quaternion<T> val) {return val/norm (val);}
116
99
}
0 commit comments