Branch data Line data Source code
1 : : #ifndef MESHKIT_TRANSFORM_HPP
2 : : #define MESHKIT_TRANSFORM_HPP
3 : :
4 : : #include "meshkit/Error.hpp"
5 : : #include "meshkit/iMesh.hpp"
6 : : #include "meshkit/Matrix.hpp"
7 : : #include "TransformBase.hpp"
8 : : #include <vector>
9 : :
10 : : namespace MeshKit {
11 : : Vector<3> rodrigues(const Vector<3> &pt, const Vector<3> &z, double dtheta);
12 : :
13 : : namespace Copy {
14 : : /** \class Identity Transform.hpp "meshkit/Transform.hpp"
15 : : * \brief The identity transformation
16 : : */
17 [ - + ]: 16 : class Identity : public BasicTransform<Identity>
18 : : {
19 : : friend class BasicTransform<Identity>;
20 : : public:
21 : 8 : Identity() {}
22 : : protected:
23 : 0 : void transform_one(Vector<3> &coords) const {}
24 : : };
25 : :
26 : : /** \class Translate Transform.hpp "meshkit/Transform.hpp"
27 : : * \brief A translation function
28 : : */
29 [ - + ]: 32 : class Translate : public BasicTransform<Translate>
30 : : {
31 : : friend class BasicTransform<Translate>;
32 : : public:
33 : 8 : Translate(const Vector<3> &dv) : dv_(dv) {}
34 : : protected:
35 : 85 : void transform_one(Vector<3> &coords) const
36 : : {
37 : 85 : coords += dv_;
38 : 85 : }
39 : : private:
40 : : Vector<3> dv_;
41 : : };
42 : :
43 : : /** \class Rotate Transform.hpp "meshkit/Transform.hpp"
44 : : * \brief A rotation function, using Rodrigues' formula
45 : : */
46 : : class Rotate : public BasicTransform<Rotate>
47 : : {
48 : : friend class BasicTransform<Rotate>;
49 : : public:
50 : : Rotate(const Vector<3> &origin, const Vector<3> &z, double dtheta)
51 : : : origin_(origin), z_(z/length(z)), dtheta_(dtheta)
52 : : {}
53 : : protected:
54 : : void transform_one(Vector<3> &coords) const
55 : : {
56 : : coords = rodrigues(coords-origin_, z_, dtheta_) + origin_;
57 : : }
58 : : private:
59 : : Vector<3> origin_;
60 : : Vector<3> z_;
61 : : double dtheta_;
62 : : };
63 : : }
64 : :
65 : : namespace Extrude {
66 : : /** \class Translate Transform.hpp "meshkit/Transform.hpp"
67 : : * \brief A translation function
68 : : */
69 [ - + ]: 12 : class Translate : public BasicTransform<Translate>
70 : : {
71 : : friend class BasicTransform<Translate>;
72 : : public:
73 : 3 : Translate(const Vector<3> &dv, int steps)
74 [ + - ][ + - ]: 3 : : BasicTransform<Translate>(steps), dv_(dv/steps)
75 : 3 : {}
76 : : protected:
77 : 76 : virtual void transform_one(int step, Vector<3> &coords) const
78 : : {
79 [ + - ]: 76 : coords += dv_*step;
80 : 76 : }
81 : : private:
82 : : Vector<3> dv_;
83 : : };
84 : :
85 : : /** \class Rotate Transform.hpp "meshkit/Transform.hpp"
86 : : * \brief A rotation function, using Rodrigues' formula
87 : : */
88 : : class Rotate : public BasicTransform<Rotate>
89 : : {
90 : : friend class BasicTransform<Rotate>;
91 : : public:
92 : : Rotate(const Vector<3> &origin, const Vector<3> &z, double dtheta,
93 : : int steps)
94 : : : BasicTransform<Rotate>(steps), origin_(origin), z_(z/length(z)),
95 : : dtheta_(dtheta/steps)
96 : : {}
97 : : protected:
98 : : virtual void transform_one(int step, Vector<3> &coords) const
99 : : {
100 : : coords = rodrigues(coords-origin_, z_, dtheta_*step) + origin_;
101 : : }
102 : : private:
103 : : Vector<3> origin_;
104 : : Vector<3> z_;
105 : : double dtheta_;
106 : : };
107 : : }
108 : : }
109 : :
110 : : #endif
|