Subversion Repositories gelsvn

Rev

Rev 306 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
107 bj 1
#include <iostream>
2
#include <cmath>
3
#include <ctime>
4
#include <cstdlib>
5
#include <climits>
6
 
7
#include "CGLA/Vec2d.h"
8
#include "CGLA/Vec2f.h"
9
#include "CGLA/Vec2i.h"
10
#include "CGLA/Vec3i.h"
11
#include "CGLA/Vec3f.h" 
12
#include "CGLA/Vec3d.h" 
13
#include "CGLA/Vec3Hf.h" // next
14
#include "CGLA/Vec3uc.h"
15
#include "CGLA/Vec3usi.h"
16
#include "CGLA/Vec4f.h"
17
#include "CGLA/Vec4d.h"
18
#include "CGLA/Vec4uc.h"
306 jrf 19
#include "CGLA/Quatf.h"
20
#include "CGLA/Quatd.h"
107 bj 21
#include "Util/Timer.h"
22
 
23
using namespace std;
24
using namespace CGLA;
25
using namespace Util;
26
 
27
namespace
28
{
29
  // To find a pseudo-random number in the interval [0,1[
30
  double my_random()
31
  {
417 jrf 32
    return gel_rand()/(static_cast<double>(GEL_RAND_MAX) + 1.0);
107 bj 33
  }
34
}
35
 
