Пример #1
0
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;
}