Subversion Repositories gelsvn

Rev

Details | Last modification | View Log | RSS feed

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