bool ElementMaxQM::evaluate( PatchData& pd, size_t handle, double& value, MsqError& err ) { ElemSampleQM* qm = get_quality_metric(); mHandles.clear(); qm->get_element_evaluations( pd, handle, mHandles, err ); MSQ_ERRFALSE(err); bool valid = true; double tmpval; bool tmpvalid; value = -1.e+100; // initialize max computation for (std::vector<size_t>::iterator h = mHandles.begin(); h != mHandles.end(); ++h) { tmpvalid = qm->evaluate( pd, *h, tmpval, err ); // MSQ_ERRZERO(err); if (!tmpvalid) { value = +1.e+100; return false; // if any handle within the element makes tmpvalid false, then valid is false, no matter what the other handles say } else if (tmpval > value) value = tmpval; } return valid; }
bool ElementAvgQM::evaluate( PatchData& pd, size_t handle, double& value, MsqError& err ) { ElemSampleQM* qm = get_quality_metric(); mHandles.clear(); qm->get_element_evaluations( pd, handle, mHandles, err ); MSQ_ERRFALSE(err); bool valid = true; double tmpval; double accumulate = 0.0; int num_values = 0; bool tmpvalid; value = -std::numeric_limits<double>::infinity(); for (std::vector<size_t>::iterator h = mHandles.begin(); h != mHandles.end(); ++h) { tmpvalid = qm->evaluate( pd, *h, tmpval, err ); MSQ_ERRZERO(err); if (!tmpvalid) { valid = false; break; } else { accumulate += tmpval; num_values++; } } if (valid) value = accumulate/num_values; return valid; }