スプライン その 4
Rational B-Spline
Vd4A b_spline (const Vd4& q0,const Vd4& q1,const Vd4& q2,const Vd4& q3,const long div_c)
{
Vd4A vd3a ;
for (long index=0 ; index<=div_c ; index++) {
double t = 1./div_c*index ;
double n0 = 1./6 * (1.-t)*(1.-t)*(1.-t) ;
double n1 = 1./2 * t*t*t - t*t + 2./3 ;
double n2 =-1./2 * t*t*t + 1./2 * t*t + 1./2 *t + 1./6 ;
double n3 = 1./6 * t*t*t ;
double px = ( (n0*q0.x)*q0.w + (n1*q1.x)*q1.w + (n2*q2.x)*q2.w + (n3*q3.x)*q3.w ) / ((n0)*q0.w + (n1)*q1.w + (n2)*q2.w + (n3)*q3.w) ;
double py = ( (n0*q0.y)*q0.w + (n1*q1.y)*q1.w + (n2*q2.y)*q2.w + (n3*q3.y)*q3.w ) / ((n0)*q0.w + (n1)*q1.w + (n2)*q2.w + (n3)*q3.w) ;
double pz = ( (n0*q0.z)*q0.w + (n1*q1.z)*q1.w + (n2*q2.z)*q2.w + (n3*q3.z)*q3.w ) / ((n0)*q0.w + (n1)*q1.w + (n2)*q2.w + (n3)*q3.w) ;
double pw = ( (n0*q0.w)*q0.w + (n1*q1.w)*q1.w + (n2*q2.w)*q2.w + (n3*q3.w)*q3.w ) / ((n0)*q0.w + (n1)*q1.w + (n2)*q2.w + (n3)*q3.w) ;
vd3a.push_back(Vd4(px,py,pz,pw)) ;
}
return vd3a ;
}
pw は,1 とすべきなのか,これで良いのかは不明.
次の P の配列に対してのロジックは前回のものと同様で,Vd4 に変更.
Vd4A b_spline (const Vd4A& pnts_,const long div_n=2)
v_Vd4A b_spline (const v_Vd4A& v_pnts_,const long div_n=2)
与えたデータは,
10, 0, 0, 1
10,10, 0, 1
0,10, 0, 1
// x, y, z, w
10,10,0 の w の部分を 0.0 , 0.5 , 0.7 , 1 , 2 , 3 としたもの