Fixed URL for libccmio-2.6.1 (bug report #5 by Thomas Oliveira)
[foam-extend-3.2.git] / src / mesh / cfMesh / utilities / helperFunctions / helperFunctionsGeometryQueries.H
blob6f7d626e5ee2a8f5e9e8d279d93ff792451c2208
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | cfMesh: A library for mesh generation
4    \\    /   O peration     |
5     \\  /    A nd           | Author: Franjo Juretic (franjo.juretic@c-fields.com)
6      \\/     M anipulation  | Copyright (C) Creative Fields, Ltd.
7 -------------------------------------------------------------------------------
8 License
9     This file is part of cfMesh.
11     cfMesh is free software; you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by the
13     Free Software Foundation; either version 3 of the License, or (at your
14     option) any later version.
16     cfMesh is distributed in the hope that it will be useful, but WITHOUT
17     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
19     for more details.
21     You should have received a copy of the GNU General Public License
22     along with cfMesh.  If not, see <http://www.gnu.org/licenses/>.
24 InNamespace
25     Foam::help
27 Description
28     Geometry queries useful for mesh generation
30 SourceFiles
32 \*---------------------------------------------------------------------------*/
34 #ifndef helperFunctionsGeometryQueries_H
35 #define helperFunctionsGeometryQueries_H
37 #include "DynList.H"
38 #include "plane.H"
39 #include "face.H"
41 #include "triSurf.H"
42 #include "triangle.H"
43 #include "tetrahedron.H"
44 #include "boolList.H"
45 #include "HashSet.H"
47 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
49 class boundBox;
51 namespace Foam
54 /*---------------------------------------------------------------------------*\
55                     Namespace help functions Declaration
56 \*---------------------------------------------------------------------------*/
58 namespace help
60     //- check if a list has nan entries
61     template<class ListType>
62     bool isnan(const ListType&);
64     //- check if a list has inf entries
65     template<class ListType>
66     bool isinf(const ListType&);
68     //- check if the faces share a convex edge
69     template<class Face1, class Face2>
70     inline bool isSharedEdgeConvex
71     (
72         const pointField& points,
73         const Face1& f1,
74         const Face2& f2
75     );
77     //- angle between the two faces in radians
78     template<class Face1, class Face2>
79     inline scalar angleBetweenFaces
80     (
81         const pointField& points,
82         const Face1& f1,
83         const Face2& f2
84     );
86     // merge faces which are in the same patch
87     // This is need to merge the triagles which are generated for cells
88     // cut by more than on boundary regions
89     inline faceList mergePatchFaces
90     (
91         const List< DynList<label> >& pfcs,
92         const pointField& polyPoints
93     );
95     //- check if the point p belongs to the edge e
96     inline bool vertexOnLine
97     (
98         const point& p,
99         const edge& e,
100         const pointField& ep
101     );
103     //- check if the point p belongs to the plane
104     inline bool vertexInPlane(const point& p, const plane& pl);
106     //- find the vertex on the line of the edge nearest to the point p
107     inline point nearestPointOnTheEdge
108     (
109         const point& edgePoint0,
110         const point& edgePoint1,
111         const point& p
112     );
114     //- find the vertex on the edge nearest to the point p
115     inline point nearestPointOnTheEdgeExact
116     (
117         const point& edgePoint0,
118         const point& edgePoint1,
119         const point& p
120     );
122     //- find and return the distance between the edge and the point p
123     inline scalar distanceOfPointFromTheEdge
124     (
125         const point& edgePoint0,
126         const point& edgePoint1,
127         const point& p
128     );
130     //- find the nearest points on the edge and the line
131     inline bool nearestEdgePointToTheLine
132     (
133         const point& edgePoint0,
134         const point& edgePoint1,
135         const point& lp0,
136         const point& lp1,
137         point& nearestOnEdge,
138         point& nearestOnLine
139     );
141     //- check if the edge intersects the plane
142     inline bool planeIntersectsEdge
143     (
144         const point& start,
145         const point& end,
146         const plane& pl,
147         point& intersection
148     );
150     //- check if a vertex lies inside the tetrahedron
151     inline bool pointInTetrahedron
152     (
153         const point& p,
154         const tetrahedron<point, point>& tet
155     );
157     //- check if a line intersects the triangle, and return the intersection
158     inline bool triLineIntersection
159     (
160         const triangle<point, point>& tria,
161         const point& lineStart,
162         const point& lineEnd,
163         point& intersection
164     );
166     //- check if a line intersects the triangle and return the intersection
167     inline bool triLineIntersection
168     (
169         const triSurf&,
170         const label,
171         const point&,
172         const point&,
173         point&
174     );
176     //- check if the line intersects the bounding box
177     inline bool boundBoxLineIntersection
178     (
179         const point&,
180         const point&,
181         const boundBox&
182     );
184     //- check if the line and the face intersect
185     inline bool lineFaceIntersection
186     (
187         const point&,
188         const point&,
189         const face&,
190         const pointField& fp,
191         point& intersection
192     );
194     //- check if the surface triangle and the face intersect
195     inline bool doFaceAndTriangleIntersect
196     (
197         const triSurf& surface,
198         const label triI,
199         const face& f,
200         const pointField& facePoints
201     );
203     //- find the nearest point on the triangle to the given point
204     inline point nearestPointOnTheTriangle
205     (
206         const triangle<point, point>& tri,
207         const point&
208     );
210     //- find the nearest vertex on the surface triangle to the given point
211     inline point nearestPointOnTheTriangle
212     (
213         const label,
214         const triSurf&,
215         const point&
216     );
218     //- find the minimiser point from a point and the given planes
219     //- returns true if the minimizer exists
220     inline bool findMinimizerPoint
221     (
222         const DynList<point>& origins,
223         const DynList<vector>& normals,
224         point& pMin
225     );
227     //- check the existence of overlap between the two edges
228     inline bool doEdgesOverlap
229     (
230         const point& e0p0,
231         const point& e0p1,
232         const point& e1p0,
233         const point& e1p1,
234         FixedList<point, 2>& overlappingPart,
235         const scalar distTol = -1.0,
236         const scalar cosTol = Foam::cos(5.0*(M_PI/180.0)) // cosine tolerance
237     );
239     //- check the existence of overlap between the two triangles
240     inline bool doTrianglesOverlap
241     (
242         const triangle<point, point>& tri0,
243         const triangle<point, point>& tri1,
244         DynList<point>& overlappingPolygon,
245         const scalar distTol = -1.0,
246         const scalar cosTol = Foam::cos(5.0*(M_PI/180.0)) // cosine tolerance
247     );
249     //- check the existence of intersection between the two triangles
250     inline bool doTrianglesIntersect
251     (
252         const triangle<point, point> &tri0,
253         const triangle<point, point> &tri1,
254         const scalar distTol = -1.0
255     );
257     inline bool doTrianglesIntersect
258     (
259         const triangle<point, point>& tri0,
260         const triangle<point, point>& tri1,
261         DynList<point>& intersectionPoints,
262         const scalar distTol = -1.0
263     );
265     //- check if the point is inside or outside the face
266     inline bool pointInsideFace
267     (
268         const point& p,
269         const face& f,
270         const vector& n,
271         const pointField& fp,
272         const scalar distTol = SMALL
273     );
275     //- check if the point is inside or outside the face
276     inline bool pointInsideFace
277     (
278         const point& p,
279         const face& f,
280         const pointField& fp,
281         const scalar distTol = SMALL
282     );
284     //- check if the face is convex. Concave points are flagged false
285     inline bool isFaceConvexAndOk
286     (
287         const face& f,
288         const pointField& fp,
289         DynList<bool>& OkPoints
290     );
292     //- check if the vertex is on the positive side of the face plane
293     inline bool isVertexVisible(const point& p, const plane& pl);
295     //- find number of face groups within a given range
296     inline label numberOfFaceGroups
297     (
298         const labelHashSet& containedElements,
299         const point& centre,
300         const scalar range,
301         const triSurf& surface
302     );
304     //- find the number of edge groups within the given range
305     inline label numberOfEdgeGroups
306     (
307         const labelHashSet& containedEdges,
308         const point& centre,
309         const scalar range,
310         const triSurf& surface
311     );
313 } // End namespace help
315 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
317 } // End namespace Foam
319 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
321 #include "helperFunctionsGeometryQueriesI.H"
323 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
325 #endif
327 // ************************************************************************* //