// liefert den Punkt neben dem Segment (links oder rechts, siehe 'left'), der orthogonal von // 'p' die Entfernung 'newLen' von diesem Segment hat. static DPoint leftOfSegment(const DLine &segment, const DPoint &p, double newLen, bool left = true) { DVector v; if (p == segment.start()) v = segment.end() - p; else v = p - segment.start(); DVector newPos(v.orthogonal()); if (!left) newPos *= -1; // newPos has nonzero length newPos = (newPos * newLen) / newPos.length(); return p + newPos; }
// computes distance between two parallel lines double IntersectionRectangle::parallelDist(const DLine& d1, const DLine& d2) const { OGDF_ASSERT((d1.isHorizontal() && d2.isHorizontal()) || (d1.isVertical() && d2.isVertical())); double d1min, d1max, d2min, d2max, paraDist, dist; if(d1.isVertical()) { d1min = d1.start().m_y; d1max = d1.end().m_y; d2min = d2.start().m_y; d2max = d2.end().m_y; paraDist = fabs(d1.start().m_x - d2.start().m_x); } else { d1min = d1.start().m_x; d1max = d1.end().m_x; d2min = d2.start().m_x; d2max = d2.end().m_x; paraDist = fabs(d1.start().m_y - d2.start().m_y); } if(d1min > d1max) swap(d1min,d1max); if(d2min > d2max) swap(d2min,d2max); if(d1min > d2max || d2min > d1max) { // no overlap dist = pointDist(d1.start(),d2.start()); dist = min(dist,pointDist(d1.start(),d2.end())); dist = min(dist,pointDist(d1.end(),d2.start())); dist = min(dist,pointDist(d1.end(),d2.end())); } else dist = paraDist; // segments overlap return dist; }