bool Optimize::eval_g(Ipopt::Index n, const Ipopt::Number *x, bool new_x, Ipopt::Index m, Ipopt::Number *g) { UNUSED(n); UNUSED(m); UNUSED(new_x); if (updateCross(x) == false) return false; int i = 0, size = edges.size(); for (; i < size; i++) g[i] = computeEdgeLength(i, x); i = size; int end = edges.size() + crosses.size(); for (; i < end; ++i) { g[i] = computeCrossDiagDistance(i - size, x); } return true; }
double TriMesh::computeMaxEdgeLength() const { double maxLen = 0.0; for (unsigned face = 0; face < numFaces(); ++face) { std::vector<unsigned> fVerts; getFaceVerts(face, fVerts); assert(fVerts.size() == 3); for (unsigned i = 0; i < 3; ++i) { unsigned vert0 = fVerts[(i+1)%3]; unsigned vert1 = fVerts[(i+2)%3]; double len = computeEdgeLength(vert0, vert1); maxLen = std::max(maxLen, len); } } return maxLen; }