HologramDepthmap Library
vec.h
Go to the documentation of this file.
1 #ifndef __vec_h
2 #define __vec_h
3 // Description:
4 // Mathematical tools to handle n-dimensional vectors
5 //
6 // Author:
7 // Myung-Joon Kim
8 // Dae-Hyun Kim
9 
10 
11 #include "graphics/real.h"
12 #include "graphics/ivec.h"
13 #include "graphics/epsilon.h"
14 #include <math.h>
15 #include <stdio.h>
16 
17 namespace graphics {
18 
22 struct vec2 {
23  real v[2];
24  static const int n;
25 
26  inline vec2() { }
27  inline vec2(real a)
28  {
29  v[1 - 1] = a; v[2 - 1] = a;
30  }
31 
32  inline vec2(real v_1 , real v_2 )
33  {
34  v[1 - 1] = v_1; v[2 - 1] = v_2;
35  }
36 
37  inline vec2(const ivec2& a)
38  {
39  v[1 - 1] = a[1 - 1]; v[2 - 1] = a[2 - 1];
40  }
41 
42  inline vec2(const vec2& a)
43  {
44  v[1 - 1] = a[1 - 1]; v[2 - 1] = a[2 - 1];
45  }
46 
47  inline vec2& operator=(const vec2& a)
48  {
49  v[1 - 1] = a[1 - 1]; v[2 - 1] = a[2 - 1];
50  return *this;
51  }
52 
53  inline real& operator[] (int i) { return v[i]; }
54  inline const real& operator[] (int i) const { return v[i]; }
55  inline real& operator() (int i) { return v[i % 2]; }
56  inline const real& operator() (int i) const { return v[i % 2]; }
57 
58  bool unit();
59  real length() const;
60 
61  inline bool is_zero() const { return (v[0] == 0.0 && v[1] == 0.0); }
62  inline bool is_tiny(real tiny_tol = epsilon) const {
63  return (fabs(v[0]) <= tiny_tol && fabs(v[1]) <= tiny_tol);
64  }
65 
66  //
67  // returns 1: this and other vectors are parallel
68  // -1: this and other vectors are anti-parallel
69  // 0: this and other vectors are not parallel
70  // or at least one of the vectors is zero
71  int is_parallel(
72  const vec2&, // other vector
73  real = angle_tolerance // optional angle tolerance (radians)
74  ) const;
75 
76 
77  // returns true: this and other vectors are perpendicular
78  // false: this and other vectors are not perpendicular
79  // or at least one of the vectors is zero
80  bool is_perpendicular(
81  const vec2&, // other vector
82  real = angle_tolerance // optional angle tolerance (radians)
83  ) const;
84 
85  //
86  // set this vector to be perpendicular to another vector
87  bool perpendicular( // Result is not unitized.
88  // returns false if input vector is zero
89  const vec2&
90  );
91 
92  //
93  // set this vector to be perpendicular to a line defined by 2 points
94  bool perpendicular(
95  const vec2&,
96  const vec2&
97  );
98 };
99 
100 
101 
102 
103 
104 //| binary op : componentwise
105 
106 
107 inline vec2 operator + (const vec2& a, const vec2& b)
108 {
109  vec2 c;
110  for(int i = 0; i < 2;++i) { c[i] = a[i] + b[i]; }
111  return c;
112 }
113 
114 inline vec2 operator + (real a, const vec2& b)
115 {
116  vec2 c;
117  for(int i = 0; i < 2;++i) { c[i] = a + b[i]; }
118  return c;
119 }
120 
121 inline vec2 operator + (const vec2& a, real b)
122 {
123  vec2 c;
124  for(int i = 0; i < 2;++i) { c[i] = a[i] + b; }
125  return c;
126 }
127 
128 
129 
130 inline vec2 operator - (const vec2& a, const vec2& b)
131 {
132  vec2 c;
133  for(int i = 0; i < 2;++i) { c[i] = a[i] - b[i]; }
134  return c;
135 }
136 
137 inline vec2 operator - (real a, const vec2& b)
138 {
139  vec2 c;
140  for(int i = 0; i < 2;++i) { c[i] = a - b[i]; }
141  return c;
142 }
143 
144 inline vec2 operator - (const vec2& a, real b)
145 {
146  vec2 c;
147  for(int i = 0; i < 2;++i) { c[i] = a[i] - b; }
148  return c;
149 }
150 
151 
152 
153 inline vec2 operator * (const vec2& a, const vec2& b)
154 {
155  vec2 c;
156  for(int i = 0; i < 2;++i) { c[i] = a[i] * b[i]; }
157  return c;
158 }
159 
160 inline vec2 operator * (real a, const vec2& b)
161 {
162  vec2 c;
163  for(int i = 0; i < 2;++i) { c[i] = a * b[i]; }
164  return c;
165 }
166 
167 inline vec2 operator * (const vec2& a, real b)
168 {
169  vec2 c;
170  for(int i = 0; i < 2;++i) { c[i] = a[i] * b; }
171  return c;
172 }
173 
174 
175 
176 inline vec2 operator / (const vec2& a, const vec2& b)
177 {
178  vec2 c;
179  for(int i = 0; i < 2;++i) { c[i] = a[i] / b[i]; }
180  return c;
181 }
182 
183 inline vec2 operator / (real a, const vec2& b)
184 {
185  vec2 c;
186  for(int i = 0; i < 2;++i) { c[i] = a / b[i]; }
187  return c;
188 }
189 
190 inline vec2 operator / (const vec2& a, real b)
191 {
192  vec2 c;
193  for(int i = 0; i < 2;++i) { c[i] = a[i] / b; }
194  return c;
195 }
196 
197 
198 
199 //| cumulative op : componentwise
200 
201 
202 inline vec2 operator += (vec2& a, const vec2& b)
203 {
204  return a = (a + b);
205 }
206 
207 inline vec2 operator += (vec2& a, real b)
208 {
209  return a = (a + b);
210 }
211 
212 
213 
214 inline vec2 operator -= (vec2& a, const vec2& b)
215 {
216  return a = (a - b);
217 }
218 
219 inline vec2 operator -= (vec2& a, real b)
220 {
221  return a = (a - b);
222 }
223 
224 
225 
226 inline vec2 operator *= (vec2& a, const vec2& b)
227 {
228  return a = (a * b);
229 }
230 
231 inline vec2 operator *= (vec2& a, real b)
232 {
233  return a = (a * b);
234 }
235 
236 
237 
238 inline vec2 operator /= (vec2& a, const vec2& b)
239 {
240  return a = (a / b);
241 }
242 
243 inline vec2 operator /= (vec2& a, real b)
244 {
245  return a = (a / b);
246 }
247 
248 
249 
250 //| logical op : componentwise
251 
252 
253 inline int operator == (const vec2& a, const vec2& b)
254 {
255  int c = 1;
256  for(int i = 0; i < 2;++i) { c = c && a[i] == b[i]; }
257  return c;
258 }
259 
260 inline int operator == (real a, const vec2& b)
261 {
262  int c = 1;
263  for(int i = 0; i < 2;++i) { c = c && a == b[i]; }
264  return c;
265 }
266 
267 inline int operator == (const vec2& a, real b)
268 {
269  int c = 1;
270  for(int i = 0; i < 2;++i) { c = c && a[i] == b; }
271  return c;
272 }
273 
274 
275 
276 inline int operator < (const vec2& a, const vec2& b)
277 {
278  int c = 1;
279  for(int i = 0; i < 2;++i) { c = c && a[i] < b[i]; }
280  return c;
281 }
282 
283 inline int operator < (real a, const vec2& b)
284 {
285  int c = 1;
286  for(int i = 0; i < 2;++i) { c = c && a < b[i]; }
287  return c;
288 }
289 
290 inline int operator < (const vec2& a, real b)
291 {
292  int c = 1;
293  for(int i = 0; i < 2;++i) { c = c && a[i] < b; }
294  return c;
295 }
296 
297 
298 
299 inline int operator <= (const vec2& a, const vec2& b)
300 {
301  int c = 1;
302  for(int i = 0; i < 2;++i) { c = c && a[i] <= b[i]; }
303  return c;
304 }
305 
306 inline int operator <= (real a, const vec2& b)
307 {
308  int c = 1;
309  for(int i = 0; i < 2;++i) { c = c && a <= b[i]; }
310  return c;
311 }
312 
313 inline int operator <= (const vec2& a, real b)
314 {
315  int c = 1;
316  for(int i = 0; i < 2;++i) { c = c && a[i] <= b; }
317  return c;
318 }
319 
320 
321 
322 inline int operator > (const vec2& a, const vec2& b)
323 {
324  int c = 1;
325  for(int i = 0; i < 2;++i) { c = c && a[i] > b[i]; }
326  return c;
327 }
328 
329 inline int operator > (real a, const vec2& b)
330 {
331  int c = 1;
332  for(int i = 0; i < 2;++i) { c = c && a > b[i]; }
333  return c;
334 }
335 
336 inline int operator > (const vec2& a, real b)
337 {
338  int c = 1;
339  for(int i = 0; i < 2;++i) { c = c && a[i] > b; }
340  return c;
341 }
342 
343 
344 
345 inline int operator >= (const vec2& a, const vec2& b)
346 {
347  int c = 1;
348  for(int i = 0; i < 2;++i) { c = c && a[i] >= b[i]; }
349  return c;
350 }
351 
352 inline int operator >= (real a, const vec2& b)
353 {
354  int c = 1;
355  for(int i = 0; i < 2;++i) { c = c && a >= b[i]; }
356  return c;
357 }
358 
359 inline int operator >= (const vec2& a, real b)
360 {
361  int c = 1;
362  for(int i = 0; i < 2;++i) { c = c && a[i] >= b; }
363  return c;
364 }
365 
366 
367 
368 //| unary op : componentwise
369 inline vec2 operator - (const vec2& a)
370 {
371  vec2 c;
372  for(int i = 0; i < 2;++i) { c[i] = - a[i]; }
373  return c;
374 }
375 
376 //| R^n -> R
377 inline real sum(const vec2& a)
378 {
379  real s = 0;
380 
381  s += a[1 - 1];
382 
383  s += a[2 - 1];
384 
385  return s;
386 }
387 
388 inline real inner(const vec2& a, const vec2& b)
389 {
390  vec2 tmp = a * b;
391  return sum(tmp);
392 }
393 
394 inline real norm(const vec2& a)
395 {
396  return sqrt(inner(a, a));
397 }
398 
399 inline real squaredNorm(const vec2& a) {
400  return inner(a, a);
401 }
402 
403 inline vec2 unit(const vec2& a)
404 {
405  real n = norm(a);
406  if(n < epsilon)
407  return 0;
408  else
409  return a / n;
410 }
411 
412 inline real angle(const vec2& a, const vec2& b)
413 {
414  real ang = inner(unit(a), unit(b));
415  if(ang > 1 - epsilon)
416  return 0;
417  else if(ang < -1 + epsilon)
418  return M_PI;
419  else
420  return acos(ang);
421 }
422 
423 inline vec2 proj(const vec2& axis, const vec2& a)
424 {
425  vec2 u = unit(axis);
426  return inner(a, u) * u;
427 }
428 
429 inline vec2 absolute(const vec2& val)
430 {
431  return vec2(fabs(val[0]), fabs(val[1]));
432 }
433 
434 void store(FILE* fp, const vec2& v);
435 
436 int scan(FILE* fp, const vec2& v);
437 
438 int apx_equal(const vec2& a, const vec2& b);
439 int apx_equal(const vec2& a, const vec2& b, real eps);
440 
444 struct vec3 {
445  real v[3];
446  static const int n;
447 
448  inline vec3() { }
449  inline vec3(real a)
450  {
451  v[1 - 1] = a; v[2 - 1] = a; v[3 - 1] = a;
452  }
453 
454  inline vec3(real v_1 , real v_2 , real v_3 )
455  {
456  v[1 - 1] = v_1; v[2 - 1] = v_2; v[3 - 1] = v_3;
457  }
458 
459  inline vec3(const ivec3& a)
460  {
461  v[1 - 1] = a[1 - 1]; v[2 - 1] = a[2 - 1]; v[3 - 1] = a[3 - 1];
462  }
463 
464  inline vec3(const vec3& a)
465  {
466  v[1 - 1] = a[1 - 1]; v[2 - 1] = a[2 - 1]; v[3 - 1] = a[3 - 1];
467  }
468 
469  inline vec3& operator=(const vec3& a)
470  {
471  v[1 - 1] = a[1 - 1]; v[2 - 1] = a[2 - 1]; v[3 - 1] = a[3 - 1];
472  return *this;
473  }
474 
475  inline real& operator[] (int i) { return v[i]; }
476  inline const real& operator[] (int i) const { return v[i]; }
477  inline real& operator() (int i) { return v[i % 3]; }
478  inline const real& operator() (int i) const { return v[i % 3]; }
479 
480  inline bool is_zero() const { return (v[0] == 0.0 && v[1] == 0.0 && v[2] == 0.0); }
481  inline bool is_tiny(real tiny_tol = epsilon) const {
482  return (fabs(v[0]) <= tiny_tol && fabs(v[1]) <= tiny_tol && fabs(v[2]) <= tiny_tol );
483  }
484 
485  bool unit();
486  real length() const;
487 
488 
489  //
490  // returns 1: this and other vectors are parallel
491  // -1: this and other vectors are anti-parallel
492  // 0: this and other vectors are not parallel
493  // or at least one of the vectors is zero
494  int is_parallel(
495  const vec3&, // other vector
496  real = angle_tolerance // optional angle tolerance (radians)
497  ) const;
498 
499  //
500  // returns true: this and other vectors are perpendicular
501  // false: this and other vectors are not perpendicular
502  // or at least one of the vectors is zero
503  bool is_perpendicular(
504  const vec3&, // other vector
505  real = angle_tolerance // optional angle tolerance (radians)
506  ) const;
507 
508  //
509  // set this vector to be perpendicular to another vector
510  bool perpendicular( // Result is not unitized.
511  // returns false if input vector is zero
512  const vec3&
513  );
514 
515  //
516  // set this vector to be perpendicular to a plane defined by 3 points
517  // returns false if points are coincident or colinear
518  bool perpendicular(
519  const vec3&, const vec3&, const vec3&
520  );
521 };
522 
523 //| binary op : componentwise
524 
525 
526 inline vec3 operator + (const vec3& a, const vec3& b)
527 {
528  vec3 c;
529  for(int i = 0; i < 3;++i) { c[i] = a[i] + b[i]; }
530  return c;
531 }
532 
533 inline vec3 operator + (real a, const vec3& b)
534 {
535  vec3 c;
536  for(int i = 0; i < 3;++i) { c[i] = a + b[i]; }
537  return c;
538 }
539 
540 inline vec3 operator + (const vec3& a, real b)
541 {
542  vec3 c;
543  for(int i = 0; i < 3;++i) { c[i] = a[i] + b; }
544  return c;
545 }
546 
547 
548 
549 inline vec3 operator - (const vec3& a, const vec3& b)
550 {
551  vec3 c;
552  for(int i = 0; i < 3;++i) { c[i] = a[i] - b[i]; }
553  return c;
554 }
555 
556 inline vec3 operator - (real a, const vec3& b)
557 {
558  vec3 c;
559  for(int i = 0; i < 3;++i) { c[i] = a - b[i]; }
560  return c;
561 }
562 
563 inline vec3 operator - (const vec3& a, real b)
564 {
565  vec3 c;
566  for(int i = 0; i < 3;++i) { c[i] = a[i] - b; }
567  return c;
568 }
569 
570 
571 
572 inline vec3 operator * (const vec3& a, const vec3& b)
573 {
574  vec3 c;
575  for(int i = 0; i < 3;++i) { c[i] = a[i] * b[i]; }
576  return c;
577 }
578 
579 inline vec3 operator * (real a, const vec3& b)
580 {
581  vec3 c;
582  for(int i = 0; i < 3;++i) { c[i] = a * b[i]; }
583  return c;
584 }
585 
586 inline vec3 operator * (const vec3& a, real b)
587 {
588  vec3 c;
589  for(int i = 0; i < 3;++i) { c[i] = a[i] * b; }
590  return c;
591 }
592 
593 
594 
595 inline vec3 operator / (const vec3& a, const vec3& b)
596 {
597  vec3 c;
598  for(int i = 0; i < 3;++i) { c[i] = a[i] / b[i]; }
599  return c;
600 }
601 
602 inline vec3 operator / (real a, const vec3& b)
603 {
604  vec3 c;
605  for(int i = 0; i < 3;++i) { c[i] = a / b[i]; }
606  return c;
607 }
608 
609 inline vec3 operator / (const vec3& a, real b)
610 {
611  vec3 c;
612  for(int i = 0; i < 3;++i) { c[i] = a[i] / b; }
613  return c;
614 }
615 
616 //| cumulative op : componentwise
617 
618 
619 inline vec3 operator += (vec3& a, const vec3& b)
620 {
621  return a = (a + b);
622 }
623 
624 inline vec3 operator += (vec3& a, real b)
625 {
626  return a = (a + b);
627 }
628 
629 
630 
631 inline vec3 operator -= (vec3& a, const vec3& b)
632 {
633  return a = (a - b);
634 }
635 
636 inline vec3 operator -= (vec3& a, real b)
637 {
638  return a = (a - b);
639 }
640 
641 
642 
643 inline vec3 operator *= (vec3& a, const vec3& b)
644 {
645  return a = (a * b);
646 }
647 
648 inline vec3 operator *= (vec3& a, real b)
649 {
650  return a = (a * b);
651 }
652 
653 
654 
655 inline vec3 operator /= (vec3& a, const vec3& b)
656 {
657  return a = (a / b);
658 }
659 
660 inline vec3 operator /= (vec3& a, real b)
661 {
662  return a = (a / b);
663 }
664 
665 
666 
667 //| logical op : componentwise
668 
669 
670 inline int operator == (const vec3& a, const vec3& b)
671 {
672  int c = 1;
673  for(int i = 0; i < 3;++i) { c = c && a[i] == b[i]; }
674  return c;
675 }
676 
677 inline int operator == (real a, const vec3& b)
678 {
679  int c = 1;
680  for(int i = 0; i < 3;++i) { c = c && a == b[i]; }
681  return c;
682 }
683 
684 inline int operator == (const vec3& a, real b)
685 {
686  int c = 1;
687  for(int i = 0; i < 3;++i) { c = c && a[i] == b; }
688  return c;
689 }
690 
691 
692 
693 inline int operator < (const vec3& a, const vec3& b)
694 {
695  int c = 1;
696  for(int i = 0; i < 3;++i) { c = c && a[i] < b[i]; }
697  return c;
698 }
699 
700 inline int operator < (real a, const vec3& b)
701 {
702  int c = 1;
703  for(int i = 0; i < 3;++i) { c = c && a < b[i]; }
704  return c;
705 }
706 
707 inline int operator < (const vec3& a, real b)
708 {
709  int c = 1;
710  for(int i = 0; i < 3;++i) { c = c && a[i] < b; }
711  return c;
712 }
713 
714 
715 
716 inline int operator <= (const vec3& a, const vec3& b)
717 {
718  int c = 1;
719  for(int i = 0; i < 3;++i) { c = c && a[i] <= b[i]; }
720  return c;
721 }
722 
723 inline int operator <= (real a, const vec3& b)
724 {
725  int c = 1;
726  for(int i = 0; i < 3;++i) { c = c && a <= b[i]; }
727  return c;
728 }
729 
730 inline int operator <= (const vec3& a, real b)
731 {
732  int c = 1;
733  for(int i = 0; i < 3;++i) { c = c && a[i] <= b; }
734  return c;
735 }
736 
737 
738 
739 inline int operator > (const vec3& a, const vec3& b)
740 {
741  int c = 1;
742  for(int i = 0; i < 3;++i) { c = c && a[i] > b[i]; }
743  return c;
744 }
745 
746 inline int operator > (real a, const vec3& b)
747 {
748  int c = 1;
749  for(int i = 0; i < 3;++i) { c = c && a > b[i]; }
750  return c;
751 }
752 
753 inline int operator > (const vec3& a, real b)
754 {
755  int c = 1;
756  for(int i = 0; i < 3;++i) { c = c && a[i] > b; }
757  return c;
758 }
759 
760 
761 
762 inline int operator >= (const vec3& a, const vec3& b)
763 {
764  int c = 1;
765  for(int i = 0; i < 3;++i) { c = c && a[i] >= b[i]; }
766  return c;
767 }
768 
769 inline int operator >= (real a, const vec3& b)
770 {
771  int c = 1;
772  for(int i = 0; i < 3;++i) { c = c && a >= b[i]; }
773  return c;
774 }
775 
776 inline int operator >= (const vec3& a, real b)
777 {
778  int c = 1;
779  for(int i = 0; i < 3;++i) { c = c && a[i] >= b; }
780  return c;
781 }
782 
783 
784 
785 //| unary op : componentwise
786 inline vec3 operator - (const vec3& a)
787 {
788  vec3 c;
789  for(int i = 0; i < 3;++i) { c[i] = - a[i]; }
790  return c;
791 }
792 
793 inline vec3 absolute(const vec3& val)
794 {
795  return vec3(fabs(val[0]), fabs(val[1]), fabs(val[2]));
796 }
797 
798 
799 
800 //| R^n -> R
801 inline real sum(const vec3& a)
802 {
803  real s = 0;
804 
805  s += a[1 - 1];
806 
807  s += a[2 - 1];
808 
809  s += a[3 - 1];
810 
811  return s;
812 }
813 
814 inline real inner(const vec3& a, const vec3& b)
815 {
816  vec3 tmp = a * b;
817  return sum(tmp);
818 }
819 
820 inline real squaredNorm(const vec3& a) {
821  return inner(a, a);
822 }
823 
824 inline real norm(const vec3& a)
825 {
826  return sqrt(inner(a, a));
827 }
828 
829 inline vec3 unit(const vec3& a)
830 {
831  real n = norm(a);
832  if(n < zero_epsilon)
833  return 0;
834  else
835  return a / n;
836 }
837 
838 inline real angle(const vec3& a, const vec3& b)
839 {
840  real ang = inner(unit(a), unit(b));
841  if(ang > 1 - epsilon)
842  return 0;
843  else if(ang < -1 + epsilon)
844  return M_PI;
845  else
846  return acos(ang);
847 }
848 
849 inline vec3 proj(const vec3& axis, const vec3& a)
850 {
851  vec3 u = unit(axis);
852  return inner(a, u) * u;
853 }
854 
855 void store(FILE* fp, const vec3& v);
856 int scan(FILE* fp, const vec3& v);
857 
858 int apx_equal(const vec3& a, const vec3& b);
859 int apx_equal(const vec3& a, const vec3& b, real eps);
860 
864 struct vec4 {
865  real v[4];
866  static const int n;
867 
868  inline vec4() { }
869  inline vec4(real a)
870  {
871  v[1 - 1] = a; v[2 - 1] = a; v[3 - 1] = a; v[4 - 1] = a;
872  }
873 
874  inline vec4(real v_1 , real v_2 , real v_3 , real v_4 )
875  {
876  v[1 - 1] = v_1; v[2 - 1] = v_2; v[3 - 1] = v_3; v[4 - 1] = v_4;
877  }
878 
879  inline vec4(const ivec4& a)
880  {
881  v[1 - 1] = a[1 - 1]; v[2 - 1] = a[2 - 1]; v[3 - 1] = a[3 - 1]; v[4 - 1] = a[4 - 1];
882  }
883 
884  inline vec4(const vec4& a)
885  {
886  v[1 - 1] = a[1 - 1]; v[2 - 1] = a[2 - 1]; v[3 - 1] = a[3 - 1]; v[4 - 1] = a[4 - 1];
887  }
888 
889  inline vec4& operator=(const vec4& a)
890  {
891  v[1 - 1] = a[1 - 1]; v[2 - 1] = a[2 - 1]; v[3 - 1] = a[3 - 1]; v[4 - 1] = a[4 - 1];
892  return *this;
893  }
894 
895  inline real& operator[] (int i) { return v[i]; }
896  inline const real& operator[] (int i) const { return v[i]; }
897  inline real& operator() (int i) { return v[i % 4]; }
898  inline const real& operator() (int i) const { return v[i % 4]; }
899 
900  inline bool is_zero() const { return (v[0] == 0.0 && v[1] == 0.0 && v[2] == 0.0 && v[3] == 0.0); }
901  inline bool is_tiny(real tiny_tol = epsilon) const {
902  return (fabs(v[0]) <= tiny_tol && fabs(v[1]) <= tiny_tol && fabs(v[2]) <= tiny_tol && fabs(v[3]) <= tiny_tol);
903  }
904 
905  bool unit();
906  real length() const;
907 };
908 
909 
910 
911 
912 
913 //| binary op : componentwise
914 
915 
916 inline vec4 operator + (const vec4& a, const vec4& b)
917 {
918  vec4 c;
919  for(int i = 0; i < 4;++i) { c[i] = a[i] + b[i]; }
920  return c;
921 }
922 
923 inline vec4 operator + (real a, const vec4& b)
924 {
925  vec4 c;
926  for(int i = 0; i < 4;++i) { c[i] = a + b[i]; }
927  return c;
928 }
929 
930 inline vec4 operator + (const vec4& a, real b)
931 {
932  vec4 c;
933  for(int i = 0; i < 4;++i) { c[i] = a[i] + b; }
934  return c;
935 }
936 
937 
938 
939 inline vec4 operator - (const vec4& a, const vec4& b)
940 {
941  vec4 c;
942  for(int i = 0; i < 4;++i) { c[i] = a[i] - b[i]; }
943  return c;
944 }
945 
946 inline vec4 operator - (real a, const vec4& b)
947 {
948  vec4 c;
949  for(int i = 0; i < 4;++i) { c[i] = a - b[i]; }
950  return c;
951 }
952 
953 inline vec4 operator - (const vec4& a, real b)
954 {
955  vec4 c;
956  for(int i = 0; i < 4;++i) { c[i] = a[i] - b; }
957  return c;
958 }
959 
960 
961 
962 inline vec4 operator * (const vec4& a, const vec4& b)
963 {
964  vec4 c;
965  for(int i = 0; i < 4;++i) { c[i] = a[i] * b[i]; }
966  return c;
967 }
968 
969 inline vec4 operator * (real a, const vec4& b)
970 {
971  vec4 c;
972  for(int i = 0; i < 4;++i) { c[i] = a * b[i]; }
973  return c;
974 }
975 
976 inline vec4 operator * (const vec4& a, real b)
977 {
978  vec4 c;
979  for(int i = 0; i < 4;++i) { c[i] = a[i] * b; }
980  return c;
981 }
982 
983 
984 
985 inline vec4 operator / (const vec4& a, const vec4& b)
986 {
987  vec4 c;
988  for(int i = 0; i < 4;++i) { c[i] = a[i] / b[i]; }
989  return c;
990 }
991 
992 inline vec4 operator / (real a, const vec4& b)
993 {
994  vec4 c;
995  for(int i = 0; i < 4;++i) { c[i] = a / b[i]; }
996  return c;
997 }
998 
999 inline vec4 operator / (const vec4& a, real b)
1000 {
1001  vec4 c;
1002  for(int i = 0; i < 4;++i) { c[i] = a[i] / b; }
1003  return c;
1004 }
1005 
1006 
1007 
1008 //| cumulative op : componentwise
1009 
1010 
1011 inline vec4 operator += (vec4& a, const vec4& b)
1012 {
1013  return a = (a + b);
1014 }
1015 
1017 {
1018  return a = (a + b);
1019 }
1020 
1021 
1022 
1023 inline vec4 operator -= (vec4& a, const vec4& b)
1024 {
1025  return a = (a - b);
1026 }
1027 
1029 {
1030  return a = (a - b);
1031 }
1032 
1033 
1034 
1035 inline vec4 operator *= (vec4& a, const vec4& b)
1036 {
1037  return a = (a * b);
1038 }
1039 
1041 {
1042  return a = (a * b);
1043 }
1044 
1045 
1046 
1047 inline vec4 operator /= (vec4& a, const vec4& b)
1048 {
1049  return a = (a / b);
1050 }
1051 
1053 {
1054  return a = (a / b);
1055 }
1056 
1057 
1058 
1059 //| logical op : componentwise
1060 
1061 
1062 inline int operator == (const vec4& a, const vec4& b)
1063 {
1064  int c = 1;
1065  for(int i = 0; i < 4;++i) { c = c && a[i] == b[i]; }
1066  return c;
1067 }
1068 
1069 inline int operator == (real a, const vec4& b)
1070 {
1071  int c = 1;
1072  for(int i = 0; i < 4;++i) { c = c && a == b[i]; }
1073  return c;
1074 }
1075 
1076 inline int operator == (const vec4& a, real b)
1077 {
1078  int c = 1;
1079  for(int i = 0; i < 4;++i) { c = c && a[i] == b; }
1080  return c;
1081 }
1082 
1083 
1084 
1085 inline int operator < (const vec4& a, const vec4& b)
1086 {
1087  int c = 1;
1088  for(int i = 0; i < 4;++i) { c = c && a[i] < b[i]; }
1089  return c;
1090 }
1091 
1092 inline int operator < (real a, const vec4& b)
1093 {
1094  int c = 1;
1095  for(int i = 0; i < 4;++i) { c = c && a < b[i]; }
1096  return c;
1097 }
1098 
1099 inline int operator < (const vec4& a, real b)
1100 {
1101  int c = 1;
1102  for(int i = 0; i < 4;++i) { c = c && a[i] < b; }
1103  return c;
1104 }
1105 
1106 
1107 
1108 inline int operator <= (const vec4& a, const vec4& b)
1109 {
1110  int c = 1;
1111  for(int i = 0; i < 4;++i) { c = c && a[i] <= b[i]; }
1112  return c;
1113 }
1114 
1115 inline int operator <= (real a, const vec4& b)
1116 {
1117  int c = 1;
1118  for(int i = 0; i < 4;++i) { c = c && a <= b[i]; }
1119  return c;
1120 }
1121 
1122 inline int operator <= (const vec4& a, real b)
1123 {
1124  int c = 1;
1125  for(int i = 0; i < 4;++i) { c = c && a[i] <= b; }
1126  return c;
1127 }
1128 
1129 
1130 
1131 inline int operator > (const vec4& a, const vec4& b)
1132 {
1133  int c = 1;
1134  for(int i = 0; i < 4;++i) { c = c && a[i] > b[i]; }
1135  return c;
1136 }
1137 
1138 inline int operator > (real a, const vec4& b)
1139 {
1140  int c = 1;
1141  for(int i = 0; i < 4;++i) { c = c && a > b[i]; }
1142  return c;
1143 }
1144 
1145 inline int operator > (const vec4& a, real b)
1146 {
1147  int c = 1;
1148  for(int i = 0; i < 4;++i) { c = c && a[i] > b; }
1149  return c;
1150 }
1151 
1152 
1153 
1154 inline int operator >= (const vec4& a, const vec4& b)
1155 {
1156  int c = 1;
1157  for(int i = 0; i < 4;++i) { c = c && a[i] >= b[i]; }
1158  return c;
1159 }
1160 
1161 inline int operator >= (real a, const vec4& b)
1162 {
1163  int c = 1;
1164  for(int i = 0; i < 4;++i) { c = c && a >= b[i]; }
1165  return c;
1166 }
1167 
1168 inline int operator >= (const vec4& a, real b)
1169 {
1170  int c = 1;
1171  for(int i = 0; i < 4;++i) { c = c && a[i] >= b; }
1172  return c;
1173 }
1174 
1175 
1176 
1177 //| unary op : componentwise
1178 inline vec4 operator - (const vec4& a)
1179 {
1180  vec4 c;
1181  for(int i = 0; i < 4;++i) { c[i] = - a[i]; }
1182  return c;
1183 }
1184 
1185 inline vec4 absolute(const vec4& val)
1186 {
1187  return vec4(fabs(val[0]), fabs(val[1]), fabs(val[2]), fabs(val[3]));
1188 }
1189 
1190 
1191 //| R^n -> R
1192 inline real sum(const vec4& a)
1193 {
1194  real s = 0;
1195 
1196  s += a[1 - 1];
1197 
1198  s += a[2 - 1];
1199 
1200  s += a[3 - 1];
1201 
1202  s += a[4 - 1];
1203 
1204  return s;
1205 }
1206 
1207 inline real inner(const vec4& a, const vec4& b)
1208 {
1209  vec4 tmp = a * b;
1210  return sum(tmp);
1211 }
1212 inline real squaredNorm(const vec4& a) {
1213  return inner(a, a);
1214 }
1215 inline real norm(const vec4& a)
1216 {
1217  return sqrt(inner(a, a));
1218 }
1219 
1220 inline vec4 unit(const vec4& a)
1221 {
1222  real n = norm(a);
1223  if(n < epsilon)
1224  return 0;
1225  else
1226  return a / n;
1227 }
1228 
1229 inline real angle(const vec4& a, const vec4& b)
1230 {
1231  real ang = inner(unit(a), unit(b));
1232  if(ang > 1 - epsilon)
1233  return 0;
1234  else if(ang < -1 + epsilon)
1235  return M_PI;
1236  else
1237  return acos(ang);
1238 }
1239 
1240 inline vec4 proj(const vec4& axis, const vec4& a)
1241 {
1242  vec4 u = unit(axis);
1243  return inner(a, u) * u;
1244 }
1245 
1246 void store(FILE* fp, const vec4& v);
1247 
1248 int scan(FILE* fp, const vec4& v);
1249 
1250 int apx_equal(const vec4& a, const vec4& b);
1251 int apx_equal(const vec4& a, const vec4& b, real eps);
1252 
1253 vec3 cross(const vec3& a, const vec3& b);
1254 
1255 
1256 }; //namespace graphics
1257 #endif
int scan(FILE *fp, const vec2 &v)
Definition: vec.cpp:91
real inner(const vec2 &a, const vec2 &b)
Definition: vec.h:388
real v[2]
Definition: vec.h:23
structure for 2-dimensional real type vector and its arithmetic.
Definition: vec.h:22
ivec2 operator*=(ivec2 &a, const ivec2 &b)
Definition: ivec.h:173
static const int n
Definition: vec.h:446
vec2 absolute(const vec2 &val)
Definition: vec.h:429
real & operator()(int i)
Definition: vec.h:55
real norm(const vec2 &a)
Definition: vec.h:394
int is_parallel(const vec2 &, real=angle_tolerance) const
Definition: vec.cpp:22
vec4(real a)
Definition: vec.h:869
vec4(const ivec4 &a)
Definition: vec.h:879
real sum(const vec2 &a)
Definition: vec.h:377
vec2 operator/(const vec2 &a, const vec2 &b)
Definition: vec.h:176
ivec2 operator+=(ivec2 &a, const ivec2 &b)
Definition: ivec.h:149
vec2(const vec2 &a)
Definition: vec.h:42
double real
Definition: real.h:4
bool is_zero() const
Definition: vec.h:61
static FILE * fp
Definition: sys.cpp:5
bool is_zero() const
Definition: vec.h:480
ivec2 operator+(const ivec2 &a, const ivec2 &b)
Definition: ivec.h:54
vec4 & operator=(const vec4 &a)
Definition: vec.h:889
vec2(real v_1, real v_2)
Definition: vec.h:32
vec3 & operator=(const vec3 &a)
Definition: vec.h:469
structure for 4-dimensional real type vector and its arithmetic.
Definition: vec.h:864
structure for 4-dimensional integer vector and its arithmetic.
Definition: ivec.h:643
real epsilon
Definition: epsilon.cpp:7
ivec2 operator*(const ivec2 &a, const ivec2 &b)
Definition: ivec.h:100
structure for 2-dimensional integer vector and its arithmetic.
Definition: ivec.h:14
bool is_tiny(real tiny_tol=epsilon) const
Definition: vec.h:62
vec2(real a)
Definition: vec.h:27
int operator<=(const ivec2 &a, const ivec2 &b)
Definition: ivec.h:246
vec3(const vec3 &a)
Definition: vec.h:464
static const int n
Definition: vec.h:866
real angle(const vec2 &a, const vec2 &b)
Definition: vec.h:412
real & operator[](int i)
Definition: vec.h:53
vec3 cross(const vec3 &a, const vec3 &b)
Definition: vec.cpp:399
bool perpendicular(const vec2 &)
Definition: vec.cpp:62
vec2 & operator=(const vec2 &a)
Definition: vec.h:47
real zero_epsilon
Definition: epsilon.cpp:13
structure for 3-dimensional real type vector and its arithmetic.
Definition: vec.h:444
vec2(const ivec2 &a)
Definition: vec.h:37
vec2 proj(const vec2 &axis, const vec2 &a)
Definition: vec.h:423
structure for 3-dimensional integer vector and its arithmetic.
Definition: ivec.h:331
real squaredNorm(const vec2 &a)
Definition: vec.h:399
vec4(const vec4 &a)
Definition: vec.h:884
int operator>=(const ivec2 &a, const ivec2 &b)
Definition: ivec.h:293
vec3(const ivec3 &a)
Definition: vec.h:459
bool is_tiny(real tiny_tol=epsilon) const
Definition: vec.h:901
int apx_equal(real x, real y)
Definition: epsilon.cpp:45
bool is_zero() const
Definition: vec.h:900
vec3(real v_1, real v_2, real v_3)
Definition: vec.h:454
ivec2 operator-=(ivec2 &a, const ivec2 &b)
Definition: ivec.h:161
int operator<(const ivec2 &a, const ivec2 &b)
Definition: ivec.h:223
bool unit()
Definition: vec.cpp:8
int operator>(const ivec2 &a, const ivec2 &b)
Definition: ivec.h:269
vec2 operator/=(vec2 &a, const vec2 &b)
Definition: vec.h:238
static const int n
Definition: vec.h:24
real angle_tolerance
Definition: epsilon.cpp:14
ivec2 operator-(const ivec2 &a, const ivec2 &b)
Definition: ivec.h:77
int operator==(const ivec2 &a, const ivec2 &b)
Definition: ivec.h:200
bool is_tiny(real tiny_tol=epsilon) const
Definition: vec.h:481
void store(FILE *fp, const vec2 &v)
Definition: vec.cpp:82
vec3(real a)
Definition: vec.h:449
vec4(real v_1, real v_2, real v_3, real v_4)
Definition: vec.h:874
real length() const
Definition: vec.cpp:17
bool is_perpendicular(const vec2 &, real=angle_tolerance) const
Definition: vec.cpp:44
#define M_PI
Definition: real.h:23