void AnalysisExpander::findAllEndPoints(EnsancheBuilding building, vector<int>sideIds,endPoints * nEnds) { nEnds->pts.clear(); nEnds->ids.clear(); nEnds->sideToEndPt.clear(); for( int i = 0; i < 4; i++) { findEndPoints(building, i, sideIds, nEnds); } }
/* Given an angularly ordered tree (vertices), construct a set of contours where each contour describe a branch of the tree. */ vector<ContourEQW> extractPathTree(vector<Vertex<FragmentInfo>*>& vertices, vector<ContourEQW>& contours) { vector<ContourEQW> tree; vector<Node<Vertex<FragmentInfo>*>*> vnodes; for(int i=0; i<vertices.size(); ++i) { vnodes.push_back(makeset(vertices[i])); } vector<Vertex<FragmentInfo>*> ends = findEndPoints(vertices); for(int i=0; i<ends.size(); ++i) { Vertex<FragmentInfo>* p = ends[i]; vector<Vertex<FragmentInfo>*> path; while(true) { path.push_back(p); if(p->pi == NULL) { break; } int k = distance(vertices.begin(), find(vertices.begin(), vertices.end(), p->pi)); if(k < vnodes.size() && vnodes[k]->parent == vnodes[k]) { merge(vnodes[i], vnodes[k]); p = p->pi; } else { path.push_back(p->pi); break; } } tree.push_back(stitchContour(path, contours)); } for(int i=0; i<vnodes.size(); ++i) { delete vnodes[i]; vnodes[i] = 0; } return tree; }