All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends

AABB.cpp

00001 /*
00002  * Software License Agreement (BSD License)
00003  *
00004  *  Copyright (c) 2011, Willow Garage, Inc.
00005  *  All rights reserved.
00006  *
00007  *  Redistribution and use in source and binary forms, with or without
00008  *  modification, are permitted provided that the following conditions
00009  *  are met:
00010  *
00011  *   * Redistributions of source code must retain the above copyright
00012  *     notice, this list of conditions and the following disclaimer.
00013  *   * Redistributions in binary form must reproduce the above
00014  *     copyright notice, this list of conditions and the following
00015  *     disclaimer in the documentation and/or other materials provided
00016  *     with the distribution.
00017  *   * Neither the name of Willow Garage, Inc. nor the names of its
00018  *     contributors may be used to endorse or promote products derived
00019  *     from this software without specific prior written permission.
00020  *
00021  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
00022  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
00023  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
00024  *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
00025  *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
00026  *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
00027  *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
00028  *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
00029  *  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00030  *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
00031  *  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00032  *  POSSIBILITY OF SUCH DAMAGE.
00033  */
00034 
00037 #include "fcl/BV/AABB.h"
00038 
00039 #include <limits>
00040 #include <iostream>
00041 
00042 namespace fcl
00043 {
00044 
00045 AABB::AABB() : min_(std::numeric_limits<FCL_REAL>::max()),
00046                max_(-std::numeric_limits<FCL_REAL>::max())
00047 {
00048 }
00049 
00050 FCL_REAL AABB::distance(const AABB& other, Vec3f* P, Vec3f* Q) const
00051 {
00052   FCL_REAL result = 0;
00053   for(std::size_t i = 0; i < 3; ++i)
00054   {
00055     const FCL_REAL& amin = min_[i];
00056     const FCL_REAL& amax = max_[i];
00057     const FCL_REAL& bmin = other.min_[i];
00058     const FCL_REAL& bmax = other.max_[i];
00059     
00060     if(amin > bmax)
00061     {
00062       FCL_REAL delta = bmax - amin;
00063       result += delta * delta;
00064       if(P && Q)
00065       {
00066         (*P)[i] = amin;
00067         (*Q)[i] = bmax;
00068       }
00069     }
00070     else if(bmin > amax)
00071     {
00072       FCL_REAL delta = amax - bmin;
00073       result += delta * delta;
00074       if(P && Q)
00075       {
00076         (*P)[i] = amax;
00077         (*Q)[i] = bmin;
00078       }
00079     }
00080     else
00081     {
00082       if(P && Q)
00083       {
00084         if(bmin >= amin)
00085         {
00086           FCL_REAL t = 0.5 * (amax + bmin);
00087           (*P)[i] = t;
00088           (*Q)[i] = t;
00089         }
00090         else
00091         {
00092           FCL_REAL t = 0.5 * (amin + bmax);
00093           (*P)[i] = t;
00094           (*Q)[i] = t;
00095         }
00096       }
00097     }
00098   }
00099 
00100   return std::sqrt(result);
00101 }
00102 
00103 FCL_REAL AABB::distance(const AABB& other) const
00104 {
00105   FCL_REAL result = 0;
00106   for(std::size_t i = 0; i < 3; ++i)
00107   {
00108     const FCL_REAL& amin = min_[i];
00109     const FCL_REAL& amax = max_[i];
00110     const FCL_REAL& bmin = other.min_[i];
00111     const FCL_REAL& bmax = other.max_[i];
00112     
00113     if(amin > bmax)
00114     {
00115       FCL_REAL delta = bmax - amin;
00116       result += delta * delta;
00117     }
00118     else if(bmin > amax)
00119     {
00120       FCL_REAL delta = amax - bmin;
00121       result += delta * delta;
00122     }
00123   }
00124 
00125   return std::sqrt(result);
00126 }
00127 
00128 }