Пример #1
0
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;
}