57729e5b
David Mayerich
changed directory...
|
1
2
3
4
5
6
|
#ifndef RTS_VECTOR_H
#define RTS_VECTOR_H
#include <iostream>
#include <cmath>
#include <sstream>
|
a9275be5
David Mayerich
added vector fiel...
|
7
|
//#include "rts/math/point.h"
|
57729e5b
David Mayerich
changed directory...
|
8
9
|
#include "rts/cuda/callable.h"
|
a9275be5
David Mayerich
added vector fiel...
|
10
|
|
57729e5b
David Mayerich
changed directory...
|
11
12
13
14
15
|
namespace rts
{
|
a9275be5
David Mayerich
added vector fiel...
|
16
17
|
template <class T, int N=3>
struct vec
|
57729e5b
David Mayerich
changed directory...
|
18
19
20
|
{
T v[N];
|
a9275be5
David Mayerich
added vector fiel...
|
21
|
CUDA_CALLABLE vec()
|
57729e5b
David Mayerich
changed directory...
|
22
23
24
25
26
27
28
|
{
//memset(v, 0, sizeof(T) * N);
for(int i=0; i<N; i++)
v[i] = 0;
}
//efficiency constructor, makes construction easier for 1D-4D vectors
|
559d0fcb
David Mayerich
wave interactions...
|
29
|
CUDA_CALLABLE vec(T rhs)
|
a9275be5
David Mayerich
added vector fiel...
|
30
|
{
|
559d0fcb
David Mayerich
wave interactions...
|
31
32
|
for(int i=0; i<N; i++)
v[i] = rhs;
|
a9275be5
David Mayerich
added vector fiel...
|
33
34
35
36
37
38
39
|
}
CUDA_CALLABLE vec(T x, T y)
{
v[0] = x;
v[1] = y;
}
CUDA_CALLABLE vec(T x, T y, T z)
|
57729e5b
David Mayerich
changed directory...
|
40
|
{
|
a9275be5
David Mayerich
added vector fiel...
|
41
42
43
44
45
46
47
48
49
50
|
v[0] = x;
v[1] = y;
v[2] = z;
}
CUDA_CALLABLE vec(T x, T y, T z, T w)
{
v[0] = x;
v[1] = y;
v[2] = z;
v[3] = w;
|
57729e5b
David Mayerich
changed directory...
|
51
52
|
}
|
559d0fcb
David Mayerich
wave interactions...
|
53
54
55
56
|
//copy constructor
CUDA_CALLABLE vec( const vec<T, N>& other){
for(int i=0; i<N; i++)
v[i] = other.v[i];
|
57729e5b
David Mayerich
changed directory...
|
57
58
|
}
|
ecfd14df
David Mayerich
implemented D fie...
|
59
60
61
62
63
64
65
66
67
68
69
70
71
|
template< typename U >
CUDA_CALLABLE operator vec<U, N>(){
vec<U, N> result;
for(int i=0; i<N; i++)
result.v[i] = v[i];
return result;
}
//template<class U>
//friend vec<U, N>::operator vec<T, N>();
|
8d4f0940
David Mayerich
ERROR in plane wa...
|
72
|
CUDA_CALLABLE T len() const
|
57729e5b
David Mayerich
changed directory...
|
73
74
75
76
77
78
79
|
{
//compute and return the vector length
T sum_sq = (T)0;
for(int i=0; i<N; i++)
{
sum_sq += v[i] * v[i];
}
|
ecfd14df
David Mayerich
implemented D fie...
|
80
|
return sqrt(sum_sq);
|
57729e5b
David Mayerich
changed directory...
|
81
82
83
|
}
|
8d4f0940
David Mayerich
ERROR in plane wa...
|
84
|
CUDA_CALLABLE vec<T, N> cart2sph() const
|
57729e5b
David Mayerich
changed directory...
|
85
86
87
88
|
{
//convert the vector from cartesian to spherical coordinates
//x, y, z -> r, theta, phi (where theta = 0 to 2*pi)
|
a9275be5
David Mayerich
added vector fiel...
|
89
|
vec<T, N> sph;
|
57729e5b
David Mayerich
changed directory...
|
90
91
92
93
94
95
96
|
sph[0] = std::sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);
sph[1] = std::atan2(v[1], v[0]);
sph[2] = std::acos(v[2] / sph[0]);
return sph;
}
|
8d4f0940
David Mayerich
ERROR in plane wa...
|
97
|
CUDA_CALLABLE vec<T, N> sph2cart() const
|
57729e5b
David Mayerich
changed directory...
|
98
99
100
101
|
{
//convert the vector from cartesian to spherical coordinates
//r, theta, phi -> x, y, z (where theta = 0 to 2*pi)
|
a9275be5
David Mayerich
added vector fiel...
|
102
|
vec<T, N> cart;
|
57729e5b
David Mayerich
changed directory...
|
103
104
105
106
107
108
109
|
cart[0] = v[0] * std::cos(v[1]) * std::sin(v[2]);
cart[1] = v[0] * std::sin(v[1]) * std::sin(v[2]);
cart[2] = v[0] * std::cos(v[2]);
return cart;
}
|
8d4f0940
David Mayerich
ERROR in plane wa...
|
110
|
CUDA_CALLABLE vec<T, N> norm() const
|
57729e5b
David Mayerich
changed directory...
|
111
112
|
{
//compute and return the vector norm
|
a9275be5
David Mayerich
added vector fiel...
|
113
|
vec<T, N> result;
|
57729e5b
David Mayerich
changed directory...
|
114
115
116
117
118
119
120
121
122
123
124
125
126
|
//compute the vector length
T l = len();
//normalize
for(int i=0; i<N; i++)
{
result.v[i] = v[i] / l;
}
return result;
}
|
8d4f0940
David Mayerich
ERROR in plane wa...
|
127
|
CUDA_CALLABLE vec<T, 3> cross(const vec<T, 3> rhs) const
|
57729e5b
David Mayerich
changed directory...
|
128
|
{
|
a9275be5
David Mayerich
added vector fiel...
|
129
|
vec<T, 3> result;
|
57729e5b
David Mayerich
changed directory...
|
130
131
|
//compute the cross product (only valid for 3D vectors)
|
8d4f0940
David Mayerich
ERROR in plane wa...
|
132
133
134
|
result[0] = v[1] * rhs.v[2] - v[2] * rhs.v[1];
result[1] = v[2] * rhs.v[0] - v[0] * rhs.v[2];
result[2] = v[0] * rhs.v[1] - v[1] * rhs.v[0];
|
57729e5b
David Mayerich
changed directory...
|
135
136
137
138
|
return result;
}
|
8d4f0940
David Mayerich
ERROR in plane wa...
|
139
|
CUDA_CALLABLE T dot(vec<T, N> rhs) const
|
57729e5b
David Mayerich
changed directory...
|
140
141
142
143
144
145
146
147
148
149
150
|
{
T result = (T)0;
for(int i=0; i<N; i++)
result += v[i] * rhs.v[i];
return result;
}
//arithmetic
|
8d4f0940
David Mayerich
ERROR in plane wa...
|
151
|
CUDA_CALLABLE vec<T, N> operator+(vec<T, N> rhs) const
|
57729e5b
David Mayerich
changed directory...
|
152
|
{
|
559d0fcb
David Mayerich
wave interactions...
|
153
|
vec<T, N> result;
|
57729e5b
David Mayerich
changed directory...
|
154
|
|
559d0fcb
David Mayerich
wave interactions...
|
155
156
|
for(int i=0; i<N; i++)
result.v[i] = v[i] + rhs.v[i];
|
57729e5b
David Mayerich
changed directory...
|
157
|
|
559d0fcb
David Mayerich
wave interactions...
|
158
159
160
161
162
163
164
165
166
167
|
return result;
}
CUDA_CALLABLE vec<T, N> operator+(T rhs) const
{
vec<T, N> result;
for(int i=0; i<N; i++)
result.v[i] = v[i] + rhs;
return result;
|
57729e5b
David Mayerich
changed directory...
|
168
|
}
|
8d4f0940
David Mayerich
ERROR in plane wa...
|
169
|
CUDA_CALLABLE vec<T, N> operator-(vec<T, N> rhs) const
|
57729e5b
David Mayerich
changed directory...
|
170
|
{
|
a9275be5
David Mayerich
added vector fiel...
|
171
|
vec<T, N> result;
|
57729e5b
David Mayerich
changed directory...
|
172
173
174
175
176
177
|
for(int i=0; i<N; i++)
result.v[i] = v[i] - rhs.v[i];
return result;
}
|
8d4f0940
David Mayerich
ERROR in plane wa...
|
178
|
CUDA_CALLABLE vec<T, N> operator*(T rhs) const
|
57729e5b
David Mayerich
changed directory...
|
179
|
{
|
a9275be5
David Mayerich
added vector fiel...
|
180
|
vec<T, N> result;
|
57729e5b
David Mayerich
changed directory...
|
181
182
183
184
185
186
|
for(int i=0; i<N; i++)
result.v[i] = v[i] * rhs;
return result;
}
|
8d4f0940
David Mayerich
ERROR in plane wa...
|
187
|
CUDA_CALLABLE vec<T, N> operator/(T rhs) const
|
57729e5b
David Mayerich
changed directory...
|
188
|
{
|
a9275be5
David Mayerich
added vector fiel...
|
189
|
vec<T, N> result;
|
57729e5b
David Mayerich
changed directory...
|
190
191
192
193
194
195
|
for(int i=0; i<N; i++)
result.v[i] = v[i] / rhs;
return result;
}
|
d609550e
David Mayerich
fixed bug in plan...
|
196
197
198
199
200
|
CUDA_CALLABLE vec<T, N> operator*=(T rhs){
for(int i=0; i<N; i++)
v[i] = v[i] * rhs;
return *this;
}
|
559d0fcb
David Mayerich
wave interactions...
|
201
202
203
204
205
|
CUDA_CALLABLE vec<T, N> & operator=(T rhs){
for(int i=0; i<N; i++)
v[i] = rhs;
return *this;
}
|
ecfd14df
David Mayerich
implemented D fie...
|
206
207
208
209
210
211
212
|
template<typename Y>
CUDA_CALLABLE vec<T, N> & operator=(vec<Y, N> rhs){
for(int i=0; i<N; i++)
v[i] = rhs.v[i];
return *this;
}
|
559d0fcb
David Mayerich
wave interactions...
|
213
214
215
|
//unary minus
CUDA_CALLABLE vec<T, N> operator-() const{
vec<T, N> r;
|
57729e5b
David Mayerich
changed directory...
|
216
|
|
559d0fcb
David Mayerich
wave interactions...
|
217
218
219
|
//negate the vector
for(int i=0; i<N; i++)
r.v[i] = -v[i];
|
a9275be5
David Mayerich
added vector fiel...
|
220
|
|
559d0fcb
David Mayerich
wave interactions...
|
221
222
|
return r;
}
|
a9275be5
David Mayerich
added vector fiel...
|
223
|
|
8d4f0940
David Mayerich
ERROR in plane wa...
|
224
|
CUDA_CALLABLE bool operator==(vec<T, N> rhs) const
|
57729e5b
David Mayerich
changed directory...
|
225
226
227
228
229
230
231
|
{
if ( (rhs.v[0] == v[0]) && (rhs.v[1] == v[1]) && (rhs.v[2] == v[2]) )
return true;
return false;
}
|
ecfd14df
David Mayerich
implemented D fie...
|
232
|
std::string str() const
|
57729e5b
David Mayerich
changed directory...
|
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
|
{
std::stringstream ss;
ss<<"[";
for(int i=0; i<N; i++)
{
ss<<v[i];
if(i != N-1)
ss<<", ";
}
ss<<"]";
return ss.str();
}
|
8d4f0940
David Mayerich
ERROR in plane wa...
|
248
249
|
//bracket operator - allows assignment to the vector
CUDA_CALLABLE T& operator[](const unsigned int i)
|
57729e5b
David Mayerich
changed directory...
|
250
251
252
253
254
255
256
257
258
259
|
{
return v[i];
}
};
} //end namespace rts
template <typename T, int N>
|
a9275be5
David Mayerich
added vector fiel...
|
260
|
std::ostream& operator<<(std::ostream& os, rts::vec<T, N> v)
|
57729e5b
David Mayerich
changed directory...
|
261
|
{
|
ecfd14df
David Mayerich
implemented D fie...
|
262
|
os<<v.str();
|
57729e5b
David Mayerich
changed directory...
|
263
264
265
|
return os;
}
|
57729e5b
David Mayerich
changed directory...
|
266
|
|
57729e5b
David Mayerich
changed directory...
|
267
268
|
template <typename T, int N>
|
a9275be5
David Mayerich
added vector fiel...
|
269
|
CUDA_CALLABLE rts::vec<T, N> operator*(T lhs, rts::vec<T, N> rhs)
|
57729e5b
David Mayerich
changed directory...
|
270
|
{
|
a9275be5
David Mayerich
added vector fiel...
|
271
|
rts::vec<T, N> r;
|
57729e5b
David Mayerich
changed directory...
|
272
273
274
275
276
277
278
279
280
|
return rhs * lhs;
}
//#if __GNUC__ > 3 && __GNUC_MINOR__ > 7
//template<class T, int N> using rtsVector = rts::vector<T, N>;
//#endif
#endif
|