/** * 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(); }
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; }
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; }