Skip to content

Commit 0440bb9

Browse files
committed
Assertの追加、Inline化
1 parent bbb4fd9 commit 0440bb9

File tree

1 file changed

+21
-38
lines changed

1 file changed

+21
-38
lines changed

quaternion.h

Lines changed: 21 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,20 @@
66
*/
77
#pragma once
88
#include <cmath>
9+
#include <type_traits>
10+
#include <stdexcept>
911
namespace qtnion{
1012
template <typename T>
1113
struct quaternion {
1214
T one;
1315
T i;
1416
T j;
1517
T k;
18+
static_assert(std::is_arithmetic<T>::value,"quaternion requires arithmetic type.");
1619
/**
1720
* @brief 四元数を表す構造体。
1821
*/
19-
quaternion() { one = i = j = k = 0; }
22+
quaternion() {one = i = j = k = 0;}
2023
quaternion(T one_,T i_ , T j_,T k_) {
2124
one = one_;
2225
i=i_;
@@ -27,26 +30,14 @@ namespace qtnion{
2730
* @brief 四元数に対する通常の加算
2831
* @param rhs 加数
2932
*/
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};}
3835
/**
3936
* @brief 四元数に対する通常の減算
4037
* @param rhs 減数
4138
*/
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};}
5041
/**
5142
* @brief 四元数に対する通常の乗算
5243
* @remarks 非可換です。つまり、左辺と右辺を入れ替えると結果が変わ(ることがあ)ります。
@@ -64,53 +55,45 @@ namespace qtnion{
6455
* @brief 四元数の実数による除算
6556
* @param rhs 除数
6657
*/
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};
7461
}
62+
inline bool operator==(const quaternion& rhs) const
63+
{ return (one==rhs.one&&i==rhs.i&&j==rhs.j&&k==rhs.k);}
7564
};
7665
/**
7766
* @brief 四元数に対する共役
7867
* @return 四元数の共役
7968
*/
8069
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};}
8972
/**
9073
* @brief 四元数に対するノルムの二乗を計算
9174
* @return 引数のノルムの二乗
9275
*/
9376
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;}
9679
/**
9780
* @brief 四元数の逆数を計算
9881
* @return 引数の逆数
9982
*/
10083
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);}
10285
/**
10386
* @brief 四元数に対するノルムを計算
10487
* @return 自身のノルム
10588
* @remark 二乗を求めたい場合、squ_normの方がよいと思われます。
10689
* @see squ_norm()
10790
*/
10891
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));}
11093
/**
11194
* @brief 四元数の標準化をする
112-
* @return もともとの値/それのノルム
95+
* @return もともとの値をそれのノルムで割ったもの
11396
*/
11497
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);}
11699
}

0 commit comments

Comments
 (0)