예제 #1
0
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();
};
예제 #2
0
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);
}