bool PositionVector::intersects(const PositionVector& v1) const { if (size() < 2) { return false; } for (const_iterator i = begin(); i != end() - 1; i++) { if (v1.intersects(*i, *(i + 1))) { return true; } } //return v1.intersects(*(end()-1), *(begin())); return false; }
bool NGRandomNetBuilder::canConnect(NGNode* baseNode, NGNode* newNode) { bool connectable = true; const PositionVector n(baseNode->getPosition(), newNode->getPosition()); // check for range between Basenode and Newnode if (connectable) { SUMOReal dist = n.length(); if ((dist < myMinDistance) || (dist > myMaxDistance)) { connectable = false; } } // check for angle restrictions if (connectable) { connectable = checkAngles(baseNode); } if (connectable) { connectable = checkAngles(newNode); } // check for intersections and range restrictions with outer links if (connectable) { NGEdgeList::iterator li; li = myOuterLinks.begin(); while (connectable && (li != myOuterLinks.end())) { // check intersection only if links don't share a node const NGNode* const start = (*li)->getStartNode(); const NGNode* const end = (*li)->getEndNode(); const Position& p1 = start->getPosition(); const Position& p2 = end->getPosition(); if ((baseNode != start) && (baseNode != end) && (newNode != start) && (newNode != end)) { connectable = !n.intersects(p1, p2); } // check NewNode-To-Links distance only, if NewNode isn't part of link if (connectable && (newNode != start) && (newNode != end)) { const SUMOReal offset = GeomHelper::nearest_offset_on_line_to_point2D(p1, p2, n[1]); if (offset != GeomHelper::INVALID_OFFSET) { const Position p = PositionVector(p1, p2).positionAtOffset2D(offset); const SUMOReal dist = p.distanceTo2D(n[1]); if (dist < myMinDistance) { connectable = false; } } } ++li; } } return connectable; }
Position PositionVector::intersectsAtPoint(const PositionVector& v1) const { for (const_iterator i = begin(); i != end() - 1; i++) { if (v1.intersects(*i, *(i + 1))) { return v1.intersectsAtPoint(*i, *(i + 1)); } } /* if(v1.intersects(*(end()-1), *(begin()))) { return v1.intersectsAtPoint(*(end()-1), *(begin())); } */ return Position::INVALID; }
Position GeomHelper::crossPoint(const Boundary& b, const PositionVector& v) { if (v.intersects(Position(b.xmin(), b.ymin()), Position(b.xmin(), b.ymax()))) { return v.intersectsAtPoint( Position(b.xmin(), b.ymin()), Position(b.xmin(), b.ymax())); } if (v.intersects(Position(b.xmax(), b.ymin()), Position(b.xmax(), b.ymax()))) { return v.intersectsAtPoint( Position(b.xmax(), b.ymin()), Position(b.xmax(), b.ymax())); } if (v.intersects(Position(b.xmin(), b.ymin()), Position(b.xmax(), b.ymin()))) { return v.intersectsAtPoint( Position(b.xmin(), b.ymin()), Position(b.xmax(), b.ymin())); } if (v.intersects(Position(b.xmin(), b.ymax()), Position(b.xmax(), b.ymax()))) { return v.intersectsAtPoint( Position(b.xmin(), b.ymax()), Position(b.xmax(), b.ymax())); } throw 1; }