diff --git a/vcg/space/smallest_enclosing.h b/vcg/space/smallest_enclosing.h new file mode 100644 index 00000000..1772d708 --- /dev/null +++ b/vcg/space/smallest_enclosing.h @@ -0,0 +1,100 @@ +#pragma once +/**************************************************************************** +* VCGLib o o * +* Visual and Computer Graphics Library o o * +* _ O _ * +* Copyright(C) 2004 \/)\/ * +* Visual Computing Lab /\/| * +* ISTI - Italian National Research Council | * +* \ * +* All rights reserved. * +* * +* This program is free software; you can redistribute it and/or modify * +* it under the terms of the GNU General Public License as published by * +* the Free Software Foundation; either version 2 of the License, or * +* (at your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License (http://www.gnu.org/licenses/gpl.txt) * +* for more details. * +* * +****************************************************************************/ +/**************************************************************************** + History + +$Log: not supported by cvs2svn $ + + +****************************************************************************/ + +#include +#include + +#include +namespace vcg{ + /** \addtogroup space */ +/*@{*/ +/** +Class for function computing the smallest enclosing bounding volume + +*/ +struct SmallestEnclosing { + + /// computes the smallest enclosing sphere of a triangle + template + static Sphere3 SphereOfTriangle(const TriangleType & t); + + /// computes the smallest enclosing sphere of a tetrahedron + template + static Sphere3 SphereOfTetra(const TetraType & t); + + /// computes the smallest enclosing sphere of a container of spheres + template + static typename SphereContType::value_type SphereOfSpheres( const SphereContType & t); +}; +/*@}*/ + +template +Sphere3 +static SmallestEnclosing::SphereOfTriangle(const TriangleType & t){ + return Sphere3(t.Barycenter(),(t.Barycenter()-t.cP(0)).Norm() ); +} + +template +Sphere3 +static SmallestEnclosing::SphereOfTetra(const TetraType & t){ + return Sphere3( Barycenter(t),( Barycenter(t)-t.cP(0)).Norm() ); +} + +template +static typename SphereContType::value_type + SmallestEnclosing:: +SphereOfSpheres( const SphereContType & spheres) +{ + typename SphereContType::value_type::ScalarType radius; + vcg::Point3f center; + + if(spheres.size()==2){ + const typename SphereContType::value_type & s0 = spheres[0]; + const typename SphereContType::value_type & s1 = spheres[1]; + float dst = (s1.Center()-s0.Center()).Norm() ; + radius = (dst+s1.Radius()+s0.Radius())/2; + Point3f a=s0.Center(); + Point3f b=s1.Center(); + Point3f dir = (b-a).Normalize(); + a = a - dir*s0.Radius(); + b = b + dir*s1.Radius(); + center = (a+b)/2.0; + } + else{ + assert(0); + } + + return typename SphereContType::value_type(center,radius); +} + +} + +