Blame view

stim/math/quaternion.h 3.19 KB
57729e5b   David Mayerich   changed directory...
1
2
3
  #ifndef RTS_QUATERNION_H

  #define RTS_QUATERNION_H

  

7d1d153a   Pavel Govyadinov   fixed the include...
4
5
  #include <stim/math/matrix.h>

  #include <stim/cuda/cudatools/callable.h>

d609550e   David Mayerich   fixed bug in plan...
6
  

8a86bd56   David Mayerich   changed rts names...
7
  namespace stim{

57729e5b   David Mayerich   changed directory...
8
9
10
11
12
13
14
15
16
17
  

  template<typename T>

  class quaternion

  {

  public:

  	T w;

  	T x;

  	T y;

  	T z;

  

d609550e   David Mayerich   fixed bug in plan...
18
  	CUDA_CALLABLE void normalize(){

57729e5b   David Mayerich   changed directory...
19
  

d609550e   David Mayerich   fixed bug in plan...
20
21
22
23
24
25
  		double length=sqrt(w*w + x*x + y*y + z*z);

  		w=w/length;

  		x=x/length;

  		y=y/length;

  		z=z/length;

  	}

57729e5b   David Mayerich   changed directory...
26
  

d609550e   David Mayerich   fixed bug in plan...
27
  	CUDA_CALLABLE void CreateRotation(T theta, T ux, T uy, T uz){

57729e5b   David Mayerich   changed directory...
28
  

487a9b49   David Mayerich   added the ability...
29
  		vec<T> u(ux, uy, uz);

d609550e   David Mayerich   fixed bug in plan...
30
31
  		CreateRotation(theta, u);		

  	}

57729e5b   David Mayerich   changed directory...
32
  

487a9b49   David Mayerich   added the ability...
33
  	CUDA_CALLABLE void CreateRotation(T theta, vec<T> u){

57729e5b   David Mayerich   changed directory...
34
  

487a9b49   David Mayerich   added the ability...
35
  		vec<T> u_hat = u.norm();

8d4f0940   David Mayerich   ERROR in plane wa...
36
  

d609550e   David Mayerich   fixed bug in plan...
37
38
39
40
41
42
  		//assign the given Euler rotation to this quaternion

  		w = (T)cos(theta/2);

  		x = u_hat[0]*(T)sin(theta/2);

  		y = u_hat[1]*(T)sin(theta/2);

  		z = u_hat[2]*(T)sin(theta/2);

  	}

57729e5b   David Mayerich   changed directory...
43
  

487a9b49   David Mayerich   added the ability...
44
  	CUDA_CALLABLE void CreateRotation(vec<T> from, vec<T> to){

8d4f0940   David Mayerich   ERROR in plane wa...
45
  

d609550e   David Mayerich   fixed bug in plan...
46
47
48
49
50
  		vec<T> r = from.cross(to);			//compute the rotation vector

  		T theta = asin(r.len());				//compute the angle of the rotation about r

  		//deal with a zero vector (both k and kn point in the same direction)

  		if(theta == (T)0)

  			return;

57729e5b   David Mayerich   changed directory...
51
  

d609550e   David Mayerich   fixed bug in plan...
52
53
54
  		//create a quaternion to capture the rotation

  		CreateRotation(theta, r.norm());

  	}

57729e5b   David Mayerich   changed directory...
55
56
  

  

57729e5b   David Mayerich   changed directory...
57
  

d609550e   David Mayerich   fixed bug in plan...
58
  	CUDA_CALLABLE quaternion<T> operator *(quaternion<T> &param){

57729e5b   David Mayerich   changed directory...
59
  

d609550e   David Mayerich   fixed bug in plan...
60
  		float A, B, C, D, E, F, G, H;

57729e5b   David Mayerich   changed directory...
61
  

57729e5b   David Mayerich   changed directory...
62
  

d609550e   David Mayerich   fixed bug in plan...
63
64
65
66
67
68
69
70
  		A = (w + x)*(param.w + param.x);

  		B = (z - y)*(param.y - param.z);

  		C = (w - x)*(param.y + param.z);

  		D = (y + z)*(param.w - param.x);

  		E = (x + z)*(param.x + param.y);

  		F = (x - z)*(param.x - param.y);

  		G = (w + y)*(param.w - param.z);

  		H = (w - y)*(param.w + param.z);

57729e5b   David Mayerich   changed directory...
71
  

d609550e   David Mayerich   fixed bug in plan...
72
73
74
75
76
  		quaternion<T> result;

  		result.w = B + (-E - F + G + H) /2;

  		result.x = A - (E + F + G + H)/2;

  		result.y = C + (E - F + G - H)/2;

  		result.z = D + (E - F - G + H)/2;

57729e5b   David Mayerich   changed directory...
77
  

d609550e   David Mayerich   fixed bug in plan...
78
79
80
81
  		return result;

  	}

  	

  	CUDA_CALLABLE matrix<T, 3> toMatrix3(){

57729e5b   David Mayerich   changed directory...
82
  

d609550e   David Mayerich   fixed bug in plan...
83
  		matrix<T, 3> result;

57729e5b   David Mayerich   changed directory...
84
  

57729e5b   David Mayerich   changed directory...
85
  

d609550e   David Mayerich   fixed bug in plan...
86
  	    T wx, wy, wz, xx, yy, yz, xy, xz, zz, x2, y2, z2;

57729e5b   David Mayerich   changed directory...
87
  

57729e5b   David Mayerich   changed directory...
88
  

d609550e   David Mayerich   fixed bug in plan...
89
90
91
92
93
94
  	    // calculate coefficients

  	    x2 = x + x; y2 = y + y;

  	    z2 = z + z;

  	    xx = x * x2; xy = x * y2; xz = x * z2;

  	    yy = y * y2; yz = y * z2; zz = z * z2;

  	    wx = w * x2; wy = w * y2; wz = w * z2;

57729e5b   David Mayerich   changed directory...
95
  

d609550e   David Mayerich   fixed bug in plan...
96
97
  		result(0, 0) = 1 - (yy + zz);

  		result(0, 1) = xy - wz;

57729e5b   David Mayerich   changed directory...
98
  

d609550e   David Mayerich   fixed bug in plan...
99
  		result(0, 2) = xz + wy;

57729e5b   David Mayerich   changed directory...
100
  

d609550e   David Mayerich   fixed bug in plan...
101
102
  		result(1, 0) = xy + wz;

  		result(1, 1) = 1 - (xx + zz);

57729e5b   David Mayerich   changed directory...
103
  

d609550e   David Mayerich   fixed bug in plan...
104
  		result(1, 2) = yz - wx;

57729e5b   David Mayerich   changed directory...
105
  

d609550e   David Mayerich   fixed bug in plan...
106
107
  		result(2, 0) = xz - wy;

  		result(2, 1) = yz + wx;

57729e5b   David Mayerich   changed directory...
108
  

d609550e   David Mayerich   fixed bug in plan...
109
  		result(2, 2) = 1 - (xx + yy);

57729e5b   David Mayerich   changed directory...
110
  

d609550e   David Mayerich   fixed bug in plan...
111
112
  		return result;

  	}

57729e5b   David Mayerich   changed directory...
113
  

d609550e   David Mayerich   fixed bug in plan...
114
  	CUDA_CALLABLE matrix<T, 4> toMatrix4(){

57729e5b   David Mayerich   changed directory...
115
  

d609550e   David Mayerich   fixed bug in plan...
116
117
  		matrix<T, 4> result;

  	    T wx, wy, wz, xx, yy, yz, xy, xz, zz, x2, y2, z2;

57729e5b   David Mayerich   changed directory...
118
  

d609550e   David Mayerich   fixed bug in plan...
119
120
121
122
123
124
  	    // calculate coefficients

  	    x2 = x + x; y2 = y + y;

  	    z2 = z + z;

  	    xx = x * x2; xy = x * y2; xz = x * z2;

  	    yy = y * y2; yz = y * z2; zz = z * z2;

  	    wx = w * x2; wy = w * y2; wz = w * z2;

57729e5b   David Mayerich   changed directory...
125
  

d609550e   David Mayerich   fixed bug in plan...
126
127
  		result(0, 0) = 1 - (yy + zz);

  		result(0, 1) = xy - wz;

57729e5b   David Mayerich   changed directory...
128
  

d609550e   David Mayerich   fixed bug in plan...
129
  		result(0, 2) = xz + wy;

57729e5b   David Mayerich   changed directory...
130
  

d609550e   David Mayerich   fixed bug in plan...
131
132
  		result(1, 0) = xy + wz;

  		result(1, 1) = 1 - (xx + zz);

57729e5b   David Mayerich   changed directory...
133
  

d609550e   David Mayerich   fixed bug in plan...
134
  		result(1, 2) = yz - wx;

57729e5b   David Mayerich   changed directory...
135
  

d609550e   David Mayerich   fixed bug in plan...
136
137
  		result(2, 0) = xz - wy;

  		result(2, 1) = yz + wx;

57729e5b   David Mayerich   changed directory...
138
  

d609550e   David Mayerich   fixed bug in plan...
139
  		result(2, 2) = 1 - (xx + yy);

57729e5b   David Mayerich   changed directory...
140
  

d609550e   David Mayerich   fixed bug in plan...
141
  		result(3, 3) = 1;

57729e5b   David Mayerich   changed directory...
142
  

d609550e   David Mayerich   fixed bug in plan...
143
144
145
146
147
148
149
150
151
152
153
154
155
  		return result;

  	}

  

  

  	CUDA_CALLABLE quaternion(){

  		w=0; x=0; y=0; z=0;

  	}

  

  	CUDA_CALLABLE quaternion(T c, T i, T j, T k){

  		w=c;  x=i;  y=j;  z=k;

  	}

  

  };

57729e5b   David Mayerich   changed directory...
156
157
158
  

  }	//end rts namespace

  

57729e5b   David Mayerich   changed directory...
159
160
  

  #endif