26 #define BSPLINE_TINY 1e-20
36 template <
class Po
intND>
45 void setCtrlPoints(
const std::vector<PointND>& ctrlPointVec );
52 void eval(
double dPos, PointND& point);
68 double evalBasis(
double t,
unsigned int i,
int n);
79 template <
class Po
intND>
87 template <
class Po
intND>
93 template <
class Po
intND>
100 m_CtrlPointVec = ctrlPointVec;
101 iNumCtrlPoint = m_CtrlPointVec.size();
103 if (iNumCtrlPoint < m_iGrad)
108 m_KnotVec.resize( iNumCtrlPoint + m_iGrad );
111 for(i = 0; i< m_iGrad; i++)
116 int iNumInternalKnots = iNumCtrlPoint - m_iGrad;
117 for(i=0; i<iNumInternalKnots; i++)
119 double Distance1 = 0.0;
120 for(
unsigned int k = 0; k < m_CtrlPointVec[i+1].size(); k++)
122 Distance1 += (m_CtrlPointVec[i+1].at(k) - m_CtrlPointVec[i+2].at(k)) * (m_CtrlPointVec[i+1].at(k) - m_CtrlPointVec[i+2].at(k));
124 d= m_KnotVec[i+m_iGrad-1] + sqrt(Distance1);
126 m_KnotVec[i+m_iGrad] =
d;
128 double Distance2 = 0.0;
129 for(
unsigned int k = 0; k < m_CtrlPointVec[iNumInternalKnots+1].size(); k++)
131 Distance2 += ( m_CtrlPointVec[iNumInternalKnots+1].at(k) - m_CtrlPointVec[iNumInternalKnots+2].at(k)) * ( m_CtrlPointVec[iNumInternalKnots+1].at(k) - m_CtrlPointVec[iNumInternalKnots+2].at(k));
133 d = m_KnotVec[iNumCtrlPoint-1] + sqrt(Distance2);
136 for(i = 0; i< m_iGrad; i++)
138 m_KnotVec[i+iNumCtrlPoint] =
d;
149 template <
class Po
intND>
154 for(
unsigned int i = 0; i<point.size(); i++)
156 for(
unsigned int i = 0; i < m_CtrlPointVec.size(); i++)
158 dFak = evalBasis(dPos, i, m_iGrad);
159 for(
unsigned int j = 0; j<point.size(); j++)
160 point.at(j) += m_CtrlPointVec[i][j] * dFak;
166 template <
class Po
intND>
169 PointND buf = m_CtrlPointVec.front();
174 if (m_CtrlPointVec.size() < m_iGrad)
176 ipoVec = m_CtrlPointVec;
183 iNumOfPoints = m_KnotVec.back() / dIpoDist + 2;
184 ipoVec.resize(iNumOfPoints);
188 for(
int i=0; i < iNumOfPoints -1 ; i++)
195 ipoVec.back() = m_CtrlPointVec.back();
273 template <
class Po
intND>
279 if (m_CtrlPointVec.size() < m_iGrad)
281 ipoVec = m_CtrlPointVec;
285 dInc = m_KnotVec.back() / (double)(iNumOfPoints-1);
286 ipoVec.resize(iNumOfPoints);
290 for(
int i=0; i < iNumOfPoints -1 ; i++)
298 ipoVec.back() = m_CtrlPointVec.back();
303 template <
class Po
intND>
307 assert(i < m_KnotVec.size() - 1 );
311 if ( (m_KnotVec[i]<=u) && ( u<m_KnotVec[i+1]) )
326 dDen1 = u - m_KnotVec[i];
327 dNum1 = m_KnotVec[i+n-1] - m_KnotVec[i];
329 dDen2 = m_KnotVec[i+n] - u;
330 dNum2 = m_KnotVec[i+n] - m_KnotVec[i+1];
334 N = dDen1 / dNum1 * evalBasis(u, i , n-1);
335 N += dDen2 / dNum2 * evalBasis(u, i+1 , n-1);
339 N = dDen2 / dNum2 * evalBasis(u, i+1 , n-1);
343 N = dDen1 / dNum1 * evalBasis(u, i , n-1);