MGSBRep::MGSBRep( //BLGI2D const MGSPointSeq& points, //Point seq data int& error, //Error flag. unsigned orderu, // Order of u-direction unsigned orderv) // Order of v-direction // Construct Surface B-rep by intepolation from Point data only. :MGSurface() ,m_surface_bcoef(points.length_u(), points.length_v(), points.sdim()) { MGNDDArray utau, vtau; size_t lenu=points.length_u(), lenv=points.length_v(); size_t lenuv=lenu*lenv; size_t len=lenu; if(len<lenv) len=lenv; size_t order=orderu; if(order<orderv) order=orderv; if(lenu<orderu || lenv<orderv) {error=-1; return;} size_t usize=points.capacity_u(); size_t ncd=points.sdim(); double* q=new double[len*(2*order-1)]; double* work=new double[len]; double* work2=new double[lenuv*ncd]; compute_knot(points, orderu, orderv, utau, vtau); error=2; for(size_t k=0; k<ncd; k++){ blgi2d_(&error,utau.data(),points.data(0,0,k),m_uknot.data(), orderu,lenu,lenv,usize,lenv,work,q,work2+lenuv*k); if(error!=1) break; } if(error==1){ error=2; for(size_t k=0; k<ncd; k++){ blgi2d_(&error,vtau.data(),work2+lenuv*k,m_vknot.data(), orderv,lenv,lenu,lenv,lenu,work,q,&m_surface_bcoef(0,0,k)); if(error!=1) break; } if(error!=1) error=13; //Error detected in v-direction. } else error=12; //Error detected in u-direction. if(error==1){ error=0; m_surface_bcoef.set_length(lenu, lenv); } delete[] q; delete[] work; delete[] work2; }
// wasteful! should only update a knot between the x's, but adding // an x will change two knots void Tn2Sampler::refresh_knots(){ knots.resize(x.size()+1); knots[0] = x[0]; knots.back() = x.back(); for(uint i=1; i<knots.size()-1; ++i) knots[i] = compute_knot(i); }