void SequentialFitter::compute_quadfit () { ON_NurbsSurface nurbs; if (m_have_corners) { nurbs = FittingSurface::initNurbs4Corners (2, m_corners[0], m_corners[1], m_corners[2], m_corners[3]); } else { nurbs = FittingSurface::initNurbsPCA (2, &m_data); nurbs.GetCV (0, 0, m_corners[0]); nurbs.GetCV (1, 0, m_corners[1]); nurbs.GetCV (1, 1, m_corners[2]); nurbs.GetCV (0, 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]; nurbs = FittingSurface::initNurbs4Corners (2, m_corners[0], m_corners[1], m_corners[2], m_corners[3]); } } FittingSurface fitting (&m_data, nurbs); FittingSurface::Parameter paramFP (m_params.forceInterior, 1.0, 0.0, m_params.forceBoundary, 1.0, 0.0); // Quad fitting // if( !m_quiet && m_dbgWin != NULL ) // NurbsConvertion::Nurbs2TomGine(m_dbgWin, *fitting->m_nurbs, m_surf_id, m_params.resolution); for (int r = 0; r < m_params.iterationsQuad; r++) { fitting.assemble (paramFP); fitting.solve (); } fitting.m_nurbs.GetCV (0, 0, m_corners[0]); fitting.m_nurbs.GetCV (1, 0, m_corners[1]); fitting.m_nurbs.GetCV (1, 1, m_corners[2]); fitting.m_nurbs.GetCV (0, 1, m_corners[3]); }
void ClosingBoundary::optimizeBoundary (std::vector<ON_NurbsSurface> &nurbs_list, std::vector<NurbsDataSurface> &data_list, Parameter param) { for (unsigned n1 = 0; n1 < nurbs_list.size (); n1++) data_list[n1].clear_boundary (); // for each nurbs for (unsigned n1 = 0; n1 < nurbs_list.size (); n1++) { // for (unsigned n1 = 0; n1 < 1; n1++) { ON_NurbsSurface *nurbs1 = &nurbs_list[n1]; // sample point list from nurbs1 vector_vec3d boundary1; vector_vec2d params1; sampleFromBoundary (nurbs1, boundary1, params1, param.samples); // for each other nurbs for (unsigned n2 = (n1 + 1); n2 < nurbs_list.size (); n2++) { ON_NurbsSurface *nurbs2 = &nurbs_list[n2]; // for all points in the point list for (unsigned i = 0; i < boundary1.size (); i++) { double error; Eigen::Vector3d p, tu, tv; Eigen::Vector3d p0 = boundary1[i]; Eigen::Vector2d params1, params2; switch (param.type) { case COMMON_BOUNDARY_POINT_MEAN: p = commonBoundaryPoint1 (*nurbs1, *nurbs2, params1, params2, p0, param.com_iter, error, param.accuracy); break; case COMMON_BOUNDARY_POINT_TANGENTS: p = commonBoundaryPoint2 (*nurbs1, *nurbs2, params1, params2, p0, param.com_iter, error, param.accuracy); break; case COMMON_BOUNDARY_POINT_PLANES: p = commonBoundaryPoint3 (*nurbs1, *nurbs2, params1, params2, p0, param.com_iter, error, param.accuracy); break; case CLOSEST_POINTS_INTERIOR: params1 = FittingSurface::findClosestElementMidPoint (*nurbs2, p0); FittingSurface::inverseMapping (*nurbs2, p0, params1, error, p, tu, tv, param.com_iter, param.accuracy, true); break; case CLOSEST_POINTS_BOUNDARY: FittingSurface::inverseMappingBoundary (*nurbs2, p0, error, p, tu, tv, param.com_iter, param.accuracy, true); break; } double dist = (p - p0).norm (); if (error < param.max_error && dist < param.max_dist) { data_list[n1].boundary.push_back (p); data_list[n2].boundary.push_back (p); } } } // for each other nurbs // nurbs fitting FittingSurface fit (&data_list[n1], nurbs_list[n1]); FittingSurface::Parameter paramFP (1.0, param.smoothness, 0.0, 1.0, param.smoothness, 0.0); std::vector<double> wBnd, wInt; for (unsigned i = 0; i < data_list[n1].boundary.size (); i++) data_list[n1].boundary_weight.push_back (param.boundary_weight); for (unsigned i = 0; i < data_list[n1].interior.size (); i++) data_list[n1].interior_weight.push_back (param.interior_weight); for (unsigned i = 0; i < param.fit_iter; i++) { fit.assemble (paramFP); fit.solve (); } nurbs_list[n1] = fit.m_nurbs; } // for each nurbs }