-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDamonsPoint.h
440 lines (379 loc) · 13 KB
/
DamonsPoint.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
#ifndef _DAMONS_POINT_H_
#define _DAMONS_POINT_H_
#include "DamonsObject.h"
#include "DamonsVector.h"
using namespace DMath;
namespace DGraphic {
///class DPoint
///@breif Point of 3 dimension with Type T
///
/// Point stores <b>3</b> elements of type <b>T</b> and provides a set
/// functions to perform operations on the set of elements.
///
/// @tparam T type of Point elements.
template< class T = double>
class DPoint: public DObject ,public DVector<T,3>
{
public:
/// @brief Create an uninitialized Point.
inline DPoint():DVector<T,3>(){}
/// @brief Create a Point from another Point copying each element.
///
/// @param p Point that the data will be copied from.
inline DPoint(const DPoint<T>& p):DVector<T,3>(p) {
}
/// @brief Create a vector from a single float.
///
/// Each elements is set to be equal to the value given.
/// @param s Scalar value that the vector will be initialized to.
explicit inline DPoint(const T& s) :DVector<T, 3>(s) {
}
/// @brief Create a point form the first 3 elements of an array.
///
/// @param a Array of values that the vector will be iniitlized to.
explicit inline DPoint(const T* a) :DVector<T, 3>(a) {
}
/// @brief Create a point from a vector of 3 dimension.
///
/// Each elements is set to be equal to the vector given.
/// @param v the vector will be copyed from.
explicit inline DPoint(const DVector<T, 3> &v) {
data_[0] = v[0];
data_[1] = v[1];
data_[2] = v[2];
}
/// @brief Create a point from another point of a different type.
///
/// This copies each element of a point which makes it possible to between
/// point of different types, for example
/// <code>float/double/int</code> vectors.
/// @param v point that the data will be copied from.
/// @tparam U type of point to copy.
template <typename U>
explicit inline DPoint(const DPoint<U>& v):DVector<T,3>(v) {
}
/// @brief Create a point from two values.
///
/// @note This method only works when the point is of dimension two.
///
/// @param s1 Scalar value for the first element of the point.
/// @param s2 Scalar value for the second element of the point.
inline DPoint(const T& s1, const T& s2):DVector<T,3>(s1,s2) {
}
/// @brief Create a point from three values.
///
/// @note This method only works when the point is of dimension three.
///
/// @param s1 Scalar value for the first element of the point.
/// @param s2 Scalar value for the second element of the point.
/// @param s3 Scalar value for the third element of the point.
inline DPoint(const T& s1, const T& s2, const T& s3):DVector<T, 3>(s1, s2,s3) {
}
/// @brief Create a point from three diffent type values.
///
/// @note This method only works when the point is of dimension three.
///
/// @param s1 of Type T1 Scalar value for the first element of the point.
/// @param s2 of Type T2 Scalar value for the second element of the point.
/// @param s3 of Type T3 Scalar value for the third element of the point.
template<typename T1, typename T2, typename T3>
inline DPoint(const T1& s1, const T2& s2, const T3& s3) :DVector<T, 3>(s1,s2,s3) {
}
/// @brief get the first value of point.
///
/// @return the first value of point.
inline const T& x() const {
return data_[0];
}
/// @brief get the second value of point.
///
/// @return the second value of point.
inline const T& y() const {
return data_[1];
}
/// @brief get the third value of point.
///
/// @return the third value of point.
inline const T& z() const{
return data_[2];
}
/// @brief get the first value of point.
///
/// @return A reference to the first data that can be modified by the caller.
inline T& x() {
return data_[0];
}
/// @brief get the second value of point.
///
/// @return A reference to the second data that can be modified by the caller..
inline T& y() {
return data_[1];
}
/// @brief get the third value of point.
///
/// @return A reference to the third data that can be modified by the caller.
inline T& z() {
return data_[2];
}
/// @brief Calculate the normalized version of this point.
///
/// @return The normalized point.
inline DPoint<T> Normalized() const {
DVector<T, 3> cv = NormalizedHelper(*this);
DPoint<T> p(cv);
return p;
}
/// @brief Calculate the dot product of two points,in-place.
///
/// @param v1 First point.
/// @return The dot product of this and v1.
inline T DotProduct(const DPoint<T>& v1) {
return DotProductHelper(*this, v1);
}
/// @brief Calculate the cross product of two points.
///
/// @param v second point.
/// @return The cross product of this and v.
inline DPoint<T> CrossProduct(const DPoint<T>& v) {
return DPoint<T>(data_[1] * v[2] - data_[2] * v[1],
data_[2] * v[0] - data_[0] * v[2],
data_[0] * v[1] - data_[1] * v[0]);
}
/// @brief Linearly interpolate two points.
///
/// @param v1 First point.
/// @param v2 Second point.
/// @param percent Percentage from v1 to v2 in range 0.0...1.0.
/// @return The interpolated point of v1 and v2.
static inline DPoint<T> Lerp(const DPoint<T>& v1,
const DPoint<T>& v2, const T percent) {
DVector<T, 3> cv = LerpHelper(v1, v2, percent);
DPoint<T> p(cv);
return p;
}
/// @brief Compare each component and returns max values.
///
/// @param v1 First point.
/// @param v2 Second point.
/// @return Max value of v1 and v2.
static inline DPoint<T> Max(const DPoint<T>& v1,
const DPoint<T>& v2) {
DVector<T, 3> cv = MaxHelper(v1, v2);
DPoint<T> p(cv);
return p;
}
/// @brief Compare each component and returns min values.
///
/// @param v1 First point.
/// @param v2 Second point.
/// @return min value of v1 and v2.
static inline DPoint<T> Min(const DPoint<T>& v1,
const DPoint<T>& v2) {
DVector<T, 3> cv = MinHelper(v1, v2);
DPoint<T> p(cv);
return p;
}
virtual ~DPoint() {}
protected:
};
/// @brief Negate all elements of the Point.
///
/// @return A new Point containing the result.
template <class T>
inline DPoint<T> operator-(const DPoint<T>& v) {
return DPoint<T>(-v[0],-v[1],-v[2]);
}
/// @brief Multiply a Point by a scalar.
///
/// Multiplies each component of the specified Point with a scalar.
///
/// @param s scalar to multiply.
/// @param v Point to multiply.
/// @return Point containing the result.
template <class T>
inline DPoint<T> operator*(const T& s, const DPoint<T>& v) {
return DPoint<T>(s*v[0], s*v[1], s*v[2]);
}
/// @brief Divide a Point by a scalar.
///
/// Divides each component of the specified Point by a scalar.
///
/// @param v Point to be divided.
/// @param s scalar to divide the vector by.
/// @return Point containing the result.
template <class T>
inline DPoint<T> operator/(const DPoint<T>& v, const T& s) {
return DPoint<T>(v[0]/s, v[1] / s, v[2] / s);
}
/// @brief Add a scalar to each element of a Point.
///
/// @param s scalar to add to each element of a Point.
/// @param v Vector to add the scalar to.
/// @return Point containing the result.
template <class T>
inline DPoint<T> operator+(const T& s, const DPoint<T>& v) {
return DPoint<T>(s+v[0], s+v[1], s+v[2]);
}
/// @brief Add a scalar to all elements of a Point.
///
/// @param v Point for the operation.
/// @param s A scalar to add to the Point.
/// @return A new vector containing the result.
template <class T>
inline DPoint<T> operator+(const DPoint<T>& v, const T& s) {
return DPoint<T>(s + v[0], s + v[1], s + v[2]);
}
/// @brief Subtract a scalar from each element of a Point.
///
/// @param s scalar to subtract from each element of a Point.
/// @param v Point to subtract the scalar from.
/// @return Point containing the result.
template <class T>
inline DPoint<T> operator-(const T& s, const DPoint<T>& v) {
return DPoint<T>(s - v[0], s - v[1], s - v[2]);
}
/// @brief Subtract a scalar from all elements of a Point.
///
/// @param v Point for the operation.
/// @param s A scalar to subtract from a Point.
/// @return A new Point that stores the result.
template <class T>
inline DPoint<T> operator-(const DPoint<T>& v, const T& s) {
return DPoint<T>( v[0] - s, v[1] - s, v[2] - s);
}
/// @brief Multiply a Point by another Vector.
///
/// In line with GLSL, this performs component-wise multiplication.
/// @param lhs First Point to use as a starting point.
/// @param rhs Second Point to multiply by.
/// @return A new Point containing the result.
template <class T>
inline DPoint<T> operator*(const DPoint<T>& lhs,const DPoint<T>& rhs) {
return DPoint<T>(lhs[0] * rhs[0], lhs[1] * rhs[1], lhs[2] * rhs[2]);
}
/// @brief Divide a Point by another Point.
///
/// In line with GLSL, this performs component-wise division.
/// @param lhs First Point to use as a starting point.
/// @param rhs Second Point to divide by.
/// @return A new Point containing the result.
template <class T>
inline DPoint<T> operator/(const DPoint<T>& lhs,const DPoint<T>& rhs) {
return DPoint<T>(lhs[0] / rhs[0], lhs[1] / rhs[1], lhs[2] / rhs[2]);
}
/// @brief Add a Point with another Point.
///
/// @param lhs First Point to use as a starting point.
/// @param rhs Second Point to add by.
/// @return A new Point containing the result.
template <class T>
inline DPoint<T> operator+(const DPoint<T>& lhs,const DPoint<T>& rhs) {
return DPoint<T>(lhs[0] + rhs[0], lhs[1] + rhs[1], lhs[2] + rhs[2]);
}
/// @brief subtract a Point with another Point.
///
/// @param lhs First Point to use as a starting point.
/// @param rhs Second Point to subtract by.
/// @return A new Point containing the result.
template <class T>
inline DPoint<T> operator-(const DPoint<T> & lhs,const DPoint<T> & rhs) {
return DPoint<T>(lhs[0] - rhs[0], lhs[1] - rhs[1], lhs[2] - rhs[2]);
}
/// @brief Multiply a Point with a scalar.
///
/// @param v Point for the operation.
/// @param s A scalar to multiply the Point with.
/// @return A new Point containing the result.
template <class T>
inline DPoint<T> operator*(const DPoint<T>& v, const T& s) {
return DPoint<T>(v[0]*s, v[1] * s, v[2] * s);
}
/// @brief Add (in-place) a Point with another Point.
///
/// @param lhs First Point to use as a starting point.
/// @param rhs Second Point to add.
/// @return A reference to the input <b>v</b> Point.
template <class T>
inline DPoint<T>& operator+=(DPoint<T>& lhs, const DPoint<T>& rhs) {
int d = 3;
DAMONSMATH_VECTOR_OPERATION(lhs.data_[i] += rhs[i]);
return lhs;
}
/// @brief Subtract (in-place) another Point from a Point.
///
/// @param lhs First Point to use as a starting point.
/// @param rhs Second Point to subtract by.
/// @return A reference to the input <b>v</b> vector.
template <class T>
inline DPoint<T>& operator-=(DPoint<T>& lhs, const DPoint<T>& rhs) {
int d = 3;
DAMONSMATH_VECTOR_OPERATION(lhs.data_[i] -= rhs[i]);
return lhs;
}
/// @brief Multiply (in-place) each element of a Point with a scalar.
///
/// @param v Point for the operation.
/// @param s A scalar to multiply the Point with.
/// @return A reference to the input <b>v</b> Point.
template <class T>
inline DPoint<T>& operator*=(DPoint<T>& v, const T& s) {
int d = 3;
DAMONSMATH_VECTOR_OPERATION(v.data_[i] *= s);
return v;
}
/// @brief Divide (in-place) each element of a Point by a scalar.
///
/// @param v Point for the operation.
/// @param s A scalar to divide the Point by.
/// @return A reference to the input <b>v</b> Point.
template <class T>
inline DPoint<T>& operator/=(DPoint<T>& v, const T& s) {
int d = 3;
DAMONSMATH_VECTOR_OPERATION(v.data_[i] /= s);
return v;
}
/// @brief Add (in-place) a scalar to each element of a Point.
///
/// @param v Point for the operation.
/// @param s A scalar to add the vector to.
/// @return A reference to the input <b>v</b> vector.
template <class T>
inline DPoint<T>& operator+=(DPoint<T>& v, const T& s) {
int d = 3;
DAMONSMATH_VECTOR_OPERATION(v.data_[i] += s);
return v;
}
/// @brief Subtract (in-place) a scalar from each element of a Point.
///
/// @param v Point for the operation.
/// @param s A scalar to subtract from the Point.
/// @return A reference to the input <b>v</b> Point.
template <class T>
inline DPoint<T>& operator-=(DPoint<T>& v, const T& s) {
int d = 3;
DAMONSMATH_VECTOR_OPERATION(v.data_[i] -= s);
return v;
}
/// @brief Compare 2 Vectors of the same size for equality.
///
/// Instead consider comparing the difference between two float vectors using
/// LengthSquared() with an epsilon value.
/// For example, v1.LengthSquared(v2) < epsilon.
///
/// @return true if the 2 vectors contains the same value, false otherwise.
template <class T>
inline bool operator == (const DPoint<T>& lhs, const DPoint<T>& rhs) {
T l = (lhs - rhs).LengthSquared();
if (l < (DEplision*DEplision))
return true;
return false;
}
/// @brief Compare 2 Vectors of the same size for inequality.
///
/// @return true if the elements of two vectors differ, false otherwise.
template <class T>
inline bool operator!=(const DPoint<T>& lhs, const DPoint<T>& rhs) {
return !(lhs == rhs);
}
};
#endif // !_DAMONS_POINT_H_