36
/* This is a non-exhaustive test program for CGLA */
37
int main()
38
{
39
  int success = 0;
40
  Timer t;
41
 
417 jrf 42
  gel_srand(time(0));
107 bj 43
 
44
  t.start();
45
 
46
  ////////////////////////////////////////////////
47
  //                V e c 2 d
48
  ////////////////////////////////////////////////
49
 
50
  // Constructors
51
 
52
  {
417 jrf 53
  // TODO: The following should be done for all constructors in the remainder of the file
54
#ifndef NDEBUG
107 bj 55
    Vec2d x1;
56
    success += CGLA::isnan(x1[0]) && CGLA::isnan(x1[1]);
417 jrf 57
#else
58
    success += 1;
59
#endif
107 bj 60
 
61
    double xi1 = my_random(), xi2 = my_random();
62
    Vec2d x2(xi1, xi2);
63
    success += x2[0] == xi1 && x2[1] == xi2;
64
 
417 jrf 65
    int xii1 = gel_rand(), xii2 = gel_rand();
107 bj 66
    Vec2i i1(xii1, xii2);
67
    Vec2d x3(i1);
68
    success += x3[0] == xii1 && x3[1] == xii2;
69
 
70
    float xiii1 = my_random(), xiii2 = my_random();
71
    Vec2f f1(xiii1, xiii2);
72
    Vec2d x4(f1);
73
    success += x4[0] == xiii1 && x4[1] == xiii2;
74
 
75
    double xiiii = my_random();
76
    Vec2d x5(xiiii);
77
    success += x5[0] == xiiii && x5[1] == xiiii;
78
  }
79
  if(success != 5)
80
  {
81
    cout << "Failure in test of Vec2d Constructors";
82
    return 1;
83
  }
84
  success = 0;
85
 
86
  // Data manipulation
87
 
88
  {
89
    Vec2d x1;    
90
 
91
    success += x1.get_dim() == 2;
92
 
93
    double xi1 = my_random(), xi2 = my_random();
94
    x1.set(xi1, xi2);
95
    success += x1[0] == xi1 && x1[1] == xi2;
96
 
97
    success += x1.get() == &x1[0];
98
 
99
    double temp = BIG;
100
    for(unsigned int i = 0; i < x1.get_dim(); ++i)
101
      if(x1[i] < temp)
417 jrf 102
	      temp = x1[i];
107 bj 103
    success += temp == x1.min_coord();
104
 
105
    temp = -BIG;
106
    for(unsigned int i = 0; i < x1.get_dim(); ++i)
107
      if(x1[i] > temp)
417 jrf 108
	      temp = x1[i];
107 bj 109
    success += temp == x1.max_coord();
110
  }
111
  if(success != 5)
112
  {
113
    cout << "Failure in test of Vec2d Data manipulation";
114
    return 1;
115
  }
116
  success = 0;
117
 
118
  // Comparison operators
119
 
120
  {
121
    double xi1 = my_random(), xi2 = my_random();
122
    while(xi1 == xi2)
123
    {
124
      xi1 = my_random();
125
      xi2 = my_random();
126
    }
127
 
128
    Vec2d x1(xi1, xi2), x2(xi1, xi2), x3(xi1), x4(xi2);    
129
    success += x1 == x2;
130
    success += !(x1 == x3);
131
    success += x3 == xi1;
132
    success += !(x3 == xi2);
133
    success += x1 != x3;
134
    success += !(x1 != x2);
135
 
136
    if(xi1 < xi2)
137
    {
138
      success += x3.all_l(x4);
139
      success += !(x3.all_l(x2));
140
      success += x3.all_le(x2);
141
      success += !(x4.all_le(x3));
142
      success += x4.all_g(x3);
143
      success += !(x4.all_g(x2));
144
      success += x4.all_ge(x2);
145
      success += !(x3.all_ge(x4));
146
    }
147
    else 
148
    {
149
      success += x4.all_l(x3);
150
      success += !(x4.all_l(x2));
151
      success += x4.all_le(x2);
152
      success += !(x3.all_le(x4));
153
      success += x3.all_g(x4);
154
      success += !(x3.all_g(x2));
155
      success += x3.all_ge(x2);
156
      success += !(x4.all_ge(x3));
157
    }
158
  }
159
  if(success != 14)
160
  {
161
    cout << "Failure in test of Vec2d Comparison operators";
162
    return 1;
163
  }
164
  success = 0;
165
 
166
  // Assignment operators
167
 
168
  {
169
    double xi1 = my_random(), xi2 = my_random();
170
    Vec2d x1(xi1, xi2);
171
    double xi3 = my_random();
172
    x1 *= xi3;
173
    success += x1[0] == xi1*xi3 && x1[1] == xi2*xi3;
174
 
175
    while(xi3 == 0)
176
      xi3 = my_random();
177
    x1 = Vec2d(xi1, xi2);
178
    x1 /= xi3;
179
    success += abs(x1[0] - xi1/xi3) < 1.0e-15 && abs(x1[1] - xi2/xi3) < 1.0e-15;
180
 
181
    x1 = Vec2d(xi1, xi2);
182
    x1 += xi3;
183
    success += x1[0] == xi1 + xi3 && x1[1] == xi2 + xi3;
184
 
185
    x1 = Vec2d(xi1, xi2);
186
    x1 -= xi3;
187
    success += x1[0] == xi1 - xi3 && x1[1] == xi2 - xi3;
188
 
189
    double xii1 = my_random(), xii2 = my_random();
190
    Vec2d x2(xii1, xii2);
191
    x1 = Vec2d(xi1, xi2);
192
    x2 *= x1;
193
    success += x2[0] == xi1*xii1 && x2[1] == xi2*xii2;
194
 
195
    while(xi1 == 0)
196
      xi1 = my_random();
197
    while(xi2 == 0)
198
      xi2 = my_random();
199
    x1 = Vec2d(xi1, xi2);
200
    x2 = Vec2d(xii1, xii2);
201
    x2 /= x1;
202
    success += abs(x2[0] - xii1/xi1) < 1.0e-15 && abs(x2[1] - xii2/xi2) < 1.0e-15;
203
 
204
    x2 = Vec2d(xii1, xii2);
205
    x2 += x1;
206
    success += x2[0] == xii1 + xi1 && x2[1] == xii2 + xi2;
207
 
208
    x2 = Vec2d(xii1, xii2);
209
    x2 -= x1;
210
    success += x2[0] == xii1 - xi1 && x2[1] == xii2 - xi2;    
211
  }
212
  if(success != 8)
213
  {
214
    cout << "Failure in test of Vec2d Assignment operators";
215
    return 1;
216
  }
217
  success = 0;
218
 
219
  // Unary operators
220
 
221
  {
222
    double xi1 = my_random(), xi2 = my_random();
223
    Vec2d x1 = -Vec2d(xi1, xi2);    
224
    success += x1[0] == -xi1 && x1[1] == -xi2;
225
  }
226
  if(success != 1)
227
  {
228
    cout << "Failure in test of Vec2d Unary operators";
229
    return 1;
230
  }
231
  success = 0;
232
 
233
  // Binary operators
234
 
235
  {
236
    double xi1 = my_random(), xi2 = my_random();
237
    Vec2d x1(xi1, xi2);
238
    double xii1 = my_random(), xii2 = my_random();
239
    while(xii1 == 0)
240
      xii1 = my_random();
241
    while(xii2 == 0)
242
      xii2 = my_random();
243
    Vec2d x2(xii1, xii2);
244
    Vec2d x3 = x1*x2;
245
    success += x3[0] == xi1*xii1 && x3[1] == xi2*xii2;
246
 
247
    x3 = x1 + x2;
248
    success += x3[0] == xi1 + xii1 && x3[1] == xi2 + xii2;
249
 
250
    x3 = x1 - x2;
251
    success += x3[0] == xi1 - xii1 && x3[1] == xi2 - xii2;
252
 
253
    x3 = x1/x2;
254
    success += abs(x3[0] - xi1/xii1) < 1.0e-15 && abs(x3[1] - xi2/xii2) < 1.0e-15;
255
 
256
    double xi3 = my_random();
257
    x3 = x1*xi3;
258
    success += x3[0] == xi1*xi3 && x3[1] == xi2*xi3;
259
 
260
    x3 = xi3*x1;
261
    success += x3[0] == xi1*xi3 && x3[1] == xi2*xi3;
262
 
263
    float xi4 = my_random();
264
    x3 = xi4*x1;
265
    success += x3[0] == xi1*xi4 && x3[1] == xi2*xi4;
266
 
267
    x3 = x1*xi4;
268
    success += x3[0] == xi1*xi4 && x3[1] == xi2*xi4;
269
 
417 jrf 270
    int xi5 = gel_rand();
107 bj 271
    x3 = xi5*x1;
272
    success += x3[0] == xi1*xi5 && x3[1] == xi2*xi5;
273
 
274
    x3 = x1*xi5;
275
    success += x3[0] == xi1*xi5 && x3[1] == xi2*xi5;
276
 
277
    while(xi3 == 0)
278
      xi3 = my_random();
279
    x3 = x1/xi3;
280
    success += abs(x3[0] - xi1/xi3) < 1.0e-15 && abs(x3[1] - xi2/xi3) < 1.0e-15;
281
  } 
282
  if(success != 11)
283
  {
284
    cout << "Failure in test of Vec2d Binary operators";
285
    return 1;
286
  }
287
  success = 0;
288
 
289
  // Vector operations
290
 
291
  {
292
    double xi1 = my_random(), xi2 = my_random();
293
    Vec2d x1(xi1, xi2);
294
    double xii1 = my_random(), xii2 = my_random();
295
    Vec2d x2(xii1, xii2);
296
    double x = dot(x1, x2);
297
    success += x == xi1*xii1 + xi2*xii2;
298
 
299
    x = sqr_length(x1);
300
    success += x == xi1*xi1 + xi2*xi2;
301
 
302
    Vec2d x3 = v_min(x1, x2);
303
    success += x3[0] == (xi1 < xii1 ? xi1 : xii1) && x3[1] == (xi2 < xii2 ? xi2 : xii2);
304
 
305
    x3 = v_max(x1, x2);
306
    success += x3[0] == (xi1 > xii1 ? xi1 : xii1) && x3[1] == (xi2 > xii2 ? xi2 : xii2);
307
 
308
    x = x2.length();
309
    success += abs(x - sqrt(xii1*xii1 + xii2*xii2)) < 1.0e-15;
310
 
311
    x = length(x2);
312
    success += abs(x - sqrt(xii1*xii1 + xii2*xii2)) < 1.0e-15;
313
 
314
    while(sqr_length(x1) == 0.0)
315
    {
316
      xi1 = my_random();
317
      xi2 = my_random();      
318
      x1 = Vec2d(xi1, xi2);
319
    }
320
    x3 = normalize(x1);
321
    success += abs(x3[0] - xi1/sqrt(xi1*xi1 + xi2*xi2)) < 1.0e-15 
322
               && abs(x3[1] - xi2/sqrt(xi1*xi1 + xi2*xi2)) < 1.0e-15;
323
 
324
    x1.normalize();
325
    success += abs(x1[0] - xi1/sqrt(xi1*xi1 + xi2*xi2)) < 1.0e-15 
326
               && abs(x1[1] - xi2/sqrt(xi1*xi1 + xi2*xi2)) < 1.0e-15;
327
 
328
    x3 = orthogonal(x2);
329
    success += dot(x2, x3) == 0;
330
 
331
    x1 = Vec2d(xi1, xi2);
332
    x = cross(x1, x2);
333
    success += x == xi1*xii2 - xi2*xii1;
334
 
335
    while(x == 0)
336
    {
337
      xi1 = my_random();
338
      xi2 = my_random();
339
      x1 = Vec2d(xi1, xi2);
340
      x = cross(x1, x2);      
341
    }
342
    double xiii1 = my_random(), xiii2 = my_random();
343
    x3 = Vec2d(xiii1, xiii2);
344
    double y, z;
345
    linear_combine(x1, x2, x3, y, z);
346
    success += abs(y - (xii2*xiii1 - xii1*xiii2)/x) < 1.0e-15
347
               && abs(z - (xi1*xiii2 - xi2*xiii1)/x) < 1.0e-15;
348
  }
349
  if(success != 11)
350
  {
351
    cout << "Failure in test of Vec2d Vector operations";
352
    return 1;
353
  }
354
  success = 0;
355
 
356
  ////////////////////////////////////////////////
357
  //                V e c 2 f
358
  ////////////////////////////////////////////////
359
 
360
  // Constructors
361
 
362
  {
363
    Vec2f x1;
364
    success += CGLA::isnan(x1[0]) && CGLA::isnan(x1[1]);
365
 
366
    float xi1 = my_random(), xi2 = my_random();
367
    Vec2f x2(xi1, xi2);
368
    success += x2[0] == xi1 && x2[1] == xi2;
369
 
417 jrf 370
    int xii1 = gel_rand(), xii2 = gel_rand();
107 bj 371
    Vec2i i1(xii1, xii2);
372
    Vec2f x3(i1);
373
    success += x3[0] == xii1 && x3[1] == xii2;
374
 
375
    double xiii1 = my_random(), xiii2 = my_random();
376
    Vec2d d1(xiii1, xiii2);
377
    Vec2f x4(d1);
378
    success += x4[0] == xiii1 && x4[1] == xiii2;
379
 
380
    float xiiii = my_random();
381
    Vec2f x5(xiiii);
382
    success += x5[0] == xiiii && x5[1] == xiiii;
383
  }
384
  if(success != 5)
385
  {
386
    cout << "Failure in test of Vec2f Constructors";
387
    return 1;
388
  }
389
  success = 0;
390
 
391
  // Data manipulation
392
 
393
  {
394
    Vec2f x1;    
395
 
396
    success += x1.get_dim() == 2;
397
 
398
    float xi1 = my_random(), xi2 = my_random();
399
    x1.set(xi1, xi2);
400
    success += x1[0] == xi1 && x1[1] == xi2;
401
 
402
    success += x1.get() == &x1[0];
403
 
404
    float temp = BIG;
405
    for(unsigned int i = 0; i < x1.get_dim(); ++i)
406
      if(x1[i] < temp)
407
	temp = x1[i];
408
    success += temp == x1.min_coord();
409
 
410
    temp = -BIG;
411
    for(unsigned int i = 0; i < x1.get_dim(); ++i)
412
      if(x1[i] > temp)
413
	temp = x1[i];
414
    success += temp == x1.max_coord();
415
  }
416
  if(success != 5)
417
  {
418
    cout << "Failure in test of Vec2f Data manipulation";
419
    return 1;
420
  }
421
  success = 0;
422
 
423
  // Comparison operators
424
 
425
  {
426
    float xi1 = my_random(), xi2 = my_random();
427
    while(xi1 == xi2)
428
    {
429
      xi1 = my_random();
430
      xi2 = my_random();
431
    }
432
 
433
    Vec2f x1(xi1, xi2), x2(xi1, xi2), x3(xi1), x4(xi2);    
434
    success += x1 == x2;
435
    success += !(x1 == x3);
436
    success += x3 == xi1;
437
    success += !(x3 == xi2);
438
    success += x1 != x3;
439
    success += !(x1 != x2);
440
 
441
    if(xi1 < xi2)
442
    {
443
      success += x3.all_l(x4);
444
      success += !(x3.all_l(x2));
445
      success += x3.all_le(x2);
446
      success += !(x4.all_le(x3));
447
      success += x4.all_g(x3);
448
      success += !(x4.all_g(x2));
449
      success += x4.all_ge(x2);
450
      success += !(x3.all_ge(x4));
451
    }
452
    else 
453
    {
454
      success += x4.all_l(x3);
455
      success += !(x4.all_l(x2));
456
      success += x4.all_le(x2);
457
      success += !(x3.all_le(x4));
458
      success += x3.all_g(x4);
459
      success += !(x3.all_g(x2));
460
      success += x3.all_ge(x2);
461
      success += !(x4.all_ge(x3));
462
    }
463
  }
464
  if(success != 14)
465
  {
466
    cout << "Failure in test of Vec2f Comparison operators";
467
    return 1;
468
  }
469
  success = 0;
470
 
471
  // Assignment operators
472
 
473
  {
474
    float xi1 = my_random(), xi2 = my_random();
475
    Vec2f x1(xi1, xi2);
476
    float xi3 = my_random();
477
    x1 *= xi3;
478
    success += abs(x1[0] - xi1*xi3) < 1.0e-15 && abs(x1[1] - xi2*xi3) < 1.0e-15;
479
 
480
    while(xi3 == 0)
481
      xi3 = my_random();
482
    x1 = Vec2f(xi1, xi2);
483
    x1 /= xi3;
484
    success += abs(x1[0] - xi1/xi3) < 1.0e-15 && abs(x1[1] - xi2/xi3) < 1.0e-15;
485
 
486
    x1 = Vec2f(xi1, xi2);
487
    x1 += xi3;
488
    success += x1[0] == xi1 + xi3 && x1[1] == xi2 + xi3;
489
 
490
    x1 = Vec2f(xi1, xi2);
491
    x1 -= xi3;
492
    success += x1[0] == xi1 - xi3 && x1[1] == xi2 - xi3;
493
 
494
    float xii1 = my_random(), xii2 = my_random();
495
    Vec2f x2(xii1, xii2);
496
    x1 = Vec2f(xi1, xi2);
497
    x2 *= x1;
498
    success += abs(x2[0] - xi1*xii1) < 1.0e-15 && abs(x2[1] - xi2*xii2) < 1.0e-15;
499
 
500
    while(xi1 == 0)
501
      xi1 = my_random();
502
    while(xi2 == 0)
503
      xi2 = my_random();
504
    x1 = Vec2f(xi1, xi2);
505
    x2 = Vec2f(xii1, xii2);
506
    x2 /= x1;
507
    success += abs(x2[0] - xii1/xi1) < 1.0e-15 && abs(x2[1] - xii2/xi2) < 1.0e-15;
508
 
509
    x2 = Vec2f(xii1, xii2);
510
    x2 += x1;
511
    success += x2[0] == xii1 + xi1 && x2[1] == xii2 + xi2;
512
 
513
    x2 = Vec2f(xii1, xii2);
514
    x2 -= x1;
515
    success += x2[0] == xii1 - xi1 && x2[1] == xii2 - xi2;    
516
  }
517
  if(success != 8)
518
  {
519
    cout << "Failure in test of Vec2f Assignment operators";
520
    return 1;
521
  }
522
  success = 0;
523
 
524
  // Unary operators
525
 
526
  {
527
    float xi1 = my_random(), xi2 = my_random();
528
    Vec2f x1 = -Vec2f(xi1, xi2);    
529
    success += x1[0] == -xi1 && x1[1] == -xi2;
530
  }
531
  if(success != 1)
532
  {
533
    cout << "Failure in test of Vec2f Unary operators";
534
    return 1;
535
  }
536
  success = 0;
537
 
538
  // Binary operators
539
 
540
  {
541
    float xi1 = my_random(), xi2 = my_random();
542
    Vec2f x1(xi1, xi2);
543
    float xii1 = my_random(), xii2 = my_random();
544
    while(xii1 == 0)
545
      xii1 = my_random();
546
    while(xii2 == 0)
547
      xii2 = my_random();
548
    Vec2f x2(xii1, xii2);
549
    Vec2f x3 = x1*x2;
550
    success += abs(x3[0] - xi1*xii1) < 1.0e-15 && abs(x3[1] - xi2*xii2) < 1.0e-15;
551
 
552
    x3 = x1 + x2;
553
    success += x3[0] == xi1 + xii1 && x3[1] == xi2 + xii2;
554
 
555
    x3 = x1 - x2;
556
    success += x3[0] == xi1 - xii1 && x3[1] == xi2 - xii2;
557
 
558
    x3 = x1/x2;
559
    success += abs(x3[0] - xi1/xii1) < 1.0e-15 && abs(x3[1] - xi2/xii2) < 1.0e-15;
560
 
561
    float xi3 = my_random();
562
    x3 = x1*xi3;
563
    success += abs(x3[0] - xi1*xi3) < 1.0e-15 && abs(x3[1] - xi2*xi3) < 1.0e-15;
564
 
565
    x3 = xi3*x1;
566
    success += abs(x3[0] - xi1*xi3) < 1.0e-15 && abs(x3[1] - xi2*xi3) < 1.0e-15;
567
 
568
    float xi4 = my_random();
569
    x3 = xi4*x1;
570
    success += abs(x3[0] - xi1*xi4) < 1-0e-15 && abs(x3[1] - xi2*xi4) < 1.0e-15;
571
 
572
    x3 = x1*xi4;
573
    success += abs(x3[0] - xi1*xi4) < 1-0e-15 && abs(x3[1] - xi2*xi4) < 1.0e-15;
574
 
417 jrf 575
    int xi5 = gel_rand();
107 bj 576
    x3 = xi5*x1;
577
    success += abs(x3[0] - xi1*xi5) < 1.0e-15 && abs(x3[1] - xi2*xi5) < 1.0e-15;
578
 
579
    x3 = x1*xi5;
580
    success += abs(x3[0] - xi1*xi5) < 1.0e-15 && abs(x3[1] - xi2*xi5) < 1.0e-15;
581
 
582
    while(xi3 == 0)
583
      xi3 = my_random();
584
    x3 = x1/xi3;
585
    success += abs(x3[0] - xi1/xi3) < 1.0e-15 && abs(x3[1] - xi2/xi3) < 1.0e-15;
586
  } 
587
  if(success != 11)
588
  {
589
    cout << "Failure in test of Vec2f Binary operators";
590
    return 1;
591
  }
592
  success = 0;
593
 
594
  // Vector operations
595
 
596
  {
597
    float xi1 = my_random(), xi2 = my_random();
598
    Vec2f x1(xi1, xi2);
599
    float xii1 = my_random(), xii2 = my_random();
600
    Vec2f x2(xii1, xii2);
601
    float x = dot(x1, x2);
602
    success += (x - xi1*xii1 - xi2*xii2) < 1.0e-7;
603
 
604
    x = sqr_length(x1);
605
    success += abs(x - xi1*xi1 - xi2*xi2) < 1.0e-15;
606
 
607
    Vec2f x3 = v_min(x1, x2);
608
    success += x3[0] == (xi1 < xii1 ? xi1 : xii1) && x3[1] == (xi2 < xii2 ? xi2 : xii2);
609
 
610
    x3 = v_max(x1, x2);
611
    success += x3[0] == (xi1 > xii1 ? xi1 : xii1) && x3[1] == (xi2 > xii2 ? xi2 : xii2);
612
 
613
    x = x2.length();
614
    success += abs(x - sqrt(xii1*xii1 + xii2*xii2)) < 1.0e-15;
615
 
616
    x = length(x2);
617
    success += abs(x - sqrt(xii1*xii1 + xii2*xii2)) < 1.0e-15;
618
 
619
    while(sqr_length(x1) == 0.0)
620
    {
621
      xi1 = my_random();
622
      xi2 = my_random();      
623
      x1 = Vec2f(xi1, xi2);
624
    }
625
    x3 = normalize(x1);
626
    success += abs(x3[0] - xi1/sqrt(xi1*xi1 + xi2*xi2)) < 1.0e-15 
627
               && abs(x3[1] - xi2/sqrt(xi1*xi1 + xi2*xi2)) < 1.0e-15;
628
 
629
    x1.normalize();
630
    success += abs(x1[0] - xi1/sqrt(xi1*xi1 + xi2*xi2)) < 1.0e-15 
631
               && abs(x1[1] - xi2/sqrt(xi1*xi1 + xi2*xi2)) < 1.0e-15;
632
 
633
    x3 = orthogonal(x2);
634
    success += abs(dot(x2, x3)) < 1.0e-15;
635
 
636
    x1 = Vec2f(xi1, xi2);
637
    x = cross(x1, x2);
638
    success += abs(x - xi1*xii2 + xi2*xii1) < 1.0e-15;
639
 
640
    while(x == 0)
641
    {
642
      xi1 = my_random();
643
      xi2 = my_random();
644
      x1 = Vec2f(xi1, xi2);
645
      x = cross(x1, x2);      
646
    }
647
    float xiii1 = my_random(), xiii2 = my_random();
648
    x3 = Vec2f(xiii1, xiii2);
649
    float y, z;
650
    linear_combine(x1, x2, x3, y, z);
651
    success += abs(y - (xii2*xiii1 - xii1*xiii2)/x) < 1.0e-15
652
               && abs(z - (xi1*xiii2 - xi2*xiii1)/x) < 1.0e-15;
653
  }
654
  if(success != 11)
655
  {
656
    cout << "Failure in test of Vec2f Vector operations";
657
    return 1;
658
  }
659
  success = 0;
660
 
661
  ////////////////////////////////////////////////
662
  //                V e c 2 i
663
  ////////////////////////////////////////////////
664
 
665
  // Constructors
666
 
667
  {
668
/* Vec2i default initialization ?
669
 *
670
    Vec2i x1;
671
    success += CGLA::isnan(x1[0]) && CGLA::isnan(x1[1]);
672
*/
673
 
417 jrf 674
    int xi1 = gel_rand(), xi2 = gel_rand();
107 bj 675
    Vec2i x2(xi1, xi2);
676
    success += x2[0] == xi1 && x2[1] == xi2;
677
 
678
/* Constuctor non-existent !
679
 *
680
    int xii1 = my_random(), xii2 = my_random();
681
    Vec2d d1(xii1, xii2);
682
    Vec2i x3(i1);
683
    success += x3[0] == xii1 && x3[1] == xii2;
684
*/
685
 
686
    float xiii1 = my_random(), xiii2 = my_random();
687
    Vec2f f1(xiii1, xiii2);
688
    Vec2i x4(f1);
689
    success += x4[0] == static_cast<int>(xiii1) && x4[1] == static_cast<int>(xiii2);
690
 
691
/* Constuctor non-existent !
692
 *
417 jrf 693
    int xiiii = gel_rand();
107 bj 694
    Vec2i x5(xiiii);
695
    success += x5[0] == xiiii && x5[1] == xiiii;
696
*/
697
  }
698
  if(success != 2)
699
  {
700
    cout << "Failure in test of Vec2i Constructors";
701
    return 1;
702
  }
703
  success = 0;
704
 
705
  // Data manipulation
706
 
707
  {
708
    Vec2i x1;    
709
 
710
    success += x1.get_dim() == 2;
711
 
417 jrf 712
    int xi1 = gel_rand(), xi2 = gel_rand();
107 bj 713
    x1.set(xi1, xi2);
714
    success += x1[0] == xi1 && x1[1] == xi2;
715
 
716
    success += x1.get() == &x1[0];
717
 
718
    int temp = INT_MAX;
719
    for(unsigned int i = 0; i < x1.get_dim(); ++i)
720
      if(x1[i] < temp)
721
	temp = x1[i];
722
    success += temp == x1.min_coord();
723
 
724
    temp = -INT_MAX;
725
    for(unsigned int i = 0; i < x1.get_dim(); ++i)
726
      if(x1[i] > temp)
727
	temp = x1[i];
728
    success += temp == x1.max_coord();
729
  }
730
  if(success != 5)
731
  {
732
    cout << "Failure in test of Vec2i Data manipulation";
733
    return 1;
734
  }
735
  success = 0;
736
 
737
  // Comparison operators
738
 
739
  {
417 jrf 740
    int xi1 = gel_rand(), xi2 = gel_rand();
107 bj 741
    while(xi1 == xi2)
742
    {
417 jrf 743
      xi1 = gel_rand();
744
      xi2 = gel_rand();
107 bj 745
    }
746
 
747
    Vec2i x1(xi1, xi2), x2(xi1, xi2), x3(xi1, xi1), x4(xi2, xi2);    
748
    success += x1 == x2;
749
    success += !(x1 == x3);
750
    success += x3 == xi1;
751
    success += !(x3 == xi2);
752
    success += x1 != x3;
753
    success += !(x1 != x2);
754
 
755
    if(xi1 < xi2)
756
    {
757
      success += x3.all_l(x4);
758
      success += !(x3.all_l(x2));
759
      success += x3.all_le(x2);
760
      success += !(x4.all_le(x3));
761
      success += x4.all_g(x3);
762
      success += !(x4.all_g(x2));
763
      success += x4.all_ge(x2);
764
      success += !(x3.all_ge(x4));
765
    }
766
    else 
767
    {
768
      success += x4.all_l(x3);
769
      success += !(x4.all_l(x2));
770
      success += x4.all_le(x2);
771
      success += !(x3.all_le(x4));
772
      success += x3.all_g(x4);
773
      success += !(x3.all_g(x2));
774
      success += x3.all_ge(x2);
775
      success += !(x4.all_ge(x3));
776
    }
777
  }
778
  if(success != 14)
779
  {
780
    cout << "Failure in test of Vec2i Comparison operators";
781
    return 1;
782
  }
783
  success = 0;
784
 
785
  // Assignment operators
786
 
787
  {
417 jrf 788
    int xi1 = gel_rand(), xi2 = gel_rand();
107 bj 789
    Vec2i x1(xi1, xi2);
417 jrf 790
    int xi3 = gel_rand();
107 bj 791
    x1 *= xi3;
792
    success += x1[0] == xi1*xi3 && x1[1] == xi2*xi3;
793
 
794
    while(xi3 == 0)
417 jrf 795
      xi3 = gel_rand();
107 bj 796
    x1 = Vec2i(xi1, xi2);
797
    x1 /= xi3;
798
    success += x1[0] == xi1/xi3 && x1[1] == xi2/xi3;
799
 
800
    x1 = Vec2i(xi1, xi2);
801
    x1 += xi3;
802
    success += x1[0] == xi1 + xi3 && x1[1] == xi2 + xi3;
803
 
804
    x1 = Vec2i(xi1, xi2);
805
    x1 -= xi3;
806
    success += x1[0] == xi1 - xi3 && x1[1] == xi2 - xi3;
807
 
417 jrf 808
    int xii1 = gel_rand(), xii2 = gel_rand();
107 bj 809
    Vec2i x2(xii1, xii2);
810
    x1 = Vec2i(xi1, xi2);
811
    x2 *= x1;
812
    success += x2[0] == xi1*xii1 && x2[1] == xi2*xii2;
813
 
814
    while(xi1 == 0)
417 jrf 815
      xi1 = gel_rand();
107 bj 816
    while(xi2 == 0)
417 jrf 817
      xi2 = gel_rand();
107 bj 818
    x1 = Vec2i(xi1, xi2);
819
    x2 = Vec2i(xii1, xii2);
820
    x2 /= x1;
821
    success += x2[0] == xii1/xi1 && x2[1] == xii2/xi2;
822
 
823
    x2 = Vec2i(xii1, xii2);
824
    x2 += x1;
825
    success += x2[0] == xii1 + xi1 && x2[1] == xii2 + xi2;
826
 
827
    x2 = Vec2i(xii1, xii2);
828
    x2 -= x1;
829
    success += x2[0] == xii1 - xi1 && x2[1] == xii2 - xi2;    
830
  }
831
  if(success != 8)
832
  {
833
    cout << "Failure in test of Vec2i Assignment operators";
834
    return 1;
835
  }
836
  success = 0;
837
 
838
  // Unary operators
839
 
840
  {
417 jrf 841
    int xi1 = gel_rand(), xi2 = gel_rand();
107 bj 842
    Vec2i x1 = -Vec2i(xi1, xi2);    
843
    success += x1[0] == -xi1 && x1[1] == -xi2;
844
  }
845
  if(success != 1)
846
  {
847
    cout << "Failure in test of Vec2i Unary operators";
848
    return 1;
849
  }
850
  success = 0;
851
 
852
  // Binary operators
853
 
854
  {
417 jrf 855
    int xi1 = gel_rand(), xi2 = gel_rand();
107 bj 856
    Vec2i x1(xi1, xi2);
417 jrf 857
    int xii1 = gel_rand(), xii2 = gel_rand();
107 bj 858
    while(xii1 == 0)
417 jrf 859
      xii1 = gel_rand();
107 bj 860
    while(xii2 == 0)
417 jrf 861
      xii2 = gel_rand();
107 bj 862
    Vec2i x2(xii1, xii2);
863
    Vec2i x3 = x1*x2;
864
    success += x3[0] == xi1*xii1 && x3[1] == xi2*xii2;
865
 
866
    x3 = x1 + x2;
867
    success += x3[0] == xi1 + xii1 && x3[1] == xi2 + xii2;
868
 
869
    x3 = x1 - x2;
870
    success += x3[0] == xi1 - xii1 && x3[1] == xi2 - xii2;
871
 
872
    x3 = x1/x2;
873
    success += x3[0] == xi1/xii1 && x3[1] == xi2/xii2;
874
 
417 jrf 875
    int xi3 = gel_rand();
107 bj 876
    x3 = x1*xi3;
877
    success += x3[0] == xi1*xi3 && x3[1] == xi2*xi3;
878
 
879
    x3 = xi3*x1;
880
    success += x3[0] == xi1*xi3 && x3[1] == xi2*xi3;
881
 
882
    float xi4 = INT_MAX*my_random();
883
    x3 = xi4*x1;
884
    success += x3[0] == xi1*static_cast<int>(xi4) && x3[1] == xi2*static_cast<int>(xi4);
885
 
886
    x3 = x1*xi4;
887
    success += x3[0] == xi1*static_cast<int>(xi4) && x3[1] == xi2*static_cast<int>(xi4);
888
 
889
    double xi5 = INT_MAX*my_random();
890
    x3 = xi5*x1;
891
    success += x3[0] == xi1*static_cast<int>(xi5) && x3[1] == xi2*static_cast<int>(xi5);
892
 
893
    x3 = x1*xi5;
894
    success += x3[0] == xi1*static_cast<int>(xi5) && x3[1] == xi2*static_cast<int>(xi5);
895
 
896
    while(xi3 == 0)
417 jrf 897
      xi3 = gel_rand();
107 bj 898
    x3 = x1/xi3;
899
    success += x3[0] == xi1/xi3 && x3[1] == xi2/xi3;
900
  } 
901
  if(success != 11)
902
  {
903
    cout << "Failure in test of Vec2i Binary operators";
904
    return 1;
905
  }
906
  success = 0;
907
 
908
  // Vector operations
909
 
910
  {
417 jrf 911
    int xi1 = gel_rand(), xi2 = gel_rand();
107 bj 912
    Vec2i x1(xi1, xi2);
417 jrf 913
    int xii1 = gel_rand(), xii2 = gel_rand();
107 bj 914
    Vec2i x2(xii1, xii2);
915
    int x = dot(x1, x2);
916
    success += x == xi1*xii1 + xi2*xii2;
917
 
918
    x = sqr_length(x1);
919
    success += x == xi1*xi1 + xi2*xi2;
920
 
921
    Vec2i x3 = v_min(x1, x2);
922
    success += x3[0] == (xi1 < xii1 ? xi1 : xii1) && x3[1] == (xi2 < xii2 ? xi2 : xii2);
923
 
924
    x3 = v_max(x1, x2);
925
    success += x3[0] == (xi1 > xii1 ? xi1 : xii1) && x3[1] == (xi2 > xii2 ? xi2 : xii2);
926
  }
927
  if(success != 4)
928
  {
929
    cout << "Failure in test of Vec2i Vector operations";
930
    return 1;
931
  }
932
  success = 0;
933
 
934
  ////////////////////////////////////////////////
935
  //                V e c 3 i
936
  ////////////////////////////////////////////////
937
 
938
  // Constructors
939
 
940
  {
941
/* Vec3i default initialization ?
942
 *
943
    Vec3i x1;
944
    success += CGLA::isnan(x1[0]) && CGLA::isnan(x1[1]) && CGLA::isnan(x1[2]);
945
*/
946
 
417 jrf 947
    int xi1 = gel_rand(), xi2 = gel_rand(), xi3 = gel_rand();
107 bj 948
    Vec3i x2(xi1, xi2, xi3);
949
    success += x2[0] == xi1 && x2[1] == xi2 && x2[2] == xi3;
950
 
417 jrf 951
    int xiiii = gel_rand();
107 bj 952
    Vec3i x3(xiiii);
953
    success += x3[0] == xiiii && x3[1] == xiiii && x3[2] == xiiii;
954
 
955
/* Constuctor non-existent !
956
 *
957
    int xii1 = my_random(), xii2 = my_random(), xii3 = my_random();
958
    Vec3d d1(xii1, xii2, xii3);
959
    Vec3i x4(d1);
960
    success += x4[0] == xii1 && x4[1] == xii2 && x4[2] == xii3;
961
*/
962
 
963
    float xiii1 = my_random(), xiii2 = my_random(), xiii3 = my_random();
964
    Vec3f f1(xiii1, xiii2, xiii3);
965
    Vec3i x5(f1);
966
    success += x5[0] == static_cast<int>(xiii1) 
967
               && x5[1] == static_cast<int>(xiii2)
968
               && x5[2] == static_cast<int>(xiii3);
969
 
970
    unsigned char xiiii1 = 256*my_random(), 
971
                  xiiii2 = 256*my_random(), 
972
                  xiiii3 = 256*my_random();
973
    Vec3uc uc1(xiiii1, xiiii2, xiiii3);
974
    Vec3i x6(uc1);
975
    success += x6[0] == xiiii1 && x6[1] == xiiii2 && x6[2] == xiiii3;
976
 
977
    unsigned short int xiiv1 = USHRT_MAX*my_random(),
978
                       xiiv2 = USHRT_MAX*my_random(),
979
                       xiiv3 = USHRT_MAX*my_random();
980
    Vec3usi usi1(xiiv1, xiiv2, xiiv3);
981
    Vec3i x7(usi1);
982
    success += x7[0] == xiiv1 && x7[1] == xiiv2 && x7[2] == xiiv3;
983
  }
984
  if(success != 5)
985
  {
986
    cout << "Failure in test of Vec3i Constructors";
987
    return 1;
988
  }
989
  success = 0;
990
 
991
  // Data manipulation
992
 
993
  {
994
    Vec3i x1;    
995
 
996
    success += x1.get_dim() == 3;
997
 
417 jrf 998
    int xi1 = gel_rand(), xi2 = gel_rand(), xi3 = gel_rand();
107 bj 999
    x1.set(xi1, xi2, xi3);
1000
    success += x1[0] == xi1 && x1[1] == xi2 && x1[2] == xi3;
1001
 
1002
    success += x1.get() == &x1[0];
1003
 
1004
    int temp = INT_MAX;
1005
    for(unsigned int i = 0; i < x1.get_dim(); ++i)
1006
      if(x1[i] < temp)
1007
	temp = x1[i];
1008
    success += temp == x1.min_coord();
1009
 
1010
    temp = -INT_MAX;
1011
    for(unsigned int i = 0; i < x1.get_dim(); ++i)
1012
      if(x1[i] > temp)
1013
	temp = x1[i];
1014
    success += temp == x1.max_coord();
1015
  }
1016
  if(success != 5)
1017
  {
1018
    cout << "Failure in test of Vec3i Data manipulation";
1019
    return 1;
1020
  }
1021
  success = 0;
1022
 
1023
  // Comparison operators
1024
 
1025
  {
417 jrf 1026
    int xi1 = gel_rand(), xi2 = gel_rand(), xi3 = gel_rand();
107 bj 1027
    while(xi1 >= xi2)
1028
    {
417 jrf 1029
      xi1 = gel_rand();
1030
      xi2 = gel_rand();
107 bj 1031
    }
1032
    while(xi3 <= xi2)
417 jrf 1033
      xi3 = gel_rand();
107 bj 1034
 
1035
    Vec3i x1(xi1, xi2, xi3), x2(xi1, xi2, xi3), 
1036
          x3(xi1, xi1, xi1), x4(xi2, xi2, xi2), x5(xi3, xi3, xi3);    
1037
    success += x1 == x2;
1038
    success += !(x1 == x3);
1039
    success += x3 == xi1;
1040
    success += !(x3 == xi2);
1041
    success += x1 != x3;
1042
    success += !(x1 != x2);
1043
    success += x3.all_l(x4);
1044
    success += !(x3.all_l(x2));
1045
    success += x3.all_le(x2);
1046
    success += !(x4.all_le(x2));
1047
    success += x4.all_g(x3);
1048
    success += !(x4.all_g(x2));
1049
    success += x5.all_ge(x2);
1050
    success += !(x4.all_ge(x2));
1051
  }
1052
  if(success != 14)
1053
  {
1054
    cout << "Failure in test of Vec3i Comparison operators";
1055
    return 1;
1056
  }
1057
  success = 0;
1058
 
1059
  // Assignment operators
1060
 
1061
  {
417 jrf 1062
    int xi1 = gel_rand(), xi2 = gel_rand(), xi3 = gel_rand();
107 bj 1063
    Vec3i x1(xi1, xi2, xi3);
417 jrf 1064
    int xii = gel_rand();
107 bj 1065
    x1 *= xii;
1066
    success += x1[0] == xi1*xii && x1[1] == xi2*xii && x1[2] == xi3*xii;
1067
 
1068
    while(xii == 0)
417 jrf 1069
      xii = gel_rand();
107 bj 1070
    x1 = Vec3i(xi1, xi2, xi3);
1071
    x1 /= xii;
1072
    success += x1[0] == xi1/xii && x1[1] == xi2/xii && x1[2] == xi3/xii;
1073
 
1074
    x1 = Vec3i(xi1, xi2, xi3);
1075
    x1 += xii;
1076
    success += x1[0] == xi1 + xii && x1[1] == xi2 + xii && x1[2] == xi3 + xii;
1077
 
1078
    x1 = Vec3i(xi1, xi2, xi3);
1079
    x1 -= xii;
1080
    success += x1[0] == xi1 - xii && x1[1] == xi2 - xii && x1[2] == xi3 - xii;
1081
 
417 jrf 1082
    int xii1 = gel_rand(), xii2 = gel_rand(), xii3 = gel_rand();
107 bj 1083
    Vec3i x2(xii1, xii2, xii3);
1084
    x1 = Vec3i(xi1, xi2, xi3);
1085
    x2 *= x1;
1086
    success += x2[0] == xi1*xii1 && x2[1] == xi2*xii2 && x2[2] == xi3*xii3;
1087
 
1088
    while(xi1 == 0)
417 jrf 1089
      xi1 = gel_rand();
107 bj 1090
    while(xi2 == 0)
417 jrf 1091
      xi2 = gel_rand();
107 bj 1092
    while(xi3 == 0)
417 jrf 1093
      xi3 = gel_rand();
107 bj 1094
    x1 = Vec3i(xi1, xi2, xi3);
1095
    x2 = Vec3i(xii1, xii2, xii3);
1096
    x2 /= x1;
1097
    success += x2[0] == xii1/xi1 && x2[1] == xii2/xi2 && x2[2] == xii3/xi3;
1098
 
1099
    x2 = Vec3i(xii1, xii2, xii3);
1100
    x2 += x1;
1101
    success += x2[0] == xii1 + xi1 && x2[1] == xii2 + xi2 && x2[2] == xii3 + xi3;
1102
 
1103
    x2 = Vec3i(xii1, xii2, xii3);
1104
    x2 -= x1;
1105
    success += x2[0] == xii1 - xi1 && x2[1] == xii2 - xi2 && x2[2] == xii3 - xi3;    
1106
  }
1107
  if(success != 8)
1108
  {
1109
    cout << "Failure in test of Vec3i Assignment operators";
1110
    return 1;
1111
  }
1112
  success = 0;
1113
 
1114
  // Unary operators
1115
 
1116
  {
417 jrf 1117
    int xi1 = gel_rand(), xi2 = gel_rand(), xi3 = gel_rand();
107 bj 1118
    Vec3i x1 = -Vec3i(xi1, xi2, xi3);    
1119
    success += x1[0] == -xi1 && x1[1] == -xi2 && x1[2] == -xi3;
1120
  }
1121
  if(success != 1)
1122
  {
1123
    cout << "Failure in test of Vec3i Unary operators";
1124
    return 1;
1125
  }
1126
  success = 0;
1127
 
1128
  // Binary operators
1129
 
1130
  {
417 jrf 1131
    int xi1 = gel_rand(), xi2 = gel_rand(), xi3 = gel_rand();
107 bj 1132
    Vec3i x1(xi1, xi2, xi3);
417 jrf 1133
    int xii1 = gel_rand(), xii2 = gel_rand(), xii3 = gel_rand();
107 bj 1134
    while(xii1 == 0)
417 jrf 1135
      xii1 = gel_rand();
107 bj 1136
    while(xii2 == 0)
417 jrf 1137
      xii2 = gel_rand();
107 bj 1138
    while(xii3 == 0)
417 jrf 1139
      xii3 = gel_rand();
107 bj 1140
    Vec3i x2(xii1, xii2, xii3);
1141
    Vec3i x3 = x1*x2;
1142
    success += x3[0] == xi1*xii1 && x3[1] == xi2*xii2 && x3[2] == xi3*xii3;
1143
 
1144
    x3 = x1 + x2;
1145
    success += x3[0] == xi1 + xii1 && x3[1] == xi2 + xii2 && x3[2] == xi3 + xii3;
1146
 
1147
    x3 = x1 - x2;
1148
    success += x3[0] == xi1 - xii1 && x3[1] == xi2 - xii2 && x3[2] == xi3 - xii3;
1149
 
1150
    x3 = x1/x2;
1151
    success += x3[0] == xi1/xii1 && x3[1] == xi2/xii2 && x3[2] == xi3/xii3;
1152
 
417 jrf 1153
    int xii = gel_rand();
107 bj 1154
    x3 = x1*xii;
1155
    success += x3[0] == xi1*xii && x3[1] == xi2*xii && x3[2] == xi3*xii;
1156
 
1157
    x3 = xii*x1;
1158
    success += x3[0] == xi1*xii && x3[1] == xi2*xii && x3[2] == xi3*xii;
1159
 
1160
    float xi4 = INT_MAX*my_random();
1161
    x3 = xi4*x1;
1162
    success += x3[0] == xi1*static_cast<int>(xi4) 
1163
               && x3[1] == xi2*static_cast<int>(xi4) 
1164
               && x3[2] == xi3*static_cast<int>(xi4);
1165
 
1166
    x3 = x1*xi4;
1167
    success += x3[0] == xi1*static_cast<int>(xi4) 
1168
               && x3[1] == xi2*static_cast<int>(xi4) 
1169
               && x3[2] == xi3*static_cast<int>(xi4);
1170
 
1171
    double xi5 = INT_MAX*my_random();
1172
    x3 = xi5*x1;
1173
    success += x3[0] == xi1*static_cast<int>(xi5) 
1174
               && x3[1] == xi2*static_cast<int>(xi5) 
1175
               && x3[2] == xi3*static_cast<int>(xi5);
1176
 
1177
    x3 = x1*xi5;
1178
    success += x3[0] == xi1*static_cast<int>(xi5) 
1179
               && x3[1] == xi2*static_cast<int>(xi5) 
1180
               && x3[2] == xi3*static_cast<int>(xi5);
1181
 
1182
    while(xii == 0)
417 jrf 1183
      xii = gel_rand();
107 bj 1184
    x3 = x1/xii;
1185
    success += x3[0] == xi1/xii && x3[1] == xi2/xii && x3[2] == xi3/xii;
1186
  } 
1187
  if(success != 11)
1188
  {
1189
    cout << "Failure in test of Vec3i Binary operators";
1190
    return 1;
1191
  }
1192
  success = 0;
1193
 
1194
  // Vector operations
1195
 
1196
  {
417 jrf 1197
    int xi1 = gel_rand(), xi2 = gel_rand(), xi3 = gel_rand();
107 bj 1198
    Vec3i x1(xi1, xi2, xi3);
417 jrf 1199
    int xii1 = gel_rand(), xii2 = gel_rand(), xii3 = gel_rand();
107 bj 1200
    Vec3i x2(xii1, xii2, xii3);
1201
    int x = dot(x1, x2);
1202
    success += x == xi1*xii1 + xi2*xii2 + xi3*xii3;
1203
 
1204
    x = sqr_length(x1);
1205
    success += x == xi1*xi1 + xi2*xi2 + xi3*xi3;
1206
 
1207
    Vec3i x3 = v_min(x1, x2);
1208
    success += x3[0] == (xi1 < xii1 ? xi1 : xii1) 
1209
               && x3[1] == (xi2 < xii2 ? xi2 : xii2)
1210
               && x3[2] == (xi3 < xii3 ? xi3 : xii3);
1211
 
1212
    x3 = v_max(x1, x2);
1213
    success += x3[0] == (xi1 > xii1 ? xi1 : xii1) 
1214
               && x3[1] == (xi2 > xii2 ? xi2 : xii2)
1215
               && x3[2] == (xi3 > xii3 ? xi3 : xii3);
1216
 
1217
    x3 = cross(x1, x2);
1218
    success += x3[0] == xi2*xii3 - xi3*xii2
1219
               && x3[1] == xi3*xii1 - xi1*xii3
1220
               && x3[2] == xi1*xii2 - xi2*xii1;
1221
  }
1222
  if(success != 5)
1223
  {
1224
    cout << "Failure in test of Vec3i Vector operations";
1225
    return 1;
1226
  }
1227
  success = 0;
1228
 
1229
  ////////////////////////////////////////////////
1230
  //                V e c 3 f
1231
  ////////////////////////////////////////////////
1232
 
1233
  // Constructors
1234
 
1235
  {
1236
    Vec3f x1;
1237
    success += CGLA::isnan(x1[0]) && CGLA::isnan(x1[1]) && CGLA::isnan(x1[2]);
1238
 
1239
    float xi1 = my_random(), xi2 = my_random(), xi3 = my_random();
1240
    Vec3f x2(xi1, xi2, xi3);
1241
    success += x2[0] == xi1 && x2[1] == xi2 && x2[2] == xi3;
1242
 
1243
    float xiiii = my_random();
1244
    Vec3f x3(xiiii);
1245
    success += x3[0] == xiiii && x3[1] == xiiii && x3[2] == xiiii;
1246
 
1247
    double xii1 = my_random(), xii2 = my_random(), xii3 = my_random();
1248
    Vec3d d1(xii1, xii2, xii3);
1249
    Vec3f x4(d1);
1250
    success += x4[0] == xii1 && x4[1] == xii2 && x4[2] == xii3;
1251
 
417 jrf 1252
    int xiii1 = gel_rand(), xiii2 = gel_rand(), xiii3 = gel_rand();
107 bj 1253
    Vec3i i1(xiii1, xiii2, xiii3);
1254
    Vec3f x5(i1);
1255
    success += x5[0] == xiii1 && x5[1] == xiii2 && x5[2] == xiii3;
1256
 
1257
    float xiiii1 = my_random(), xiiii2 = my_random(), xiiii3 = my_random();
306 jrf 1258
    Quatf q(xiiii1, xiiii2, xiiii3, 1.0);
1259
    Vec3f x6 = q.get_imaginary_part();
107 bj 1260
    success += x6[0] == xiiii1 && x6[1] == xiiii2 && x6[2] == xiiii3;
1261
 
1262
    unsigned short int xiiv1 = USHRT_MAX*my_random(),
1263
                       xiiv2 = USHRT_MAX*my_random(),
1264
                       xiiv3 = USHRT_MAX*my_random();
1265
    Vec3usi usi1(xiiv1, xiiv2, xiiv3);
1266
    Vec3f x7(usi1);
1267
    success += x7[0] == xiiv1 && x7[1] == xiiv2 && x7[2] == xiiv3;
1268
  }
1269
  if(success != 7)
1270
  {
1271
    cout << "Failure in test of Vec3f Constructors";
1272
    return 1;
1273
  }
1274
  success = 0;
1275
 
1276
  // Data manipulation
1277
 
1278
  {
1279
    Vec3f x1;    
1280
 
1281
    success += x1.get_dim() == 3;
1282
 
1283
    float xi1 = my_random(), xi2 = my_random(), xi3 = my_random();
1284
    x1.set(xi1, xi2, xi3);
1285
    success += x1[0] == xi1 && x1[1] == xi2 && x1[2] == xi3;
1286
 
1287
    success += x1.get() == &x1[0];
1288
 
1289
    float temp = BIG;
1290
    for(unsigned int i = 0; i < x1.get_dim(); ++i)
1291
      if(x1[i] < temp)
1292
	temp = x1[i];
1293
    success += temp == x1.min_coord();
1294
 
1295
    temp = -BIG;
1296
    for(unsigned int i = 0; i < x1.get_dim(); ++i)
1297
      if(x1[i] > temp)
1298
	temp = x1[i];
1299
    success += temp == x1.max_coord();
1300
  }
1301
  if(success != 5)
1302
  {
1303
    cout << "Failure in test of Vec3f Data manipulation";
1304
    return 1;
1305
  }
1306
  success = 0;
1307
 
1308
  // Comparison operators
1309
 
1310
  {
1311
    float xi1 = my_random(), xi2 = my_random(), xi3 = my_random();
1312
    while(xi1 >= xi2)
1313
    {
1314
      xi1 = my_random();
1315
      xi2 = my_random();
1316
    }
1317
    while(xi3 <= xi2)
1318
      xi3 = my_random();
1319
 
1320
    Vec3f x1(xi1, xi2, xi3), x2(xi1, xi2, xi3), 
1321
          x3(xi1, xi1, xi1), x4(xi2, xi2, xi2), x5(xi3, xi3, xi3);    
1322
    success += x1 == x2;
1323
    success += !(x1 == x3);
1324
    success += x3 == xi1;
1325
    success += !(x3 == xi2);
1326
    success += x1 != x3;
1327
    success += !(x1 != x2);
1328
    success += x3.all_l(x4);
1329
    success += !(x3.all_l(x2));
1330
    success += x3.all_le(x2);
1331
    success += !(x4.all_le(x2));
1332
    success += x4.all_g(x3);
1333
    success += !(x4.all_g(x2));
1334
    success += x5.all_ge(x2);
1335
    success += !(x4.all_ge(x2));
1336
  }
1337
  if(success != 14)
1338
  {
1339
    cout << "Failure in test of Vec3f Comparison operators";
1340
    return 1;
1341
  }
1342
  success = 0;
1343
 
1344
  // Assignment operators
1345
 
1346
  {
1347
    float xi1 = my_random(), xi2 = my_random(), xi3 = my_random();
1348
    Vec3f x1(xi1, xi2, xi3);
1349
    float xii = my_random();
1350
    x1 *= xii;
1351
    success += abs(x1[0] - xi1*xii) < 1.0e-15 
1352
               && abs(x1[1] - xi2*xii) < 1.0e-15 
1353
               && abs(x1[2] - xi3*xii) < 1.0e-15;
1354
 
1355
    while(xii == 0)
1356
      xii = my_random();
1357
    x1 = Vec3f(xi1, xi2, xi3);
1358
    x1 /= xii;
1359
    success += abs(x1[0] - xi1/xii) < 1.0e-15 
1360
               && abs(x1[1] - xi2/xii) < 1.0e-15 
1361
               && abs(x1[2] - xi3/xii) < 1.0e-15;
1362
 
1363
    x1 = Vec3f(xi1, xi2, xi3);
1364
    x1 += xii;
1365
    success += x1[0] == xi1 + xii && x1[1] == xi2 + xii && x1[2] == xi3 + xii;
1366
 
1367
    x1 = Vec3f(xi1, xi2, xi3);
1368
    x1 -= xii;
1369
    success += x1[0] == xi1 - xii && x1[1] == xi2 - xii && x1[2] == xi3 - xii;
1370
 
1371
    float xii1 = my_random(), xii2 = my_random(), xii3 = my_random();
1372
    Vec3f x2(xii1, xii2, xii3);
1373
    x1 = Vec3f(xi1, xi2, xi3);
1374
    x2 *= x1;
1375
    success += abs(x2[0] - xi1*xii1) < 1.0e-15 
1376
               && abs(x2[1] - xi2*xii2) < 1.0e-15 
1377
               && abs(x2[2] - xi3*xii3) < 1.0e-15;
1378
 
1379
    while(xi1 == 0)
1380
      xi1 = my_random();
1381
    while(xi2 == 0)
1382
      xi2 = my_random();
1383
    while(xi3 == 0)
1384
      xi3 = my_random();
1385
    x1 = Vec3f(xi1, xi2, xi3);
1386
    x2 = Vec3f(xii1, xii2, xii3);
1387
    x2 /= x1;
1388
    success += abs(x2[0] - xii1/xi1) < 1.0e-15 
1389
               && abs(x2[1] - xii2/xi2) < 1.0e-15 
1390
               && abs(x2[2] - xii3/xi3) < 1.0e-15;
1391
 
1392
    x2 = Vec3f(xii1, xii2, xii3);
1393
    x2 += x1;
1394
    success += x2[0] == xii1 + xi1 && x2[1] == xii2 + xi2 && x2[2] == xii3 + xi3;
1395
 
1396
    x2 = Vec3f(xii1, xii2, xii3);
1397
    x2 -= x1;
1398
    success += x2[0] == xii1 - xi1 && x2[1] == xii2 - xi2 && x2[2] == xii3 - xi3;    
1399
  }
1400
  if(success != 8)
1401
  {
1402
    cout << "Failure in test of Vec3f Assignment operators";
1403
    return 1;
1404
  }
1405
  success = 0;
1406
 
1407
  // Unary operators
1408
 
1409
  {
1410
    float xi1 = my_random(), xi2 = my_random(), xi3 = my_random();
1411
    Vec3f x1 = -Vec3f(xi1, xi2, xi3);    
1412
    success += x1[0] == -xi1 && x1[1] == -xi2 && x1[2] == -xi3;
1413
  }
1414
  if(success != 1)
1415
  {
1416
    cout << "Failure in test of Vec3f Unary operators";
1417
    return 1;
1418
  }
1419
  success = 0;
1420
 
1421
  // Binary operators
1422
 
1423
  {
1424
    float xi1 = my_random(), xi2 = my_random(), xi3 = my_random();
1425
    Vec3f x1(xi1, xi2, xi3);
1426
    float xii1 = my_random(), xii2 = my_random(), xii3 = my_random();
1427
    while(xii1 == 0)
1428
      xii1 = my_random();
1429
    while(xii2 == 0)
1430
      xii2 = my_random();
1431
    while(xii3 == 0)
1432
      xii3 = my_random();
1433
    Vec3f x2(xii1, xii2, xii3);
1434
    Vec3f x3 = x1*x2;
1435
    success += abs(x3[0] - xi1*xii1) < 1.0e-15 
1436
               && abs(x3[1] - xi2*xii2) < 1.0e-15 
1437
               && abs(x3[2] - xi3*xii3) < 1.0e-15;
1438
 
1439
    x3 = x1 + x2;
1440
    success += x3[0] == xi1 + xii1 && x3[1] == xi2 + xii2 && x3[2] == xi3 + xii3;
1441
 
1442
    x3 = x1 - x2;
1443
    success += x3[0] == xi1 - xii1 && x3[1] == xi2 - xii2 && x3[2] == xi3 - xii3;
1444
 
1445
    x3 = x1/x2;
1446
    success += abs(x3[0] - xi1/xii1) < 1.0e-15 
1447
               && abs(x3[1] - xi2/xii2) < 1.0e-15 
1448
               && abs(x3[2] - xi3/xii3) < 1.0e-15;
1449
 
1450
    float xii = my_random();
1451
    x3 = x1*xii;
1452
    success += abs(x3[0] - xi1*xii) < 1.0e-15
1453
               && abs(x3[1] - xi2*xii) < 1.0e-15 
1454
               && abs(x3[2] - xi3*xii) < 1.0e-15;
1455
 
1456
    x3 = xii*x1;
1457
    success += abs(x3[0] - xi1*xii) < 1.0e-15 
1458
               && abs(x3[1] - xi2*xii) < 1.0e-15 
1459
               && abs(x3[2] - xi3*xii) < 1.0e-15;
1460
 
417 jrf 1461
    int xi4 = gel_rand();
107 bj 1462
    x3 = xi4*x1;
1463
    success += abs(x3[0] - xi1*xi4) < 1.0e-15 
1464
               && abs(x3[1] - xi2*xi4) < 1.0e-15 
1465
               && abs(x3[2] - xi3*xi4) < 1.0e-15;
1466
 
1467
    x3 = x1*xi4;
1468
    success += abs(x3[0] - xi1*xi4) < 1.0e-15 
1469
               && abs(x3[1] - xi2*xi4) < 1.0e-15 
1470
               && abs(x3[2] - xi3*xi4) < 1.0e-15;
1471
 
1472
    double xi5 = my_random();
1473
    x3 = xi5*x1;
1474
    success += abs(x3[0] - xi1*xi5) < 1.0e-15 
1475
               && abs(x3[1] - xi2*xi5) < 1.0e-15 
1476
               && abs(x3[2] - xi3*xi5) < 1.0e-15;
1477
 
1478
    x3 = x1*xi5;
1479
    success += abs(x3[0] - xi1*xi5) < 1.0e-15 
1480
               && abs(x3[1] - xi2*xi5) < 1.0e-15 
1481
               && abs(x3[2] - xi3*xi5) < 1.0e-15;
1482
 
1483
    while(xii == 0)
1484
      xii = my_random();
1485
    x3 = x1/xii;
1486
    success += abs(x3[0] - xi1/xii) < 1.0e-15 
1487
               && abs(x3[1] - xi2/xii) < 1.0e-15 
1488
               && abs(x3[2] - xi3/xii) < 1.0e-15;
1489
  } 
1490
  if(success != 11)
1491
  {
1492
    cout << "Failure in test of Vec3f Binary operators";
1493
    return 1;
1494
  }
1495
  success = 0;
1496
 
1497
  // Vector operations
1498
 
1499
  {
1500
    float xi1 = my_random(), xi2 = my_random(), xi3 = my_random();
1501
    Vec3f x1(xi1, xi2, xi3);
1502
    float xii1 = my_random(), xii2 = my_random(), xii3 = my_random();
1503
    Vec3f x2(xii1, xii2, xii3);
1504
    float x = dot(x1, x2);
1505
    success += abs(x - xi1*xii1 - xi2*xii2 - xi3*xii3) < 1.0e-15;
1506
 
1507
    x = sqr_length(x1);
1508
    success += abs(x - xi1*xi1 - xi2*xi2 - xi3*xi3) < 1.0e-15;
1509
 
1510
    Vec3f x3 = v_min(x1, x2);
1511
    success += x3[0] == (xi1 < xii1 ? xi1 : xii1) 
1512
               && x3[1] == (xi2 < xii2 ? xi2 : xii2)
1513
               && x3[2] == (xi3 < xii3 ? xi3 : xii3);
1514
 
1515
    x3 = v_max(x1, x2);
1516
    success += x3[0] == (xi1 > xii1 ? xi1 : xii1) 
1517
               && x3[1] == (xi2 > xii2 ? xi2 : xii2)
1518
               && x3[2] == (xi3 > xii3 ? xi3 : xii3);
1519
 
1520
    Vec3f x4;
1521
    orthogonal(x2, x3, x4);
1522
    success += abs(dot(x2, x3)) < 1.0e-15;
1523
 
1524
    x3 = cross(x1, x2);
1525
    success += abs(x3[0] - xi2*xii3 + xi3*xii2) < 1.0e-15
1526
               && abs(x3[1] - xi3*xii1 + xi1*xii3) < 1.0e-15
1527
               && abs(x3[2] - xi1*xii2 + xi2*xii1) < 1.0e-15;
1528
 
1529
    float theta, phi, r;
1530
    x1.get_spherical(theta, phi, r);
1531
    success += abs(theta - acos(xi3/sqrt(xi1*xi1 + xi2*xi2 + xi3*xi3))) < 1.0e-15
1532
               && abs(phi - atan(xi2/xi1)) < 1.0e-15 
1533
               && abs(r - sqrt(xi1*xi1 + xi2*xi2 + xi3*xi3)) < 1.0e-15;
1534
 
1535
    x3.set_spherical(theta, phi, r);
1536
    success += abs(x3[0] - xi1) < 1.0e-15 
1537
               && abs(x3[1] - xi2) < 1.0e-15 
1538
               && abs(x3[2] - xi3) < 1.0e-15;
1539
  }
1540
  if(success != 8)
1541
  {
1542
    cout << "Failure in test of Vec3f Vector operations";
1543
    return 1;
1544
  }
1545
  success = 0;
1546
 
1547
  ////////////////////////////////////////////////
1548
  //                V e c 3 d
1549
  ////////////////////////////////////////////////
1550
 
1551
  // Constructors
1552
 
1553
  {
1554
    Vec3d x1;
1555
    success += CGLA::isnan(x1[0]) && CGLA::isnan(x1[1]) && CGLA::isnan(x1[2]);
1556
 
1557
    double xi1 = my_random(), xi2 = my_random(), xi3 = my_random();
1558
    Vec3d x2(xi1, xi2, xi3);
1559
    success += x2[0] == xi1 && x2[1] == xi2 && x2[2] == xi3;
1560
 
1561
    double xiiii = my_random();
1562
    Vec3d x3(xiiii);
1563
    success += x3[0] == xiiii && x3[1] == xiiii && x3[2] == xiiii;
1564
 
1565
    float xii1 = my_random(), xii2 = my_random(), xii3 = my_random();
1566
    Vec3f f1(xii1, xii2, xii3);
1567
    Vec3d x4(f1);
1568
    success += x4[0] == xii1 && x4[1] == xii2 && x4[2] == xii3;
1569
 
417 jrf 1570
    int xiii1 = gel_rand(), xiii2 = gel_rand(), xiii3 = gel_rand();
107 bj 1571
    Vec3i i1(xiii1, xiii2, xiii3);
1572
    Vec3d x5(i1);
1573
    success += x5[0] == xiii1 && x5[1] == xiii2 && x5[2] == xiii3;
1574
 
306 jrf 1575
 
107 bj 1576
    double xiiii1 = my_random(), xiiii2 = my_random(), xiiii3 = my_random();
306 jrf 1577
    Quatd q(xiiii1, xiiii2, xiiii3, 1.0);
1578
    Vec3d x6 = q.get_imaginary_part();
107 bj 1579
    success += x6[0] == xiiii1 && x6[1] == xiiii2 && x6[2] == xiiii3;
1580
 
1581
    unsigned short int xiiv1 = USHRT_MAX*my_random(),
1582
                       xiiv2 = USHRT_MAX*my_random(),
1583
                       xiiv3 = USHRT_MAX*my_random();
1584
    Vec3usi usi1(xiiv1, xiiv2, xiiv3);
1585
    Vec3d x7(usi1);
1586
    success += x7[0] == xiiv1 && x7[1] == xiiv2 && x7[2] == xiiv3;
306 jrf 1587
 
107 bj 1588
  }
1589
  if(success != 5)
1590
  {
1591
    cout << "Failure in test of Vec3d Constructors";
1592
    return 1;
1593
  }
1594
  success = 0;
1595
 
1596
  // Data manipulation
1597
 
1598
  {
1599
    Vec3d x1;    
1600
 
1601
    success += x1.get_dim() == 3;
1602
 
1603
    double xi1 = my_random(), xi2 = my_random(), xi3 = my_random();
1604
    x1.set(xi1, xi2, xi3);
1605
    success += x1[0] == xi1 && x1[1] == xi2 && x1[2] == xi3;
1606
 
1607
    success += x1.get() == &x1[0];
1608
 
1609
    double temp = BIG;
1610
    for(double i = 0; i < x1.get_dim(); ++i)
1611
      if(x1[i] < temp)
1612
	temp = x1[i];
1613
    success += temp == x1.min_coord();
1614
 
1615
    temp = -BIG;
1616
    for(double i = 0; i < x1.get_dim(); ++i)
1617
      if(x1[i] > temp)
1618
	temp = x1[i];
1619
    success += temp == x1.max_coord();
1620
  }
1621
  if(success != 5)
1622
  {
1623
    cout << "Failure in test of Vec3d Data manipulation";
1624
    return 1;
1625
  }
1626
  success = 0;
1627
 
1628
  // Comparison operators
1629
 
1630
  {
1631
    double xi1 = my_random(), xi2 = my_random(), xi3 = my_random();
1632
    while(xi1 >= xi2)
1633
    {
1634
      xi1 = my_random();
1635
      xi2 = my_random();
1636
    }
1637
    while(xi3 <= xi2)
1638
      xi3 = my_random();
1639
 
1640
    Vec3d x1(xi1, xi2, xi3), x2(xi1, xi2, xi3), 
1641
          x3(xi1, xi1, xi1), x4(xi2, xi2, xi2), x5(xi3, xi3, xi3);    
1642
    success += x1 == x2;
1643
    success += !(x1 == x3);
1644
    success += x3 == xi1;
1645
    success += !(x3 == xi2);
1646
    success += x1 != x3;
1647
    success += !(x1 != x2);
1648
    success += x3.all_l(x4);
1649
    success += !(x3.all_l(x2));
1650
    success += x3.all_le(x2);
1651
    success += !(x4.all_le(x2));
1652
    success += x4.all_g(x3);
1653
    success += !(x4.all_g(x2));
1654
    success += x5.all_ge(x2);
1655
    success += !(x4.all_ge(x2));
1656
  }
1657
  if(success != 14)
1658
  {
1659
    cout << "Failure in test of Vec3d Comparison operators";
1660
    return 1;
1661
  }
1662
  success = 0;
1663
 
1664
  // Assignment operators
1665
 
1666
  {
1667
    double xi1 = my_random(), xi2 = my_random(), xi3 = my_random();
1668
    Vec3d x1(xi1, xi2, xi3);
1669
    double xii = my_random();
1670
    x1 *= xii;
1671
    success += abs(x1[0] - xi1*xii) < 1.0e-15 
1672
               && abs(x1[1] - xi2*xii) < 1.0e-15 
1673
               && abs(x1[2] - xi3*xii) < 1.0e-15;
1674
 
1675
    while(xii == 0)
1676
      xii = my_random();
1677
    x1 = Vec3d(xi1, xi2, xi3);
1678
    x1 /= xii;
1679
    success += abs(x1[0] - xi1/xii) < 1.0e-15 
1680
               && abs(x1[1] - xi2/xii) < 1.0e-15 
1681
               && abs(x1[2] - xi3/xii) < 1.0e-15;
1682
 
1683
    x1 = Vec3d(xi1, xi2, xi3);
1684
    x1 += xii;
1685
    success += x1[0] == xi1 + xii && x1[1] == xi2 + xii && x1[2] == xi3 + xii;
1686
 
1687
    x1 = Vec3d(xi1, xi2, xi3);
1688
    x1 -= xii;
1689
    success += x1[0] == xi1 - xii && x1[1] == xi2 - xii && x1[2] == xi3 - xii;
1690
 
1691
    double xii1 = my_random(), xii2 = my_random(), xii3 = my_random();
1692
    Vec3d x2(xii1, xii2, xii3);
1693
    x1 = Vec3d(xi1, xi2, xi3);
1694
    x2 *= x1;
1695
    success += abs(x2[0] - xi1*xii1) < 1.0e-15 
1696
               && abs(x2[1] - xi2*xii2) < 1.0e-15 
1697
               && abs(x2[2] - xi3*xii3) < 1.0e-15;
1698
 
1699
    while(xi1 == 0)
1700
      xi1 = my_random();
1701
    while(xi2 == 0)
1702
      xi2 = my_random();
1703
    while(xi3 == 0)
1704
      xi3 = my_random();
1705
    x1 = Vec3d(xi1, xi2, xi3);
1706
    x2 = Vec3d(xii1, xii2, xii3);
1707
    x2 /= x1;
1708
    success += abs(x2[0] - xii1/xi1) < 1.0e-15 
1709
               && abs(x2[1] - xii2/xi2) < 1.0e-15 
1710
               && abs(x2[2] - xii3/xi3) < 1.0e-15;
1711
 
1712
    x2 = Vec3d(xii1, xii2, xii3);
1713
    x2 += x1;
1714
    success += x2[0] == xii1 + xi1 && x2[1] == xii2 + xi2 && x2[2] == xii3 + xi3;
1715
 
1716
    x2 = Vec3d(xii1, xii2, xii3);
1717
    x2 -= x1;
1718
    success += x2[0] == xii1 - xi1 && x2[1] == xii2 - xi2 && x2[2] == xii3 - xi3;    
1719
  }
1720
  if(success != 8)
1721
  {
1722
    cout << "Failure in test of Vec3d Assignment operators";
1723
    return 1;
1724
  }
1725
  success = 0;
1726
 
1727
  // Unary operators
1728
 
1729
  {
1730
    double xi1 = my_random(), xi2 = my_random(), xi3 = my_random();
1731
    Vec3d x1 = -Vec3d(xi1, xi2, xi3);    
1732
    success += x1[0] == -xi1 && x1[1] == -xi2 && x1[2] == -xi3;
1733
  }
1734
  if(success != 1)
1735
  {
1736
    cout << "Failure in test of Vec3d Unary operators";
1737
    return 1;
1738
  }
1739
  success = 0;
1740
 
1741
  // Binary operators
1742
 
1743
  {
1744
    double xi1 = my_random(), xi2 = my_random(), xi3 = my_random();
1745
    Vec3d x1(xi1, xi2, xi3);
1746
    double xii1 = my_random(), xii2 = my_random(), xii3 = my_random();
1747
    while(xii1 == 0)
1748
      xii1 = my_random();
1749
    while(xii2 == 0)
1750
      xii2 = my_random();
1751
    while(xii3 == 0)
1752
      xii3 = my_random();
1753
    Vec3d x2(xii1, xii2, xii3);
1754
    Vec3d x3 = x1*x2;
1755
    success += abs(x3[0] - xi1*xii1) < 1.0e-15 
1756
               && abs(x3[1] - xi2*xii2) < 1.0e-15 
1757
               && abs(x3[2] - xi3*xii3) < 1.0e-15;
1758
 
1759
    x3 = x1 + x2;
1760
    success += x3[0] == xi1 + xii1 && x3[1] == xi2 + xii2 && x3[2] == xi3 + xii3;
1761
 
1762
    x3 = x1 - x2;
1763
    success += x3[0] == xi1 - xii1 && x3[1] == xi2 - xii2 && x3[2] == xi3 - xii3;
1764
 
1765
    x3 = x1/x2;
1766
    success += abs(x3[0] - xi1/xii1) < 1.0e-15 
1767
               && abs(x3[1] - xi2/xii2) < 1.0e-15 
1768
               && abs(x3[2] - xi3/xii3) < 1.0e-15;
1769
 
1770
    double xii = my_random();
1771
    x3 = x1*xii;
1772
    success += abs(x3[0] - xi1*xii) < 1.0e-15
1773
               && abs(x3[1] - xi2*xii) < 1.0e-15 
1774
               && abs(x3[2] - xi3*xii) < 1.0e-15;
1775
 
1776
    x3 = xii*x1;
1777
    success += abs(x3[0] - xi1*xii) < 1.0e-15 
1778
               && abs(x3[1] - xi2*xii) < 1.0e-15 
1779
               && abs(x3[2] - xi3*xii) < 1.0e-15;
1780
 
417 jrf 1781
    int xi4 = gel_rand();
107 bj 1782
    x3 = xi4*x1;
1783
    success += abs(x3[0] - xi1*xi4) < 1.0e-15 
1784
               && abs(x3[1] - xi2*xi4) < 1.0e-15 
1785
               && abs(x3[2] - xi3*xi4) < 1.0e-15;
1786
 
1787
    x3 = x1*xi4;
1788
    success += abs(x3[0] - xi1*xi4) < 1.0e-15 
1789
               && abs(x3[1] - xi2*xi4) < 1.0e-15 
1790
               && abs(x3[2] - xi3*xi4) < 1.0e-15;
1791
 
1792
    float xi5 = my_random();
1793
    x3 = xi5*x1;
1794
    success += abs(x3[0] - xi1*xi5) < 1.0e-15 
1795
               && abs(x3[1] - xi2*xi5) < 1.0e-15 
1796
               && abs(x3[2] - xi3*xi5) < 1.0e-15;
1797
 
1798
    x3 = x1*xi5;
1799
    success += abs(x3[0] - xi1*xi5) < 1.0e-15 
1800
               && abs(x3[1] - xi2*xi5) < 1.0e-15 
1801
               && abs(x3[2] - xi3*xi5) < 1.0e-15;
1802
 
1803
    while(xii == 0)
1804
      xii = my_random();
1805
    x3 = x1/xii;
1806
    success += abs(x3[0] - xi1/xii) < 1.0e-15 
1807
               && abs(x3[1] - xi2/xii) < 1.0e-15 
1808
               && abs(x3[2] - xi3/xii) < 1.0e-15;
1809
  } 
1810
  if(success != 11)
1811
  {
1812
    cout << "Failure in test of Vec3d Binary operators";
1813
    return 1;
1814
  }
1815
  success = 0;
1816
 
1817
  // Vector operations
1818
 
1819
  {
1820
    double xi1 = my_random(), xi2 = my_random(), xi3 = my_random();
1821
    Vec3d x1(xi1, xi2, xi3);
1822
    double xii1 = my_random(), xii2 = my_random(), xii3 = my_random();
1823
    Vec3d x2(xii1, xii2, xii3);
1824
    double x = dot(x1, x2);
1825
    success += abs(x - xi1*xii1 - xi2*xii2 - xi3*xii3) < 1.0e-15;
1826
 
1827
    x = sqr_length(x1);
1828
    success += abs(x - xi1*xi1 - xi2*xi2 - xi3*xi3) < 1.0e-15;
1829
 
1830
    Vec3d x3 = v_min(x1, x2);
1831
    success += x3[0] == (xi1 < xii1 ? xi1 : xii1) 
1832
               && x3[1] == (xi2 < xii2 ? xi2 : xii2)
1833
               && x3[2] == (xi3 < xii3 ? xi3 : xii3);
1834
 
1835
    x3 = v_max(x1, x2);
1836
    success += x3[0] == (xi1 > xii1 ? xi1 : xii1) 
1837
               && x3[1] == (xi2 > xii2 ? xi2 : xii2)
1838
               && x3[2] == (xi3 > xii3 ? xi3 : xii3);
1839
 
1840
    Vec3d x4;
1841
    orthogonal(x2, x3, x4);
1842
    success += abs(dot(x2, x3)) < 1.0e-15;
1843
 
1844
    x3 = cross(x1, x2);
1845
    success += abs(x3[0] - xi2*xii3 + xi3*xii2) < 1.0e-15
1846
               && abs(x3[1] - xi3*xii1 + xi1*xii3) < 1.0e-15
1847
               && abs(x3[2] - xi1*xii2 + xi2*xii1) < 1.0e-15;
1848
 
1849
    double theta, phi, r;
1850
    x1.get_spherical(theta, phi, r);
1851
    success += abs(theta - acos(xi3/sqrt(xi1*xi1 + xi2*xi2 + xi3*xi3))) < 1.0e-15
1852
               && abs(phi - atan(xi2/xi1)) < 1.0e-15 
1853
               && abs(r - sqrt(xi1*xi1 + xi2*xi2 + xi3*xi3)) < 1.0e-15;
1854
 
1855
    x3.set_spherical(theta, phi, r);
1856
    success += abs(x3[0] - xi1) < 1.0e-15 
1857
               && abs(x3[1] - xi2) < 1.0e-15 
1858
               && abs(x3[2] - xi3) < 1.0e-15;
1859
  }
1860
  if(success != 8)
1861
  {
1862
    cout << "Failure in test of Vec3d Vector operations";
1863
    return 1;
1864
  }
1865
  success = 0;
1866
 
1867
  ////////////////////////////////////////////////
1868
  //              F I N A L I Z E
1869
  ////////////////////////////////////////////////
1870
 
1871
  cout << "Performance time: " << t.get_secs();
1872
  cout << endl << "ArithVec and derived vector classes have been tested successfully";
1873
 
1874
  return 0;
1875
}