Go to the documentation of this file. 1
11
12 #ifndef VERDICT_VECTOR
13 #define VERDICT_VECTOR
14
15 #include "moab/verdict.h"
16 #include <cmath>
17 #include <cassert>
18
19
20 inline double dot_product( double vec1[], double vec2[] )
21 {
22 double answer = vec1[0] * vec2[0] + vec1[1] * vec2[1] + vec1[2] * vec2[2];
23 return answer;
24 }
25
26
27 inline void normalize( double vec[] )
28 {
29 double x = sqrt( vec[0] * vec[0] + vec[1] * vec[1] + vec[2] * vec[2] );
30
31 vec[0] /= x;
32 vec[1] /= x;
33 vec[2] /= x;
34 }
35
36
37 inline double* cross_product( double vec1[], double vec2[], double answer[] )
38 {
39 answer[0] = vec1[1] * vec2[2] - vec1[2] * vec2[1];
40 answer[1] = vec1[2] * vec2[0] - vec1[0] * vec2[2];
41 answer[2] = vec1[0] * vec2[1] - vec1[1] * vec2[0];
42 return answer;
43 }
44
45
46 inline double length( double vec[] )
47 {
48 return sqrt( vec[0] * vec[0] + vec[1] * vec[1] + vec[2] * vec[2] );
49 }
50
51
52 inline double length_squared( double vec[] )
53 {
54 return ( vec[0] * vec[0] + vec[1] * vec[1] + vec[2] * vec[2] );
55 }
56
57
58 inline double interior_angle( double vec1[], double vec2[] )
59 {
60 double cosAngle, angleRad;
61 double length1 = length( vec1 );
62 double length2 = length( vec2 );
63 assert( ( length1 > 0.0 && length2 > 0.0 ) );
64
65 cosAngle = dot_product( vec1, vec2 ) / ( length1 * length2 );
66
67 if( ( cosAngle > 1.0 ) && ( cosAngle < 1.0001 ) )
68 {
69 cosAngle = 1.0;
70 }
71 else if( cosAngle < -1.0 && cosAngle > -1.0001 )
72 {
73 cosAngle = -1.0;
74 }
75 else
76 {
77 assert( cosAngle < 1.0001 && cosAngle > -1.0001 );
78 }
79
80 angleRad = acos( cosAngle );
81 return ( ( angleRad * 180. ) / VERDICT_PI );
82 }
83
84 #endif