Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include <OpenFOAM/error.H>
00027 #include "CatmullRomSpline.H"
00028
00029
00030
00031 Foam::CatmullRomSpline::CatmullRomSpline
00032 (
00033 const pointField& knots,
00034 const bool closed
00035 )
00036 :
00037 polyLine(knots, closed)
00038 {}
00039
00040
00041
00042
00043 Foam::point Foam::CatmullRomSpline::position(const scalar mu) const
00044 {
00045
00046 if (mu < SMALL)
00047 {
00048 return points()[0];
00049 }
00050 else if (mu > 1 - SMALL)
00051 {
00052 return points()[points().size()-1];
00053 }
00054
00055 scalar lambda = mu;
00056 label segment = localParameter(lambda);
00057 return position(segment, lambda);
00058 }
00059
00060
00061 Foam::point Foam::CatmullRomSpline::position
00062 (
00063 const label segment,
00064 const scalar mu
00065 ) const
00066 {
00067
00068 if (segment < 0)
00069 {
00070 return points()[0];
00071 }
00072 else if (segment > nSegments())
00073 {
00074 return points()[points().size()-1];
00075 }
00076
00077 const point& p0 = points()[segment];
00078 const point& p1 = points()[segment+1];
00079
00080
00081 if (mu <= 0.0)
00082 {
00083 return p0;
00084 }
00085 else if (mu >= 1.0)
00086 {
00087 return p1;
00088 }
00089
00090
00091
00092 point e0;
00093 point e1;
00094
00095 if (segment == 0)
00096 {
00097
00098 e0 = 2*p0 - p1;
00099 }
00100 else
00101 {
00102 e0 = points()[segment-1];
00103 }
00104
00105 if (segment+1 == nSegments())
00106 {
00107
00108 e1 = 2*p1 - p0;
00109 }
00110 else
00111 {
00112 e1 = points()[segment+2];
00113 }
00114
00115
00116 return 0.5 *
00117 (
00118 ( 2*p0 )
00119 + mu *
00120 (
00121 ( -e0 + p1 )
00122 + mu *
00123 (
00124 ( 2*e0 - 5*p0 + 4*p1 - e1 )
00125 + mu *
00126 ( -e0 + 3*p0 - 3*p1 + e1 )
00127 )
00128 )
00129 );
00130 }
00131
00132
00133 Foam::scalar Foam::CatmullRomSpline::length() const
00134 {
00135 notImplemented("CatmullRomSpline::length() const");
00136 return 1.0;
00137 }
00138
00139
00140