Пример #1
0
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);
}
Пример #2
0
 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;
     }
 }
Пример #3
0
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;
}