スプライン その 3


うまく表示できていると思っていたが,データの値を見ると最初と最後の点を通っていない.
FreeSurf_e_3.html
赤い面の範囲は (0,0,-1) - (100,80,1)

2 点から 7 点の線
	
	3 点までは前回で対応できていたみたいだが,4 点以上になると通っていない.

Vd3A b_spline (const Vd3A& pnts_,const long div_n=2) { Vd3A pnts = pnts_ ; if (pnts.size() < 3) { return pnts ; } Vd3A vd3a ; bool p_open = true ; { Vd3 p0p = pnts[0] ; Vd3 plp = pnts[pnts.size()-1] ; Vd3 p_0 = pnts[0] ; Vd3 p_l = pnts[pnts.size()-1] ; bool is_same = true ; { for (size_t index=1 ; index<pnts.size() ; index++) { if (p_0 != pnts[index]) { is_same = false ; break ; } } } if (!is_same && p_0 == p_l) { // close p0p = pnts[pnts.size()-2] ; plp = pnts[1] ; p_open = false ; } pnts.insert(pnts.begin(),p0p) ; pnts.insert(pnts.end (),plp) ; } { { // 0,1,2 if (p_open) { Vd3 p0 = pnts[0] ; Vd3 p1 = pnts[0] ; Vd3 p2 = pnts[1] ; Vd3 p3 = pnts[2] ; Vd3A vd_0 = ::b_spline(p0,p1,p2,p3,div_n) ; vd3a.insert(vd3a.end(),vd_0.begin(),vd_0.end()) ; } } { // 1 - (n-2) for (size_t index=3 ; index<pnts.size() ; index++) { Vd3 p0 = pnts[index-3] ; Vd3 p1 = pnts[index-2] ; Vd3 p2 = pnts[index-1] ; Vd3 p3 = pnts[index-0] ; Vd3A vd__ = ::b_spline(p0,p1,p2,p3,div_n) ; if (vd3a.size()>0 && vd__.size()>0) { Vd3 pl = vd3a[vd3a.size()-1] ; Vd3 pn = vd__[0] ; if (::V3_is_near(pl,pn)) { vd3a.pop_back() ; } } vd3a.insert(vd3a.end(),vd__.begin(),vd__.end()) ; } } { // n-3,n-2,n-1 if (p_open) { Vd3 p0 = pnts[pnts.size()-3] ; Vd3 p1 = pnts[pnts.size()-2] ; Vd3 p2 = pnts[pnts.size()-1] ; Vd3 p3 = pnts[pnts.size()-1] ; Vd3A vd_l = ::b_spline(p0,p1,p2,p3,div_n) ; if (vd3a.size()>0 && vd_l.size()>0) { Vd3 pl = vd3a[vd3a.size()-1] ; Vd3 pn = vd_l[0] ; if (::V3_is_near(pl,pn)) { vd3a.pop_back() ; } } vd3a.insert(vd3a.end(),vd_l.begin(),vd_l.end()) ; } } } return vd3a ; } FreeSurf_e_4.html
上の面,下の面にあたる制御点を複数にすると,
9,5 9,7 9,9
0,100,-100 0,100,-100 0,100,-100
100,100,-100 100,100,-100
100,100,-100
100,100,-100
100,100,-100
100,100,-100
100,100,0 100,100,0 100,100,0
100,100,100 100,100,100
100,100,100
100,100,100
100,100,100
100,100,100
0,100,100 0,100,100 0,100,100
0,100,-100 0,100,-100 0,100,-100
100,200,-100 100,200,-100
100,200,-100
100,200,-100
100,200,-100
100,200,-100
100,200,0 100,200,0 100,200,0
100,200,100 100,200,100
100,200,100
100,200,100
100,200,100
100,200,100
0,100,100 0,100,100 0,100,100