Beispiel #1
0
/**
 * Calculate the interpolated curve points populating the uniqueVerts array.
 */
void Spline3::init() {
    for (int i = 0; i < controlPts.size(); i++) {
        //std::cout << "pre: controlPts.at(" << i << ") = " << controlPts.at(i) << std::endl;
    }


    // double up first and last control points
    controlPts.insert(controlPts.begin(), controlPts.at(0));
    controlPts.push_back(controlPts.at(controlPts.size() - 1));

    /*
    // add begin and end points based on vectors v1-v0 and v(n-1)-vn
    Vector3 delta = controlPts.at(1);
    delta -= controlPts.at(0);
    Vector3 newVec = controlPts.at(0) - delta;
    controlPts.insert(controlPts.begin(), newVec);

    delta = controlPts.at(controlPts.size() - 2);
    delta -= controlPts.at(controlPts.size() - 1);
    newVec = controlPts.at(controlPts.size() - 1) - delta;
    controlPts.push_back(newVec);
     */

    for (int i = 0; i < controlPts.size(); i++) {
        //std::cout << "Post: controlPts.at(" << i << ") = " << controlPts.at(i) << std::endl;
    }

    Vector3 v0, v1, v2, v3;
    float step = 1.0 / (interpDetail + 1);

    for (int i = 0; i < controlPts.size() - 3; i++) {
        v0 = controlPts.at(i);
        v1 = controlPts.at(i + 1);
        v2 = controlPts.at(i + 2);
        v3 = controlPts.at(i + 3);

        for (float t = 0; t < 1; t += step) {
            // new point between vn-vn+1
            Vector3 pt = (
                    ((v0*-1) + (v1 * 3) - (v2 * 3) + v3) * (t * t * t) +
                    ((v0 * 2) - (v1 * 5) + (v2 * 4) - v3) * (t * t) +
                    ((v0*-1) + v2) * t +
                    v1 * 2) * smoothness;
            verts.push_back(pt);
        }
    }
    // add last control point to verts vector
    verts.push_back(controlPts.at(controlPts.size() - 2));

    for (int i = 0; i < verts.size(); i++) {
        //  std::cout << "verts.at(" << i << ") = " << verts.at(i) << std::endl;
    }
    /* ensure tube section don't flip */
    parallelTransport();
}
Beispiel #2
0
 double Mesh :: vertexHolonomy(VertexIter vertex) const
 {
    double sum = 2.0*M_PI;
    HalfEdgeIter h = vertex->he;
    do
    {
       sum += parallelTransport(h);
       sum += connectionOneForm(h);
       h = h->flip->next;
    }
    while( h != vertex->he );
    return sum;
 }
Beispiel #3
0
 double Mesh :: generatorHolonomy(const Generator& cycle) const
 {
    double sum = 0.0;
    if( cycle.empty() ) return sum;
    
    for(unsigned k = 0; k < cycle.size(); ++k)
    {
       HalfEdgeIter h = cycle[k];
       sum += parallelTransport(h);
       sum += connectionOneForm(h);
    }
    
    while( sum <  0.0      ) sum += 2.0*M_PI;
    while( sum >= 2.0*M_PI ) sum -= 2.0*M_PI;
    return sum;
 }