Ipopt::Number Optimize::computeEdgeLength(int i, const Ipopt::Number *x) { Ipopt::Number e[3]; const Ipopt::Number *pv, *nv; pv = EdgePrevVertex(i, x); nv = EdgeNextVertex(i, x); sub(nv, pv, e); return sqrnorm(e); }
bool includes(T dirang, const vec<T,N>& b, bool lin_flag) { auto cen_ = this->cen(); auto rad_ = this->rad(); auto ir = 1/rad_; /* inverses */ auto pos = b - cen_; if (dirang != 0.0f) { vec<T,N>array_rot(&pos, 1, NULL, dirang); } /* rotate */ if (lin_flag) { return l1norm(pos*ir) < 1; } else { return sqrnorm(pos*ir) < 1; } }
bool Optimize::eval_f(Ipopt::Index n, const Ipopt::Number *x, bool new_x, Ipopt::Number &obj_value) { UNUSED(n); UNUSED(new_x); if (updateCross(x) == false) return false; obj_value = 0; PointArray px = PointArray(x); Ipopt::Number t[3]; Ipopt::Number r = 0; double tmp; int i = 0, size = EnergyVertices.size(); for (; i < size; i++) { obj_value += computeBeta(i, x) / VerticesWeight[i]; } obj_value *= 2 * pOp->BendingEnergyCoef; i = 0; size = PositionConstraints.size(); for (; i < size; i++) { sub(px(PositionConstraints[i]), positions[i].data(), t); r += sqrnorm(t); } r *= pOp->PositionConstraintsWeight; obj_value += r; r = 0; i = 0; size = TangentConstraints.size(); for (; i < size; ++i) { computeTangentEdge(i, x, t); r += 1 - dot(t, tangents[i].data()); } obj_value += r * pOp->TangentConstraintsCoef; r = 0; i = 0; size = PlaneConstraints.size(); for (; i < size; ++i) { tmp = (getPoint(PlaneConstraints[i], x) | PlaneConstraintsInfo[i].first) + PlaneConstraintsInfo[i].second; r += tmp * tmp; } obj_value += r * pOp->PlaneConstraintsCoef; return true; }