updated to modern VTK
[engrid-github.git] / src / libengrid / swaptriangles.h
blobde5dbd1984cb92509452b7e8ca43db478265993f
1 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 // + +
3 // + This file is part of enGrid. +
4 // + +
5 // + Copyright 2008-2014 enGits GmbH +
6 // + +
7 // + enGrid is free software: you can redistribute it and/or modify +
8 // + it under the terms of the GNU General Public License as published by +
9 // + the Free Software Foundation, either version 3 of the License, or +
10 // + (at your option) any later version. +
11 // + +
12 // + enGrid is distributed in the hope that it will be useful, +
13 // + but WITHOUT ANY WARRANTY; without even the implied warranty of +
14 // + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +
15 // + GNU General Public License for more details. +
16 // + +
17 // + You should have received a copy of the GNU General Public License +
18 // + along with enGrid. If not, see <http://www.gnu.org/licenses/>. +
19 // + +
20 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
21 #ifndef swaptriangles_H
22 #define swaptriangles_H
24 class SwapTriangles;
26 #include "surfaceoperation.h"
27 #include "cadinterface.h"
29 /**
30 * \todo This class desperately needs a clean-up and optimisation!
32 class SwapTriangles : public SurfaceOperation
35 private: // attributes
37 QVector<bool> m_Swapped;
38 bool m_RespectBC;
39 bool m_FeatureSwap;
40 bool m_SmallAreaSwap;
41 bool m_Verbose;
42 int m_MaxNumLoops;
43 double m_SmallAreaRatio;
44 double m_SurfErrorThreshold;
45 double m_SurfErrorRatio;
46 double m_AverageSurfaceError;
47 double m_SurfaceErrorDeviation;
48 double m_DelaunayThreshold;
49 int m_NumSwaps;
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; }
80 void setDelaunayThreshold(double t) { m_DelaunayThreshold = t; }
81 int getNumSwaps() { return m_NumSwaps; }
85 #endif