// ============================================================================= bool Mesh2DUtils::identify_patch_upper_right(const Mesh2D&m, double u, double v, int& x_ix, int& y_ix) // ============================================================================= { double tol = 1.0e-9; x_ix = first_larger_knotvalue_ix(m, XFIXED, u); y_ix = first_larger_knotvalue_ix(m, YFIXED, v); // adjustment of index if positioned _exactly_ at upper bound of grid if ((x_ix == m.numDistinctKnots(XFIXED) - 1) && (fabs(u-m.maxParam(XFIXED) < tol))) --x_ix; if ((y_ix == m.numDistinctKnots(YFIXED) - 1) && (fabs(v-m.maxParam(YFIXED) < tol))) --y_ix; // checking if a valid corner was found if (x_ix == 0 || x_ix >= m.numDistinctKnots(XFIXED)) return false; // u outside domain if (y_ix == 0 || y_ix >= m.numDistinctKnots(YFIXED)) return false; // v outside domain // We have now found the largest smaller knot in the u and v direction. From here we // can search downwards to the lower-left corner of the containing mesh element, which // defines the sought-for "patch" of the surface. x_ix = search_upwards_for_nonzero_multiplicity(m, XFIXED, x_ix, y_ix); y_ix = search_upwards_for_nonzero_multiplicity(m, YFIXED, y_ix, x_ix); return true; }
// ============================================================================= int Mesh2DUtils::first_larger_knotvalue_ix(const Mesh2D& m, Direction2D d, double par) // ============================================================================= { int ix = last_nonlarger_knotvalue_ix(m, d, par); if (ix < m.numDistinctKnots(d)-1) ix++; return ix; }
//============================================================================== int Mesh2DUtils::search_upwards_for_nonzero_multiplicity(const Mesh2D& m, Direction2D d, int start_ix, int other_ix) //============================================================================== { // provided that the mesh is a valid LR mesh, a valid index should always be found. int ix; for (ix = start_ix; ix != m.numDistinctKnots(d) && m.nu(d, ix, other_ix - 1, other_ix) == 0; ++ix); return ix; // @@ not yet tested! }