Subversion Repositories gelsvn

Rev

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