/*private*/ void PolygonBuilder::buildMaximalEdgeRings(const vector<DirectedEdge*> *dirEdges, vector<MaximalEdgeRing*> &maxEdgeRings) // throw(const TopologyException &) { #if GEOS_DEBUG cerr<<"PolygonBuilder::buildMaximalEdgeRings got "<<dirEdges->size()<<" dirEdges"<<endl; #endif vector<MaximalEdgeRing*>::size_type oldSize = maxEdgeRings.size(); for(size_t i=0, n=dirEdges->size(); i<n; i++) { DirectedEdge *de=(*dirEdges)[i]; #if GEOS_DEBUG cerr << " dirEdge " << i << endl << de->printEdge() << endl << " inResult:" << de->isInResult() << endl << " isArea:" << de->getLabel()->isArea() << endl; #endif if (de->isInResult() && de->getLabel().isArea()) { // if this edge has not yet been processed if (de->getEdgeRing() == NULL) { MaximalEdgeRing *er; try { // MaximalEdgeRing constructor may throw er=new MaximalEdgeRing(de,geometryFactory); } catch (util::GEOSException&) { // cleanup if that happens (see stmlf-cases-20061020.xml) for(size_t i=oldSize, n=maxEdgeRings.size(); i<n; i++) delete maxEdgeRings[i]; //cerr << "Exception! " << e.what() << endl; throw; } maxEdgeRings.push_back(er); er->setInResult(); //System.out.println("max node degree=" + er.getMaxDegree()); } } } #if GEOS_DEBUG cerr<<" pushed "<<maxEdgeRings.size()-oldSize<<" maxEdgeRings"<<endl; #endif }
/*private*/ void ConnectedInteriorTester::buildEdgeRings(std::vector<EdgeEnd*> *dirEdges, std::vector<EdgeRing*>& minEdgeRings) { #if GEOS_DEBUG cerr << __FUNCTION__ << " got " << dirEdges->size() << " EdgeEnd vector" << endl; #endif typedef std::vector<EdgeEnd*> EdgeEnds; //std::vector<MinimalEdgeRing*> minEdgeRings; for(EdgeEnds::size_type i=0, n=dirEdges->size(); i<n; ++i) { #ifdef GEOS_CAST_PARANOIA assert(dynamic_cast<DirectedEdge*>((*dirEdges)[i])); #endif DirectedEdge *de=static_cast<DirectedEdge*>((*dirEdges)[i]); #if GEOS_DEBUG cerr << "DirectedEdge " << i << ": " << de->print() << endl; #endif // if this edge has not yet been processed if(de->isInResult() && de->getEdgeRing()==nullptr) { MaximalEdgeRing* er = new MaximalEdgeRing(de, geometryFactory.get()); // We track MaximalEdgeRings allocations // using the private maximalEdgeRings vector maximalEdgeRings.push_back(er); er->linkDirectedEdgesForMinimalEdgeRings(); er->buildMinimalRings(minEdgeRings); } } /* std::vector<EdgeRing*> *edgeRings=new std::vector<EdgeRing*>(); edgeRings->assign(minEdgeRings.begin(), minEdgeRings.end()); return edgeRings; */ }
/*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); } } }