Real Segment2D::distance(const AABB2D& bb, Real& tmin) const { Real tmax; if(intersects(bb,tmin,tmax)) return 0; //non-intersecting -- either bb vertex - seg is closest feature pair or //bb edge - endpoint is closest feature pair //first check segment endpoints Real dmin; dmin = bb.distance(a); tmin = 0.0; Real d=bb.distance(b); if(d < dmin) { dmin = d; tmin = 1.0; } //now check vertices Vector2 p; Real t = closestPoint(bb.bmax,p); d = p.distanceSquared(bb.bmax); if(d < Sqr(dmin)) { dmin = Sqrt(d); tmin = t; } t = closestPoint(bb.bmin,p); d = p.distanceSquared(bb.bmin); if(d < Sqr(dmin)) { dmin = Sqrt(d); tmin = t; } t = closestPoint(Vector2(bb.bmin.x,bb.bmax.y),p); d = p.distanceSquared(Vector2(bb.bmin.x,bb.bmax.y)); if(d < Sqr(dmin)) { dmin = Sqrt(d); tmin = t; } t = closestPoint(Vector2(bb.bmax.x,bb.bmin.y),p); d = p.distanceSquared(Vector2(bb.bmax.x,bb.bmin.y)); if(d < Sqr(dmin)) { dmin = Sqrt(d); tmin = t; } return dmin; }