ENH: autoLayerDriver: better layering information message
[OpenFOAM-2.0.x.git] / src / mesh / blockMesh / curvedEdges / CatmullRomSpline.H
blob4d69a1329554d6f16f591d02ef964deafc95d2ff
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
6      \\/     M anipulation  |
7 -------------------------------------------------------------------------------
8 License
9     This file is part of OpenFOAM.
11     OpenFOAM is free software: you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by
13     the Free Software Foundation, either version 3 of the License, or
14     (at your option) any later version.
16     OpenFOAM 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 OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
24 Class
25     Foam::CatmullRomSpline
27 Description
28     An implementation of Catmull-Rom splines
29     (sometimes known as Overhauser splines).
31     In this implementation, the end tangents are created automatically
32     by reflection.
34     In matrix form, the \e local interpolation on the interval t=[0..1] is
35     described as follows:
36     \verbatim
37     P(t) = 1/2 * [ t^3 t^2 t 1 ] * [ -1  3 -3  1 ] * [ P-1 ]
38                                    [  2 -5  4 -1 ]   [ P0 ]
39                                    [ -1  0  1  0 ]   [ P1 ]
40                                    [  0  2  0  0 ]   [ P2 ]
41     \endverbatim
43     Where P-1 and P2 represent the neighbouring points or the extrapolated
44     end points. Simple reflection is used to automatically create the end
45     points.
47     The spline is discretized based on the chord length of the individual
48     segments. In rare cases (sections with very high curvatures), the
49     resulting distribution may be sub-optimal.
51     A future implementation could also handle closed splines.
53 SeeAlso
54     http://www.algorithmist.net/catmullrom.html provides a nice
55     introduction
57 SourceFiles
58     CatmullRomSpline.C
60 \*---------------------------------------------------------------------------*/
62 #ifndef CatmullRomSpline_H
63 #define CatmullRomSpline_H
65 #include "polyLine.H"
67 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
69 namespace Foam
72 /*---------------------------------------------------------------------------*\
73                       Class CatmullRomSpline Declaration
74 \*---------------------------------------------------------------------------*/
76 class CatmullRomSpline
78     public polyLine
80     // Private Member Functions
82         //- Disallow default bitwise copy construct
83         CatmullRomSpline(const CatmullRomSpline&);
85         //- Disallow default bitwise assignment
86         void operator=(const CatmullRomSpline&);
89 public:
91     // Constructors
93         //- Construct from components
94         CatmullRomSpline
95         (
96             const pointField& knots,
97             const bool notImplementedClosed = false
98         );
101     // Member Functions
103         //- Return the point position corresponding to the curve parameter
104         //  0 <= lambda <= 1
105         point position(const scalar lambda) const;
107         //- Return the point position corresponding to the local parameter
108         //  0 <= lambda <= 1 on the given segment
109         point position(const label segment, const scalar lambda) const;
111         //- Return the length of the curve
112         scalar length() const;
116 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
118 } // End namespace Foam
120 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
122 #endif
124 // ************************************************************************* //