Example #1
0
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;
}
Example #2
0
 // 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);
 }