void Reg::popStack(vector<GraphPart> &s, vector<ope> &o){ //pop the first priority operator switch (*(o.end() - 1)){ case ope::and: *(s.end() - 2) = mergeGraph(0, *(s.end() - 2), *(s.end() - 1)); s.pop_back(); break; case ope::or: *(s.end() - 2) = mergeGraph(1, *(s.end() - 2), *(s.end() - 1)); s.pop_back(); break; case ope::rep: *(s.end() - 1) = repeatGraph(0, *(s.end() - 1)); break; case ope::prep: *(s.end() - 1) = repeatGraph(1, *(s.end() - 1)); break; case ope::able: NFAs.addEdge((s.end() - 1)->begin, (s.end() - 1)->end, 0); break; } o.pop_back(); };
void ObjectClusterer::MergeLargePlanes() { ConvexDeterminerType convexityDeterminer = std::bind(&ObjectClusterer::DetermineConvexity, this, std::placeholders::_1, std::placeholders::_2); MergeableGraph mergeGraph(planes, convexityDeterminer); for(size_t i=0; i<planes.size()-1; ++i) // from largest to smallest { for(size_t k=i+1; k<planes.size(); ++k) { if(ArePlanesInTheSameObject(planes[i], planes[k])) mergeGraph.AddConnection(i, k); } } MergePlanesThroughTree(mergeGraph); }