/* static */ bool LineSequencer::isSequenced(const Geometry* geom) { const MultiLineString *mls; if ( nullptr == (mls=dynamic_cast<const MultiLineString *>(geom)) ) { return true; } // the nodes in all subgraphs which have been completely scanned Coordinate::ConstSet prevSubgraphNodes; Coordinate::ConstVect currNodes; const Coordinate* lastNode = nullptr; for (std::size_t i=0, n=mls->getNumGeometries(); i<n; ++i) { const LineString* lineptr = \ dynamic_cast<const LineString*>(mls->getGeometryN(i)); assert(lineptr); const LineString& line = *lineptr; const Coordinate* startNode = &(line.getCoordinateN(0)); const Coordinate* endNode = &(line.getCoordinateN(line.getNumPoints() - 1)); /** * If this linestring is connected to a previous subgraph, * geom is not sequenced */ if (prevSubgraphNodes.find(startNode) != prevSubgraphNodes.end()) { return false; } if (prevSubgraphNodes.find(endNode) != prevSubgraphNodes.end()) { return false; } if (lastNode != nullptr) { if (! startNode->equals2D(*lastNode)) { // start new connected sequence prevSubgraphNodes.insert(currNodes.begin(), currNodes.end()); currNodes.clear(); } } currNodes.push_back(startNode); currNodes.push_back(endNode); lastNode = endNode; } return true; }
/* private */ void ConvexHull::reduce(Coordinate::ConstVect &pts) { Coordinate::ConstVect polyPts; if ( ! computeOctRing(pts, polyPts) ) { // unable to compute interior polygon for some reason return; } // add points defining polygon Coordinate::ConstSet reducedSet; reducedSet.insert(polyPts.begin(), polyPts.end()); /** * Add all unique points not in the interior poly. * CGAlgorithms.isPointInRing is not defined for points * actually on the ring, but this doesn't matter since * the points of the interior polygon are forced to be * in the reduced set. * * @@TIP: there should be a std::algo for this */ for (size_t i=0, n=pts.size(); i<n; ++i) { if ( !CGAlgorithms::isPointInRing(*(pts[i]), polyPts) ) { reducedSet.insert(pts[i]); } } inputPts.assign(reducedSet.begin(), reducedSet.end()); if ( inputPts.size() < 3 ) padArray3(inputPts); }