スプライン その 8
制御点から,曲線の 1 点を求める.
Vd4 b_spline (const Vd4A& pnts,c_v_double& knot,const size_t order,const double t_)
{
double t = t_ ;
Vd4 pnt ;
if (knot.size() == 0) { return pnt ; }
double v0 = knot[0] ;
double v1 = knot[knot.size()-1] ;
if (v0 > v1) { return pnt ; }
if (t < v0) { t = v0 ; }
if (v1 < t) { t = v1 ; }
for (size_t i=0 ; i<pnts.size() ; i++) {
double bs = ::BS_basis(t,knot,order,i) ;
double w = pnts[i].w ;
pnt.x += pnts[i].x * bs * w ;
pnt.y += pnts[i].y * bs * w ;
pnt.z += pnts[i].z * bs * w ;
pnt.w += pnts[i].w * bs ;
}
if (pnt.w != 0) {
Vd3 pt3 = Vd3(pnt.x,pnt.y,pnt.z) ;
pnt = Vd4(pt3/pnt.w,pnt.w) ;
}
return pnt ;
}
曲線を求めるループ部分
{
// ...
Vd4A vd3a ;
double v0 = knot[0] ;
double v1 = knot[knot.size()-1] ;
double vt = (v1-v0) / div_c ;
size_t count = 0 ;
for (double j=v0 ; count<=div_c && j<v1*1.0001 ; j+=vt , count++)
{
double t = j ;
if (count == div_c) { t = v1 ; }
Vd4 pnt = ::b_spline(pnts,knot,order,t) ;
vd3a.push_back(pnt) ;
}
return vd3a ;
}
前回のコードでは
今回のコード