/* $Id$ * * Copyright (c) 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com). * * This file is part of OpenCAMlib * (see https://github.com/aewallin/opencamlib). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include #include #include #include "weave.hpp" namespace ocl { namespace weave { int VertexProps::count = 0; void Weave::addFiber(Fiber& f) { if ( f.dir.xParallel() && !f.empty() ) { xfibers.push_back(f); } else if ( f.dir.yParallel() && !f.empty() ) { yfibers.push_back(f); } else if (!f.empty()) { assert(0); // fiber must be either x or y } } // traverse the graph putting loops of vertices into the loops variable // this figure illustrates next-pointers: http://www.anderswallin.net/wp-content/uploads/2011/05/weave2_zoom.png void Weave::face_traverse() { // std::cout << " traversing graph with " << clVertexSet.size() << " cl-points\n"; while ( !clVertexSet.empty() ) { // while unprocessed cl-vertices remain std::vector loop; // start on a new loop Vertex current = *(clVertexSet.begin()); Vertex first = current; do { // traverse around the loop assert( g[current].type == CL ); // we only want cl-points in the loop loop.push_back(current); clVertexSet.erase(current); // remove from set of unprocesser cl-verts std::vector outEdges = g.out_edges(current); // find the edge to follow //if (outEdges.size() != 1 ) // std::cout << " outEdges.size() = " << outEdges.size() << "\n"; assert( outEdges.size() == 1 ); // cl-points are always at ends of intervals, so they have only one out-edge Edge currentEdge = outEdges[0]; do { // following next, find a CL point current = g.target(currentEdge); currentEdge = g[currentEdge].next; } while ( g[current].type != CL ); } while (current!=first); // end the loop when we arrive at the start loops.push_back(loop); // add the processed loop to the master list of all loops } } std::vector< std::vector > Weave::getLoops() const { std::vector< std::vector > loop_list; BOOST_FOREACH( std::vector loop, loops ) { std::vector point_list; BOOST_FOREACH( Vertex v, loop ) { point_list.push_back( g[v].position ); } loop_list.push_back(point_list); } return loop_list; } // this can cause a build error when both face and vertex descriptors have the same type // i.e. unsigned int (?) // operator[] below "g[*itr].type" then looks for FaceProps.type which does not exist... void Weave::printGraph() { std::cout << " number of vertices: " << g.num_vertices() << "\n"; std::cout << " number of edges: " << g.num_edges() << "\n"; int n=0, n_cl=0, n_internal=0; BOOST_FOREACH(Vertex v, g.vertices() ) { if ( g[v].type == CL ) ++n_cl; else ++n_internal; ++n; } std::cout << " counted " << n << " vertices\n"; std::cout << " CL-nodes: " << n_cl << "\n"; std::cout << " internal-nodes: " << n_internal << "\n"; } // string representation std::string Weave::str() { std::ostringstream o; o << "Weave2\n"; o << " " << xfibers.size() << " X-fibers\n"; o << " " << yfibers.size() << " Y-fibers\n"; return o.str(); } } // end weave namespace } // end ocl namespace // end file weave.cpp