Branch data Line data Source code
1 : : #ifndef MESHKIT_VECUTIL_HPP
2 : : #define MESHKIT_VECUTIL_HPP
3 : :
4 : : #include <math.h>
5 : :
6 : : namespace MeshKit {
7 : :
8 : : class ModelEnt;
9 : : class MKCore;
10 : :
11 : : /** \class VecUtil VecUtil.hpp "meshkit/VecUtil.hpp"
12 : : * \brief A class of vector utilities
13 : : */
14 : :
15 : : class VecUtil
16 : : {
17 : : public:
18 : : /** \brief Dot product
19 : : *
20 : : * \param a First vector
21 : : * \param b Second vector
22 : : * \return Dot project
23 : : */
24 : : static double dot(double *a, double *b);
25 : :
26 : : /** \brief Length squared of a vector
27 : : * \param a Vector
28 : : * \return Length squared
29 : : */
30 : : static double length_sq(double *a);
31 : :
32 : : /** \brief Distance between two vectors
33 : : * \param a Vector 1
34 : : * \param b Vector 2
35 : : * \return Distance
36 : : */
37 : : static double dist2(double *a, double *b);
38 : :
39 : : /** \brief Normalize a vector
40 : : * \param a Vector
41 : : */
42 : : static void normalize(double *a);
43 : :
44 : : /** \brief Cross product
45 : : * \param a Vector 1
46 : : * \param b Vector 2
47 : : * \param c Cross product
48 : : */
49 : : static void cross(double *a, double *b, double *c);
50 : :
51 : : //! Constant PI
52 : : static double PI;
53 : :
54 : : //! Constant 2*pi
55 : : static double TWO_PI;
56 : : };
57 : :
58 : 20152 : inline double VecUtil::dot(double *a, double *b) {return a[0]*b[0] + a[1]*b[1] + a[2]*b[2];}
59 : :
60 : 40 : inline double VecUtil::length_sq(double *a) {return a[0]*a[0] + a[1]*a[1] + a[2]*a[2];}
61 : :
62 : : inline double VecUtil::dist2(double *a, double *b)
63 : : {
64 : : return sqrt((b[0]-a[0])*(b[0]-a[0]) + (b[1]-a[1])*(b[1]-a[1])
65 : : + (b[2]-a[2])*(b[2]-a[2]));
66 : : }
67 : :
68 : 20 : inline void VecUtil::normalize(double *a)
69 : : {
70 : 20 : double lsq = length_sq(a);
71 [ - + ]: 20 : if (lsq == 0.0) return;
72 : 20 : lsq = 1.0 / sqrt(lsq);
73 [ + + ]: 80 : for (int i = 0; i < 3; i++) a[i] *= lsq;
74 : : }
75 : :
76 : 10076 : inline void VecUtil::cross(double *a, double *b, double *c)
77 : : {
78 : 10076 : c[0] = a[1]*b[2] - a[2]*b[1];
79 : 10076 : c[1] = a[2]*b[0] - a[0]*b[2];
80 : 10076 : c[2] = a[0]*b[1] - a[1]*b[0];
81 : 10076 : }
82 : :
83 : : } // namespace MeshKit
84 : :
85 : : #endif
|