feature magic defaults to 1 now
[engrid.git] / src / libengrid / swaptriangles.h
bloba1e511dc12093503455d6cd84392f941e2cab7d5
1 //
2 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 // + +
4 // + This file is part of enGrid. +
5 // + +
6 // + Copyright 2008-2013 enGits GmbH +
7 // + +
8 // + enGrid is free software: you can redistribute it and/or modify +
9 // + it under the terms of the GNU General Public License as published by +
10 // + the Free Software Foundation, either version 3 of the License, or +
11 // + (at your option) any later version. +
12 // + +
13 // + enGrid is distributed in the hope that it will be useful, +
14 // + but WITHOUT ANY WARRANTY; without even the implied warranty of +
15 // + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +
16 // + GNU General Public License for more details. +
17 // + +
18 // + You should have received a copy of the GNU General Public License +
19 // + along with enGrid. If not, see <http://www.gnu.org/licenses/>. +
20 // + +
21 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
22 //
23 #ifndef swaptriangles_H
24 #define swaptriangles_H
26 class SwapTriangles;
28 #include "surfaceoperation.h"
29 #include "cadinterface.h"
31 /**
32 * \todo This class desperately needs a clean-up and optimisation!
34 class SwapTriangles : public SurfaceOperation
37 private: // attributes
39 QVector<bool> m_Swapped;
40 bool m_RespectBC;
41 bool m_FeatureSwap;
42 bool m_SmallAreaSwap;
43 bool m_Verbose;
44 int m_MaxNumLoops;
45 double m_SmallAreaRatio;
46 double m_SurfErrorThreshold;
47 double m_SurfErrorRatio;
48 double m_AverageSurfaceError;
49 double m_SurfaceErrorDeviation;
51 private: // methods
53 ///returns true if performing a swap on the stencil does not change the orientation of the cells (tetra volume test)
54 bool testOrientation(stencil_t S);
56 ///returns true if id_node1 is linked to id_node2
57 bool isEdge(vtkIdType id_node1, vtkIdType id_node2);
59 protected: // methods
61 int swap();
62 double computeSurfaceDistance(vec3_t x1, vec3_t x2, vec3_t x3, CadInterface* cad_interface);
63 double edgeAngle(vec3_t x1, vec3_t x2, vec3_t x3, vec3_t x4);
64 vtkIdType neighbourNode(vtkIdType id_node0, vtkIdType id_node1, vtkIdType id_node2);
65 bool swapDueToSurfaceNoise(stencil_t S);
66 void computeSurfaceErrors(const QVector<vec3_t> &x, int bc, double &err1, double &err2);
67 void computeAverageSurfaceError();
68 virtual void operate();
70 public:
72 SwapTriangles();
74 void setRespectBC(bool b) { m_RespectBC = b; }
75 void setFeatureSwap(bool b) { m_FeatureSwap = b; }
76 void setMaxNumLoops(int n) { m_MaxNumLoops = n; }
77 void setSmallAreaSwap(bool b) { m_SmallAreaSwap = b; }
78 void setVerboseOn() { m_Verbose = true; }
79 void setVerboseOff() { m_Verbose = false; }
83 #endif