//=========================================================================== SplineSurface* LoftSurfaceCreator::loftSurfaceFromUnifiedCurves(vector<shared_ptr<SplineCurve> >::iterator first_curve, vector<double>::iterator first_param, int nmb_crvs) //=========================================================================== { SplineSurface* surf = loftNonrationalSurface(first_curve, first_param, nmb_crvs); if (first_curve[0]->rational()) { int n = surf->numCoefs_u() * surf->numCoefs_v(); int kdim = surf->dimension() + 1; bool all_positive = true; vector<double>::const_iterator it = surf->rcoefs_begin(); it += (kdim - 1); for (int i = 0; i < n; ++i) if (it[kdim * i] <= 0.0) { all_positive = false; break; } if (!all_positive) { delete surf; surf = loftRationalSurface(first_curve, first_param, nmb_crvs); } } return surf; }
//=========================================================================== vector<shared_ptr<SplineSurface> > SurfaceCreators::separateRationalParts(const SplineSurface& sf) //=========================================================================== { bool rat = sf.rational(); ASSERT(rat); int dim= sf.dimension(); int rdim = dim + 1; vector<shared_ptr<SplineSurface> > sep_sfs; vector<double> coefs(sf.coefs_begin(), sf.coefs_end()); int nmb1 = sf.numCoefs_u(); int nmb2 = sf.numCoefs_v(); vector<double> rcoefs; int num_coefs = nmb1*nmb2; vector<double>::const_iterator rcoef_iter = sf.rcoefs_begin(); for (int ki = 0; ki < num_coefs; ++ki) { rcoefs.push_back(rcoef_iter[ki*rdim+1]); for (int kj = 0; kj < dim; ++kj) { coefs[ki*dim+kj] /= (rcoefs.back()); } } sep_sfs.push_back(shared_ptr<SplineSurface> (new SplineSurface(nmb1, nmb2, sf.order_u(), sf.order_v(), sf.basis_u().begin(), sf.basis_v().begin(), coefs.begin(), dim))); sep_sfs.push_back(shared_ptr<SplineSurface> (new SplineSurface(nmb1, nmb2, sf.order_u(), sf.order_v(), sf.basis_u().begin(), sf.basis_v().begin(), rcoefs.begin(), 1))); return sep_sfs; }
//========================================================================== void cart_to_bary(const SplineSurface& sf, const BaryCoordSystem3D& bc, SplineSurface& sf_bc) //========================================================================== { ALWAYS_ERROR_IF(sf.dimension() != 3, "Dimension must be 3."); int nu = sf.numCoefs_u(); int nv = sf.numCoefs_v(); Vector3D cart; Vector4D bary; vector<double> new_coefs; if (!sf.rational()) { new_coefs.resize(4 * nu * nv); for (int iv = 0; iv < nv; ++iv) { for (int iu = 0; iu < nu; ++iu) { int offset = nu * iv + iu; cart = Vector3D(sf.coefs_begin() + 3 * offset); bary = bc.cartToBary(cart); for (int j = 0; j < 4; ++j) { new_coefs[4*offset + j] = bary[j]; } } } } else { new_coefs.resize(5 * nu * nv); for (int iv = 0; iv < nv; ++iv) { for (int iu = 0; iu < nu; ++iu) { int offset = nu * iv + iu; cart = Vector3D(sf.coefs_begin() + 3 * offset); bary = bc.cartToBary(cart); double w = sf.rcoefs_begin()[4*offset + 3]; for (int j = 0; j < 4; ++j) { new_coefs[5*offset + j] = bary[j] * w; } new_coefs[5*offset + 4] = w; } } } sf_bc = SplineSurface(nu, nv, sf.order_u(), sf.order_v(), sf.basis_u().begin(), sf.basis_v().begin(), new_coefs.begin(), 4, sf.rational()); return; }