Subversion Repositories gelsvn

Rev

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