/*private*/
vector<MaximalEdgeRing*> *
PolygonBuilder::buildMinimalEdgeRings(vector<MaximalEdgeRing*> *maxEdgeRings,
	vector<EdgeRing*> *newShellList, vector<EdgeRing*> *freeHoleList)
{
	vector<MaximalEdgeRing*> *edgeRings=new vector<MaximalEdgeRing*>();
	for(size_t i=0, n=maxEdgeRings->size(); i<n; ++i)
	{
		MaximalEdgeRing *er=(*maxEdgeRings)[i];
#if GEOS_DEBUG
	cerr<<"buildMinimalEdgeRings: maxEdgeRing "<<i<<" has "<<er->getMaxNodeDegree()<<" maxNodeDegree"<<endl;
#endif
		if (er->getMaxNodeDegree()>2)
		{
			er->linkDirectedEdgesForMinimalEdgeRings();
			vector<MinimalEdgeRing*> *minEdgeRings=er->buildMinimalRings();
			// at this point we can go ahead and attempt to place
			// holes, if this EdgeRing is a polygon
			EdgeRing *shell=findShell(minEdgeRings);
			if(shell != NULL)
			{
				placePolygonHoles(shell, minEdgeRings);
				newShellList->push_back(shell);
			}
			else
			{
				freeHoleList->insert(
						freeHoleList->end(),
						minEdgeRings->begin(),
						minEdgeRings->end() );
			}
			delete er;
			delete minEdgeRings;
		}
		else
		{
			edgeRings->push_back(er);
		}
	}
	return edgeRings;
}
Пример #2
0
/*private*/
void
PolygonBuilder::buildMinimalEdgeRings(
  vector<MaximalEdgeRing*> &maxEdgeRings,
	vector<EdgeRing*> &newShellList, vector<EdgeRing*> &freeHoleList,
	vector<MaximalEdgeRing*> &edgeRings)
{
	for(size_t i=0, n=maxEdgeRings.size(); i<n; ++i)
	{
		MaximalEdgeRing *er = maxEdgeRings[i];
#if GEOS_DEBUG
	cerr<<"buildMinimalEdgeRings: maxEdgeRing "<<i<<" has "<<er->getMaxNodeDegree()<<" maxNodeDegree"<<endl;
#endif
		if (er->getMaxNodeDegree()>2)
		{
			er->linkDirectedEdgesForMinimalEdgeRings();
			vector<MinimalEdgeRing*> minEdgeRings;
			er->buildMinimalRings(minEdgeRings);
			// at this point we can go ahead and attempt to place
			// holes, if this EdgeRing is a polygon
			EdgeRing *shell=findShell(&minEdgeRings);
			if(shell != NULL)
			{
				placePolygonHoles(shell, &minEdgeRings);
				newShellList.push_back(shell);
			}
			else
			{
				freeHoleList.insert(freeHoleList.end(),
						minEdgeRings.begin(),
						minEdgeRings.end() );
			}
			delete er;
		}
		else
		{
			edgeRings.push_back(er);
		}
	}
}