faceTriangulation.H
Go to the documentation of this file.
1/*---------------------------------------------------------------------------*\
2 ========= |
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4 \\ / O peration |
5 \\ / A nd | www.openfoam.com
6 \\/ M anipulation |
7-------------------------------------------------------------------------------
8 Copyright (C) 2011 OpenFOAM Foundation
9-------------------------------------------------------------------------------
10License
11 This file is part of OpenFOAM.
12
13 OpenFOAM is free software: you can redistribute it and/or modify it
14 under the terms of the GNU General Public License as published by
15 the Free Software Foundation, either version 3 of the License, or
16 (at your option) any later version.
17
18 OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
19 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
20 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
21 for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
25
26Class
27 Foam::faceTriangulation
28
29Description
30 Triangulation of faces. Handles concave polygons as well
31 (inefficiently)
32
33 Works by trying to subdivide the face at the vertex with 'flattest'
34 internal angle (i.e. closest to 180 deg).
35
36 Based on routine 'Diagonal' in
37 \verbatim
38 "Efficient Triangulation of Simple Polygons"
39 Godfried Toussaint, McGill University.
40 \endverbatim
41
42 After construction is the list of triangles the face is decomposed into.
43 (Or empty list if no valid triangulation could be found).
44
45
46SourceFiles
47 faceTriangulation.C
48
49\*---------------------------------------------------------------------------*/
50
51#ifndef faceTriangulation_H
52#define faceTriangulation_H
53
54#include "triFaceList.H"
55#include "pointField.H"
56
57// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
58
59namespace Foam
60{
61
62// Forward declaration of classes
63
64/*---------------------------------------------------------------------------*\
65 Class faceTriangulation Declaration
66\*---------------------------------------------------------------------------*/
69:
70 public triFaceList
71{
72 // Static Data
73
74 //- Relative tolerance on edge.
75 static const scalar edgeRelTol;
76
77
78 // Static Member Functions
79
80 //- Edge to the right of face vertex i
81 static label right(const label size, label i);
82
83 //- Edge to the left of face vertex i
84 static label left(const label size, label i);
85
86 //- Calculate normalized edge vectors
87 static tmp<vectorField> calcEdges(const face&, const pointField&);
88
89 //- Calculates half angle components of angle from e0 to e1
90 // in plane given by normal.
91 static void calcHalfAngle
92 (
93 const vector& normal,
94 const vector& e0,
95 const vector& e1,
96 scalar& cosHalfAngle,
97 scalar& sinHalfAngle
98 );
99
100 //- Calculate intersection point between edge p1-p2 and ray (in 2D).
101 // Return true and intersection point if intersection between p1 and p2.
102 static pointHit rayEdgeIntersect
103 (
104 const vector& normal,
105 const point& rayOrigin,
106 const vector& rayDir,
107 const point& p1,
108 const point& p2,
109 scalar& posOnEdge
110 );
111
112 // Return true if triangle given its three points
113 // (anticlockwise ordered) contains point
114 static bool triangleContainsPoint
115 (
116 const vector& n,
117 const point& p0,
118 const point& p1,
119 const point& p2,
120 const point& pt
121 );
122
123 //- Starting from startIndex find diagonal. Return in index1, index2.
124 // Index1 always startIndex except when convex polygon
125 static void findDiagonal
126 (
127 const pointField& points,
128 const face& f,
129 const vectorField& edges,
130 const vector& normal,
131 const label startIndex,
132 label& index1,
133 label& index2
134 );
135
136 //- Find label of vertex to start splitting from. This will be the
137 // vertex with edge angle:
138 // 1] flattest concave angle
139 // 2] flattest convex angle if no concave angles.
140 static label findStart
141 (
142 const face& f,
143 const vectorField& edges,
144 const vector& normal
145 );
146
147
148 // Private Member Functions
149
150 //- Split face f into triangles. Handles all simple (convex & concave)
151 // polygons. Returns false if could not produce valid split.
152 bool split
153 (
154 const bool fallBack,
155 const pointField& points,
156 const face& f,
157 const vector& normal,
158 label& triI
159 );
160
161public:
162
163 // Constructors
164
165 //- Construct null
167
168 //- Construct from face and points. Decomposition based on average
169 // normal. After construction *this is size 0 or holds the triangles.
170 // If fallBack and triangulation fails does naive triangulation
171 // and never returns 0 size.
173 (
174 const pointField& points,
175 const face& f,
176 const bool fallBack = false
177 );
178
179 //- Construct from face and points and user supplied (unit) normal.
180 // After construction *this is size 0 or holds the triangles.
181 // If fallBack and triangulation fails does naive triangulation
182 // and never returns 0 size.
184 (
185 const pointField& points,
186 const face& f,
187 const vector& n,
188 const bool fallBack = false
189 );
190
191 //- Construct from Istream
193};
194
195
196// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
197
198} // End namespace Foam
199
200// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
201
202#endif
203
204// ************************************************************************* //
label n
An Istream is an abstract base class for all input systems (streams, files, token lists etc)....
Definition: Istream.H:64
A 1D array of objects of type <T>, where the size of the vector is known and used for subscript bound...
Definition: List.H:77
Describes the interaction of a face and a point. It carries the info of a successful hit and (if succ...
Definition: PointHit.H:54
label size() const noexcept
The number of elements in the UList.
Definition: UListI.H:420
Triangulation of faces. Handles concave polygons as well (inefficiently)
faceTriangulation()
Construct null.
A face is a list of labels corresponding to mesh vertices.
Definition: face.H:75
A class for managing temporary objects.
Definition: tmp.H:65
const volScalarField & p0
Definition: EEqn.H:36
const pointField & points
Namespace for OpenFOAM.
labelList f(nPoints)