#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 $ Revision 1.3 2006/07/12 12:13:23 zifnab1974 static keyword only in declaration not in implementation Revision 1.2 2006/07/10 10:38:16 turini minor changes in SphereOfTetra() Revision 1.1 2006/07/06 12:37:18 ganovelli draft version. For the triangle is not tehe smallest enclosing sphere and for the set of spheres works only for two spheres ****************************************************************************/ #include #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 SmallestEnclosing::SphereOfTriangle(const TriangleType & t){ return Sphere3(t.Barycenter(),(t.Barycenter()-t.cP(0)).Norm() ); } template Sphere3 SmallestEnclosing::SphereOfTetra(const TetraType & t){ return Sphere3( t.Barycenter(),( t.Barycenter() - t.cP(0) ).Norm() ); } template 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); } }