1 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 // + This file is part of enGrid. +
5 // + Copyright 2008-2014 enGits GmbH +
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. +
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. +
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/>. +
20 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
21 #ifndef swaptriangles_H
22 #define swaptriangles_H
26 #include "surfaceoperation.h"
27 #include "cadinterface.h"
30 * \todo This class desperately needs a clean-up and optimisation!
32 class SwapTriangles
: public SurfaceOperation
35 private: // attributes
37 QVector
<bool> m_Swapped
;
43 double m_SmallAreaRatio
;
44 double m_SurfErrorThreshold
;
45 double m_SurfErrorRatio
;
46 double m_AverageSurfaceError
;
47 double m_SurfaceErrorDeviation
;
48 double m_DelaunayThreshold
;
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
);
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();
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
; }