ON_NurbsSurface SequentialFitter::compute (bool assemble) { FittingSurface* fitting; ON_NurbsSurface nurbs; FittingSurface::Parameter paramFP (m_params.forceInterior, m_params.stiffnessInterior, 0.0, m_params.forceBoundary, m_params.stiffnessBoundary, 0.0); // int surfid = -1; // TomGine::tgRenderModel nurbs; // TomGine::tgRenderModel box; if (m_data.boundary.size () > 0) { // throw std::runtime_error("[SequentialFitter::compute] Error: empty boundary point-cloud.\n"); compute_quadfit (); nurbs = FittingSurface::initNurbs4Corners (m_params.order, m_corners[0], m_corners[1], m_corners[2], m_corners[3]); fitting = new FittingSurface (&m_data, nurbs); if (assemble) fitting->assemble (paramFP); compute_refinement (fitting); compute_boundary (fitting); } else { if (this->m_have_corners) { nurbs = FittingSurface::initNurbs4Corners (m_params.order, m_corners[0], m_corners[1], m_corners[2], m_corners[3]); fitting = new FittingSurface (&m_data, nurbs); if (assemble) fitting->assemble (paramFP); } else { fitting = new FittingSurface (m_params.order, &m_data); if (assemble) fitting->assemble (m_params.stiffnessInterior); int ncv0 = fitting->m_nurbs.m_cv_count[0]; int ncv1 = fitting->m_nurbs.m_cv_count[1]; fitting->m_nurbs.GetCV (0, 0, m_corners[0]); fitting->m_nurbs.GetCV (ncv0 - 1, 0, m_corners[1]); fitting->m_nurbs.GetCV (ncv0 - 1, ncv1 - 1, m_corners[2]); fitting->m_nurbs.GetCV (0, ncv1 - 1, m_corners[3]); Eigen::Vector3d v0 (m_corners[0].x, m_corners[0].y, m_corners[0].z); Eigen::Vector3d v1 (m_corners[1].x, m_corners[1].y, m_corners[1].z); Eigen::Vector3d v2 (m_corners[2].x, m_corners[2].y, m_corners[2].z); Eigen::Vector3d v3 (m_corners[3].x, m_corners[3].y, m_corners[3].z); if (is_back_facing (v0, v1, v2, v3)) { ON_3dPoint tmp[4]; tmp[0] = m_corners[0]; tmp[1] = m_corners[1]; tmp[2] = m_corners[2]; tmp[3] = m_corners[3]; m_corners[3] = tmp[0]; m_corners[2] = tmp[1]; m_corners[1] = tmp[2]; m_corners[0] = tmp[3]; delete (fitting); nurbs = FittingSurface::initNurbs4Corners (m_params.order, m_corners[0], m_corners[1], m_corners[2], m_corners[3]); fitting = new FittingSurface (&m_data, nurbs); if (assemble) fitting->assemble (paramFP); } for (int r = 0; r < m_params.refinement; r++) { fitting->refine (0); fitting->refine (1); } } } if (m_data.interior.size () > 0) compute_interior (fitting); // update error fitting->assemble (); m_nurbs = fitting->m_nurbs; delete (fitting); return m_nurbs; }