/* private */ void NodingValidator::checkInteriorIntersections( const SegmentString& e0, unsigned int segIndex0, const SegmentString& e1, unsigned int segIndex1) { if (&e0 == &e1 && segIndex0 == segIndex1) return; const Coordinate& p00 = e0.getCoordinates()->getAt(segIndex0); const Coordinate& p01 = e0.getCoordinates()->getAt(segIndex0 + 1); const Coordinate& p10 = e1.getCoordinates()->getAt(segIndex1); const Coordinate& p11 = e1.getCoordinates()->getAt(segIndex1 + 1); li.computeIntersection(p00, p01, p10, p11); if (li.hasIntersection()) { if (li.isProper() || hasInteriorIntersection(li, p00, p01) || hasInteriorIntersection(li, p10, p11)) { throw util::TopologyException( "found non-noded intersection at " + p00.toString() + "-" + p01.toString() + " and " + p10.toString() + "-" + p11.toString()); } } }
/*private*/ bool TaggedLineStringSimplifier::hasBadInputIntersection( const TaggedLineString* parentLine, const vector<size_t>& sectionIndex, const LineSegment& candidateSeg) { auto_ptr< vector<LineSegment*> > querySegs = inputIndex->query(&candidateSeg); for (vector<LineSegment*>::iterator it = querySegs->begin(), iEnd = querySegs->end(); it != iEnd; ++it) { assert(*it); assert(dynamic_cast<TaggedLineSegment*>(*it)); TaggedLineSegment* querySeg = static_cast<TaggedLineSegment*>(*it); if (hasInteriorIntersection(*querySeg, candidateSeg)) { if ( isInLineSection(parentLine, sectionIndex, querySeg) ) { continue; } return true; } } return false; }
/*private*/ bool TaggedLineStringSimplifier::hasBadOutputIntersection( const LineSegment& candidateSeg) { auto_ptr< vector<LineSegment*> > querySegs = outputIndex->query(&candidateSeg); for (vector<LineSegment*>::iterator it = querySegs->begin(), iEnd = querySegs->end(); it != iEnd; ++it) { LineSegment* querySeg = *it; assert(querySeg); if (hasInteriorIntersection(*querySeg, candidateSeg)) { return true; } } return false; }