shape_extents.cpp
Go to the documentation of this file.
00001 /*********************************************************************
00002  * Software License Agreement (BSD License)
00003  *
00004  *  Copyright (c) 2012, 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 the Willow Garage 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 
00035 #include <shape_tools/shape_extents.h>
00036 #include <limits>
00037 
00038 void shape_tools::getShapeExtents(const shape_msgs::SolidPrimitive& shape_msg, double& x_extent, double& y_extent, double& z_extent)
00039 {
00040   x_extent = y_extent = z_extent = 0.0;
00041 
00042   if (shape_msg.type == shape_msgs::SolidPrimitive::SPHERE)
00043   {
00044     if (shape_msg.dimensions.size() > shape_msgs::SolidPrimitive::SPHERE_RADIUS)
00045       x_extent = y_extent = z_extent = shape_msg.dimensions[shape_msgs::SolidPrimitive::SPHERE_RADIUS] * 2.0;
00046   }
00047   else if (shape_msg.type == shape_msgs::SolidPrimitive::BOX)
00048   {
00049     if (shape_msg.dimensions.size() > shape_msgs::SolidPrimitive::BOX_X &&
00050         shape_msg.dimensions.size() > shape_msgs::SolidPrimitive::BOX_Y &&
00051         shape_msg.dimensions.size() > shape_msgs::SolidPrimitive::BOX_Z)
00052     {
00053       x_extent = shape_msg.dimensions[shape_msgs::SolidPrimitive::BOX_X];
00054       y_extent = shape_msg.dimensions[shape_msgs::SolidPrimitive::BOX_Y];
00055       z_extent = shape_msg.dimensions[shape_msgs::SolidPrimitive::BOX_Z];
00056     }
00057   } 
00058   else if (shape_msg.type == shape_msgs::SolidPrimitive::CYLINDER)
00059   {
00060     if (shape_msg.dimensions.size() > shape_msgs::SolidPrimitive::CYLINDER_RADIUS &&
00061         shape_msg.dimensions.size() > shape_msgs::SolidPrimitive::CYLINDER_HEIGHT)
00062     {
00063       x_extent = y_extent = shape_msg.dimensions[shape_msgs::SolidPrimitive::CYLINDER_RADIUS] * 2.0;
00064       z_extent = shape_msg.dimensions[shape_msgs::SolidPrimitive::CYLINDER_HEIGHT];
00065     }
00066   } 
00067   else if (shape_msg.type == shape_msgs::SolidPrimitive::CONE)
00068   {
00069     if (shape_msg.dimensions.size() > shape_msgs::SolidPrimitive::CONE_RADIUS &&
00070         shape_msg.dimensions.size() > shape_msgs::SolidPrimitive::CONE_HEIGHT)
00071     {
00072       x_extent = y_extent = shape_msg.dimensions[shape_msgs::SolidPrimitive::CONE_RADIUS] * 2.0;
00073       z_extent = shape_msg.dimensions[shape_msgs::SolidPrimitive::CONE_HEIGHT];
00074     }
00075   }
00076 }
00077 
00078 void shape_tools::getShapeExtents(const shape_msgs::Mesh& shape_msg, double& x_extent, double& y_extent, double& z_extent)
00079 {
00080   x_extent = y_extent = z_extent = 0.0;
00081   if (shape_msg.vertices.size() > 0) 
00082   {
00083     double xmin = std::numeric_limits<double>::max(), ymin = std::numeric_limits<double>::max(), zmin = std::numeric_limits<double>::max();
00084     double xmax = -std::numeric_limits<double>::max(), ymax = -std::numeric_limits<double>::max(), zmax = -std::numeric_limits<double>::max();
00085     for (std::size_t i = 0; i < shape_msg.vertices.size() ; ++i)
00086     {
00087       if (shape_msg.vertices[i].x > xmax)
00088         xmax = shape_msg.vertices[i].x;
00089       if (shape_msg.vertices[i].x < xmin)
00090         xmin = shape_msg.vertices[i].x;
00091       if (shape_msg.vertices[i].y > ymax)
00092         ymax = shape_msg.vertices[i].y;
00093       if (shape_msg.vertices[i].y < ymin)
00094         ymin = shape_msg.vertices[i].y;
00095       if (shape_msg.vertices[i].z > zmax)
00096         zmax = shape_msg.vertices[i].z;
00097       if (shape_msg.vertices[i].z < zmin)
00098         zmin = shape_msg.vertices[i].z;
00099     }
00100     x_extent = xmax-xmin;
00101     y_extent = ymax-ymin;
00102     z_extent = zmax-zmin;
00103   }
00104 }
00105 


shape_tools
Author(s): Ioan Sucan , Gil Jones
autogenerated on Mon Oct 6 2014 07:37:21