xmscore  1.0
pt.cpp
Go to the documentation of this file.
1 //------------------------------------------------------------------------------
6 //------------------------------------------------------------------------------
7 
8 //----- Included files ---------------------------------------------------------
9 
10 #include <xmscore/points/pt.h>
11 
12 //----- Function definitions ---------------------------------------------------
13 
14 #if CXX_TEST
15 // TESTS
18 
19 #include <xmscore/points/pt.t.h>
20 #include <cfloat>
21 #include <xmscore/stl/vector.h>
23 
24 //------------------------------------------------------------------------------
26 //------------------------------------------------------------------------------
28 {
29  // TS_FAIL("MptUnitTester::testPoints");
30 
31  // Test constructors
32  {
33  xms::Pt3d pt;
34  TS_ASSERT_DELTA(pt.x, 0, DBL_EPSILON);
35  TS_ASSERT_DELTA(pt.y, 0, DBL_EPSILON);
36  TS_ASSERT_DELTA(pt.z, 0, DBL_EPSILON);
37  }
38  {
39  xms::Pt3d pt(1, 2, 3);
40  TS_ASSERT_DELTA(pt.x, 1, DBL_EPSILON);
41  TS_ASSERT_DELTA(pt.y, 2, DBL_EPSILON);
42  TS_ASSERT_DELTA(pt.z, 3, DBL_EPSILON);
43  }
44  {
45  xms::Pt3d pt(4);
46  TS_ASSERT_DELTA(pt.x, 4, DBL_EPSILON);
47  TS_ASSERT_DELTA(pt.y, 4, DBL_EPSILON);
48  TS_ASSERT_DELTA(pt.z, 4, DBL_EPSILON);
49  }
50  {
51  xms::Pt2d pt2d(1, 2);
52  xms::Pt3d pt(pt2d);
53  TS_ASSERT_DELTA(pt.x, 1, DBL_EPSILON);
54  TS_ASSERT_DELTA(pt.y, 2, DBL_EPSILON);
55  TS_ASSERT_DELTA(pt.z, 0, DBL_EPSILON);
56  }
57  {
58  xms::Pt3d pt3d(1, 2, 3);
59  xms::Pt3d pt(pt3d);
60  TS_ASSERT_DELTA(pt.x, 1, DBL_EPSILON);
61  TS_ASSERT_DELTA(pt.y, 2, DBL_EPSILON);
62  TS_ASSERT_DELTA(pt.z, 3, DBL_EPSILON);
63  }
64  {
65  xms::Pt4d pt4d(1, 2, 3, 4);
66  xms::Pt3d pt(pt4d);
67  TS_ASSERT_DELTA(pt.x, 1, DBL_EPSILON);
68  TS_ASSERT_DELTA(pt.y, 2, DBL_EPSILON);
69  TS_ASSERT_DELTA(pt.z, 3, DBL_EPSILON);
70  }
71 
72  // Test operator=
73  {
74  xms::Pt3d pt;
75  pt = 2;
76  TS_ASSERT_DELTA_PT3D(pt, xms::Pt3d(2), DBL_EPSILON);
77  }
78  {
79  xms::Pt2d pt;
80  pt = 2;
81  TS_ASSERT_DELTA_PT2D(pt, xms::Pt2d(2), DBL_EPSILON);
82  }
83 
84  {
85  xms::Pt2d pt1(1, 2);
86  xms::Pt3d pt2;
87  pt2 = pt1;
88  TS_ASSERT_DELTA(pt2.x, 1, DBL_EPSILON);
89  TS_ASSERT_DELTA(pt2.y, 2, DBL_EPSILON);
90  }
91  {
92  xms::Pt3d pt1(1, 2, 3);
93  xms::Pt3d pt2;
94  pt2 = pt1;
95  TS_ASSERT_DELTA_PT3D(pt2, xms::Pt3d(1, 2, 3), DBL_EPSILON);
96  }
97  {
98  xms::Pt4d pt1(1, 2, 3, 4);
99  xms::Pt3d pt2;
100  pt2 = pt1;
101  TS_ASSERT_DELTA_PT3D(pt2, xms::Pt3d(1, 2, 3), DBL_EPSILON);
102  }
103 
104  // Test operator==
105  {
106  xms::Pt3d pt(4);
107  TS_ASSERT(pt == 4);
108  }
109  {
110  xms::Pt2d pt1(4);
111  xms::Pt3d pt2(4);
112  TS_ASSERT(pt1 == pt2);
113  }
114  {
115  xms::Pt3d pt1(4);
116  xms::Pt3d pt2(4);
117  TS_ASSERT(pt1 == pt2);
118  }
119  {
120  xms::Pt4d pt1(4);
121  xms::Pt3d pt2(4);
122  TS_ASSERT(pt1 == pt2);
123  }
124 
125  // Test operator!=
126  {
127  xms::Pt3d pt(4);
128  TS_ASSERT(pt != 3);
129  }
130  {
131  xms::Pt2d pt1(3);
132  xms::Pt3d pt2(4);
133  TS_ASSERT(pt1 != pt2);
134  }
135  {
136  xms::Pt3d pt1(3);
137  xms::Pt3d pt2(4);
138  TS_ASSERT(pt1 != pt2);
139  }
140  {
141  xms::Pt4d pt1(3);
142  xms::Pt3d pt2(4);
143  TS_ASSERT(pt1 != pt2);
144  }
145 
146  // Test operator<
147  {
148  xms::Pt3d pt(1, 2, 3);
149  TS_ASSERT(pt < 2);
150  }
151  {
152  xms::Pt3d pt(1, 2, 3);
153  TS_ASSERT(pt < xms::Pt2d(2));
154  }
155  {
156  xms::Pt3d pt(1, 2, 3);
157  TS_ASSERT_EQUALS(pt < xms::Pt3d(1, 2, 3), false);
158  }
159  {
160  xms::Pt3d pt(1, 1, 3);
161  TS_ASSERT_EQUALS(pt < xms::Pt4d(1, 2, 3, 4), true);
162  }
163 
164  // Test operator+
165  {
166  xms::Pt3d pt(1, 2, 3);
167  TS_ASSERT_DELTA_PT3D(pt + 1, xms::Pt3d(2, 3, 4), DBL_EPSILON);
168  }
169  {
170  xms::Pt2d pt1(1, 2);
171  xms::Pt3d pt2(1, 2, 3);
172  TS_ASSERT_DELTA_PT3D(pt2 + pt1, xms::Pt3d(2, 4, 3), DBL_EPSILON);
173  }
174  {
175  xms::Pt3d pt1(1, 2, 3);
176  xms::Pt3d pt2(1, 2, 3);
177  TS_ASSERT_DELTA_PT3D(pt2 + pt1, xms::Pt3d(2, 4, 6), DBL_EPSILON);
178  }
179  {
180  xms::Pt4d pt1(1, 2, 3, 4);
181  xms::Pt3d pt2(1, 2, 3);
182  TS_ASSERT_DELTA_PT3D(pt2 + pt1, xms::Pt3d(2, 4, 6), DBL_EPSILON);
183  }
184 
185  // Test operator-
186  {
187  xms::Pt3d pt(1, 2, 3);
188  TS_ASSERT_DELTA_PT3D(pt - 1, xms::Pt3d(0, 1, 2), DBL_EPSILON);
189  }
190  {
191  xms::Pt2d pt1(1, 2);
192  xms::Pt3d pt2(1, 2, 3);
193  TS_ASSERT_DELTA_PT3D(pt2 - pt1, xms::Pt3d(0, 0, 3), DBL_EPSILON);
194  }
195  {
196  xms::Pt3d pt1(1, 2, 3);
197  xms::Pt3d pt2(1, 2, 3);
198  TS_ASSERT_DELTA_PT3D(pt2 - pt1, xms::Pt3d(0, 0, 0), DBL_EPSILON);
199  }
200  {
201  xms::Pt4d pt1(1, 2, 3, 4);
202  xms::Pt3d pt2(1, 2, 3);
203  TS_ASSERT_DELTA_PT3D(pt2 - pt1, xms::Pt3d(0, 0, 0), DBL_EPSILON);
204  }
205 
206  // Test unary operator-
207  {
208  xms::Pt2i pt1(1, -2);
209  xms::Pt2i pt2;
210  pt2 = -pt1;
211  TS_ASSERT_EQUALS(pt2, xms::Pt2i(-1, 2));
212  }
213  {
214  xms::Pt3d pt1(1, -2, 3);
215  xms::Pt3d pt2;
216  pt2 = -pt1;
217  TS_ASSERT_DELTA_PT3D(pt2, xms::Pt3d(-1, 2, -3), DBL_EPSILON);
218  }
219  {
220  xms::Pt4f pt1(1, -2, 3, -4);
221  xms::Pt4f pt2;
222  pt2 = -pt1;
223  TS_ASSERT_EQUALS(pt2, xms::Pt4f(-1, 2, -3, 4));
224  }
225 
226  // Test operator*
227  {
228  xms::Pt3d pt(1, 2, 3);
229  TS_ASSERT_DELTA_PT3D(pt * 2, xms::Pt3d(2, 4, 6), DBL_EPSILON);
230  }
231  {
232  xms::Pt2d pt1(1, 2);
233  xms::Pt3d pt2(1, 2, 3);
234  TS_ASSERT_DELTA_PT3D(pt2 * pt1, xms::Pt3d(1, 4, 3), DBL_EPSILON);
235  }
236  {
237  xms::Pt3d pt1(1, 2, 3);
238  xms::Pt3d pt2(1, 2, 3);
239  TS_ASSERT_DELTA_PT3D(pt2 * pt1, xms::Pt3d(1, 4, 9), DBL_EPSILON);
240  }
241  {
242  xms::Pt4d pt1(1, 2, 3, 4);
243  xms::Pt3d pt2(1, 2, 3);
244  TS_ASSERT_DELTA_PT3D(pt2 * pt1, xms::Pt3d(1, 4, 9), DBL_EPSILON);
245  }
246 
247  // Test operator/
248  {
249  xms::Pt3d pt(2, 4, 6);
250  TS_ASSERT_DELTA_PT3D(pt / 2, xms::Pt3d(1, 2, 3), DBL_EPSILON);
251  }
252  {
253  xms::Pt2d pt1(1, 2);
254  xms::Pt3d pt2(1, 2, 3);
255  TS_ASSERT_DELTA_PT3D(pt2 / pt1, xms::Pt3d(1, 1, 3), DBL_EPSILON);
256  }
257  {
258  xms::Pt3d pt1(1, 2, 3);
259  xms::Pt3d pt2(1, 2, 3);
260  TS_ASSERT_DELTA_PT3D(pt2 / pt1, xms::Pt3d(1, 1, 1), DBL_EPSILON);
261  }
262  {
263  xms::Pt4d pt1(1, 2, 3, 4);
264  xms::Pt3d pt2(1, 2, 3);
265  TS_ASSERT_DELTA_PT3D(pt2 / pt1, xms::Pt3d(1, 1, 1), DBL_EPSILON);
266  }
267 
268  // Test Set
269  {
270  xms::Pt3d pt;
271  pt.Set(0, 1, 2);
272  TS_ASSERT_DELTA(pt.x, 0, DBL_EPSILON);
273  TS_ASSERT_DELTA(pt.y, 1, DBL_EPSILON);
274  TS_ASSERT_DELTA(pt.z, 2, DBL_EPSILON);
275  }
276 
277  // Test const operator[]
278  {
279  xms::Pt3d pt(1, 2, 3);
280  TS_ASSERT_DELTA(pt[0], 1, DBL_EPSILON);
281  TS_ASSERT_DELTA(pt[1], 2, DBL_EPSILON);
282  TS_ASSERT_DELTA(pt[2], 3, DBL_EPSILON);
283  }
284 
285  // Test operator[]
286  {
287  xms::Pt3d pt(1, 2, 3);
288  pt[0] = 3;
289  pt[1] = 2;
290  pt[2] = 1;
291  TS_ASSERT_DELTA(pt[0], 3, DBL_EPSILON);
292  TS_ASSERT_DELTA(pt[1], 2, DBL_EPSILON);
293  TS_ASSERT_DELTA(pt[2], 1, DBL_EPSILON);
294  }
295 
296  // Test at
297  {
298  xms::Pt3d pt(1, 2, 3);
299  TS_ASSERT_DELTA(pt.at(0), 1, DBL_EPSILON);
300  TS_ASSERT_DELTA(pt.at(1), 2, DBL_EPSILON);
301  TS_ASSERT_DELTA(pt.at(2), 3, DBL_EPSILON);
302  }
303 
304  // Test that TS_ASSERT_DELTA_VECPT3D works with mismatching 3D point types
305  {
306  using namespace xms;
307  VecPt4d expected = {Pt4d(1.0), Pt4d(2.0), Pt4d(3.0)};
308  VecPt3f actual = {Pt3f(1.001f), Pt3f(2.001f), Pt3f(3.001f)};
309  TS_ASSERT_DELTA_VECPT3D(expected, actual, 0.01);
310  }
311 
312  // Test that TS_ASSERT_DELTA_VECPT2D works with mismatching point types
313  {
314  using namespace xms;
315  VecPt3d expected = {Pt3d(1.0), Pt3d(2.0), Pt3d(3.0)};
316  VecPt2f actual = {Pt2f(1.001f), Pt2f(2.001f), Pt2f(3.001f)};
317  TS_ASSERT_DELTA_VECPT2D(expected, actual, 0.01);
318  }
319  // TS_ASSERT_THROWS(pt.at(3), std::out_of_range&);
320 
321 } // PtUnitTests::testIt
322 //------------------------------------------------------------------------------
324 //------------------------------------------------------------------------------
326 {
327  using namespace xms;
328 
329  // TS_FAIL("PtUnitTests::testStreams");
330 
331  // operator<<
332 
333  // Pt2<>
334  {
335  std::stringstream sstrm;
336  Pt2i pt(1, 2);
337  sstrm << pt;
338  TS_ASSERT_EQUALS(sstrm.str(), "1,2");
339  }
340  {
341  std::stringstream sstrm;
342  Pt2f pt(1.5, 2.5);
343  sstrm << pt;
344  TS_ASSERT_EQUALS(sstrm.str(), "1.5,2.5");
345  }
346  {
347  std::stringstream sstrm;
348  Pt2d pt(1.5, 2.5);
349  sstrm << pt;
350  TS_ASSERT_EQUALS(sstrm.str(), "1.5,2.5");
351  }
352  {
353  std::stringstream sstrm;
354  Pt2<char> pt('1', '2');
355  sstrm << pt;
356  TS_ASSERT_EQUALS(sstrm.str(), "1,2");
357  }
358 
359  // Pt3<>
360  {
361  std::stringstream sstrm;
362  Pt3i pt(1, 2, 3);
363  sstrm << pt;
364  TS_ASSERT_EQUALS(sstrm.str(), "1,2,3");
365  }
366  {
367  std::stringstream sstrm;
368  Pt3f pt(1.5, 2.5, 3.5);
369  sstrm << pt;
370  TS_ASSERT_EQUALS(sstrm.str(), "1.5,2.5,3.5");
371  }
372  {
373  std::stringstream sstrm;
374  Pt3d pt(1.5, 2.5, 3.5);
375  sstrm << pt;
376  TS_ASSERT_EQUALS(sstrm.str(), "1.5,2.5,3.5");
377  }
378  {
379  std::stringstream sstrm;
380  Pt3<char> pt('1', '2', '3');
381  sstrm << pt;
382  TS_ASSERT_EQUALS(sstrm.str(), "1,2,3");
383  }
384 
385  // Pt4<>
386  {
387  std::stringstream sstrm;
388  Pt4i pt(1, 2, 3, 4);
389  sstrm << pt;
390  TS_ASSERT_EQUALS(sstrm.str(), "1,2,3,4");
391  }
392  {
393  std::stringstream sstrm;
394  Pt4f pt(1.5, 2.5, 3.5, 4.5);
395  sstrm << pt;
396  TS_ASSERT_EQUALS(sstrm.str(), "1.5,2.5,3.5,4.5");
397  }
398  {
399  std::stringstream sstrm;
400  Pt4d pt(1.5, 2.5, 3.5, 4.5);
401  sstrm << pt;
402  TS_ASSERT_EQUALS(sstrm.str(), "1.5,2.5,3.5,4.5");
403  }
404  {
405  std::stringstream sstrm;
406  Pt4<char> pt('1', '2', '3', '4');
407  sstrm << pt;
408  TS_ASSERT_EQUALS(sstrm.str(), "1,2,3,4");
409  }
410 
411  // operator>>
412 
413  // Pt2<>
414  {
415  std::stringstream sstrm;
416  sstrm << "1,2";
417  Pt2i pt;
418  sstrm >> pt;
419  TS_ASSERT_EQUALS(pt, Pt2i(1, 2));
420  }
421  {
422  std::stringstream sstrm;
423  sstrm << "1.5,2.5";
424  Pt2f pt;
425  sstrm >> pt;
426  TS_ASSERT_EQUALS(pt, Pt2f(1.5, 2.5));
427  }
428  {
429  std::stringstream sstrm;
430  sstrm << "1.5,2.5";
431  Pt2d pt;
432  sstrm >> pt;
433  TS_ASSERT_EQUALS(pt, Pt2d(1.5, 2.5));
434  }
435  {
436  std::stringstream sstrm;
437  sstrm << "1,2";
438  Pt2<char> pt;
439  sstrm >> pt;
440  TS_ASSERT_EQUALS(pt, Pt2<char>('1', '2'));
441  }
442 
443  // Pt3<>
444  {
445  std::stringstream sstrm;
446  sstrm << "1,2,3";
447  Pt3i pt;
448  sstrm >> pt;
449  TS_ASSERT_EQUALS(pt, Pt3i(1, 2, 3));
450  }
451  {
452  std::stringstream sstrm;
453  sstrm << "1.5,2.5,3.5";
454  Pt3f pt;
455  sstrm >> pt;
456  TS_ASSERT_EQUALS(pt, Pt3f(1.5, 2.5, 3.5));
457  }
458  {
459  std::stringstream sstrm;
460  sstrm << "1.5,2.5,3.5";
461  Pt3d pt;
462  sstrm >> pt;
463  TS_ASSERT_EQUALS(pt, Pt3d(1.5, 2.5, 3.5));
464  }
465  {
466  std::stringstream sstrm;
467  sstrm << "1,2,3";
468  Pt3<char> pt;
469  sstrm >> pt;
470  TS_ASSERT_EQUALS(pt, Pt3<char>('1', '2', '3'));
471  }
472 
473  // Pt4<>
474  {
475  std::stringstream sstrm;
476  sstrm << "1,2,3,4";
477  Pt4i pt;
478  sstrm >> pt;
479  TS_ASSERT_EQUALS(pt, Pt4i(1, 2, 3, 4));
480  }
481  {
482  std::stringstream sstrm;
483  sstrm << "1.5,2.5,3.5,4.5";
484  Pt4f pt;
485  sstrm >> pt;
486  TS_ASSERT_EQUALS(pt, Pt4f(1.5, 2.5, 3.5, 4.5));
487  }
488  {
489  std::stringstream sstrm;
490  sstrm << "1.5,2.5,3.5,4.5";
491  Pt4d pt;
492  sstrm >> pt;
493  TS_ASSERT_EQUALS(pt, Pt4d(1.5, 2.5, 3.5, 4.5));
494  }
495  {
496  std::stringstream sstrm;
497  sstrm << "1,2,3,4";
498  Pt4<char> pt;
499  sstrm >> pt;
500  TS_ASSERT_EQUALS(pt, Pt4<char>('1', '2', '3', '4'));
501  }
502 
503 } // PtUnitTests::testStreams
504 #endif
T z
z coordinate
Definition: pt.h:799
const T & at(unsigned int a) const
Definition: pt.h:1501
#define TS_ASSERT_DELTA_PT3D(a, b, delta)
Tests if two points are equal within delta and gives useful output.
Definition: TestTools.h:118
T x
x coordinate
Definition: pt.h:797
#define TS_ASSERT_DELTA_VECPT3D(a, b, delta)
Tests if two point vectors are equal within delta and gives useful output.
Definition: TestTools.h:80
void testStreams()
tests for point streams
Definition: pt.cpp:325
#define TS_ASSERT_DELTA_VECPT2D(a, b, delta)
Tests if two point vectors are equal within delta and gives useful output.
Definition: TestTools.h:98
2D Point template class
Definition: pt.h:82
#define TS_ASSERT_DELTA_PT2D(a, b, delta)
Tests if two points are equal within delta and gives useful output.
Definition: TestTools.h:122
void Set(T a_x, T a_y, T a_z)
Definition: pt.h:1474
3d point template class
Definition: pt.h:791
std::vector< Pt3f > VecPt3f
short rename
Definition: vector.h:52
Vector types for convenience.
T y
y coordinate
Definition: pt.h:798
void testIt()
tests for points
Definition: pt.cpp:27
std::vector< Pt2f > VecPt2f
short rename
Definition: vector.h:54
4D point template class
Definition: pt.h:1576
std::vector< Pt4d > VecPt4d
short rename
Definition: vector.h:50
std::vector< Pt3d > VecPt3d
short rename
Definition: vector.h:51