From e974b9c9485535e03b900b1eb34f0ef2c931a50f Mon Sep 17 00:00:00 2001 From: cignoni Date: Tue, 15 Mar 2005 11:43:18 +0000 Subject: [PATCH] Removed BestDim function from the grid_static_ptr class and moved to a indipendent file (grid_util.h) for sake of generality. --- vcg/space/index/grid_static_ptr.h | 80 ++-------------------- vcg/space/index/grid_util.h | 109 ++++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+), 75 deletions(-) create mode 100644 vcg/space/index/grid_util.h diff --git a/vcg/space/index/grid_static_ptr.h b/vcg/space/index/grid_static_ptr.h index 57268409..810bddb1 100644 --- a/vcg/space/index/grid_static_ptr.h +++ b/vcg/space/index/grid_static_ptr.h @@ -24,6 +24,9 @@ History $Log: not supported by cvs2svn $ +Revision 1.11 2005/01/03 11:21:26 cignoni +Added some casts + Revision 1.10 2004/09/28 10:25:05 ponchio SetBox minimal change. @@ -68,7 +71,7 @@ Initial commit #include #include - +#include namespace vcg { /** Static Uniform Grid @@ -454,80 +457,7 @@ class GridStaticPtr } } - - /** Calcolo dimensioni griglia. - Calcola la dimensione della griglia in funzione - della ratio del bounding box e del numero di elementi - */ - static void BestDim( const int elems, const Point3x & size, Point3i & dim ) - { - const int mincells = 1; // Numero minimo di celle - const double GFactor = 1.0; // GridEntry = NumElem*GFactor - double diag = size.Norm(); // Diagonale del box - double eps = diag*1e-4; // Fattore di tolleranza - - assert(elems>0); - assert(size[0]>=0.0); - assert(size[1]>=0.0); - assert(size[2]>=0.0); - - - int ncell = int(elems*GFactor); // Calcolo numero di voxel - if(ncelleps) - { - if(size[1]>eps) - { - if(size[2]>eps) - { - double k = pow((double)(ncell/(size[0]*size[1]*size[2])),double(1.0/3.f)); - dim[0] = int(size[0] * k); - dim[1] = int(size[1] * k); - dim[2] = int(size[2] * k); - } - else - { - dim[0] = int(::sqrt(ncell*size[0]/size[1])); - dim[1] = int(::sqrt(ncell*size[1]/size[0])); - } - } - else - { - if(size[2]>eps) - { - dim[0] = int(::sqrt(ncell*size[0]/size[2])); - dim[2] = int(::sqrt(ncell*size[2]/size[0])); - } - else - dim[0] = int(ncell); - } - } - else - { - if(size[1]>eps) - { - if(size[2]>eps) - { - dim[1] = int(::sqrt(ncell*size[1]/size[2])); - dim[2] = int(::sqrt(ncell*size[2]/size[1])); - } - else - dim[1] = int(ncell); - } - else if(size[2]>eps) - dim[2] = int(ncell); - } - dim[0] = math::Max(dim[0],1); - dim[1] = math::Max(dim[1],1); - dim[2] = math::Max(dim[2],1); - } - + int MemUsed() { diff --git a/vcg/space/index/grid_util.h b/vcg/space/index/grid_util.h new file mode 100644 index 00000000..d5baf86c --- /dev/null +++ b/vcg/space/index/grid_util.h @@ -0,0 +1,109 @@ +/**************************************************************************** +* VCGLib o o * +* Visual and Computer Graphics Library o o * +* _ O _ * +* Copyright(C) 2005 \/)\/ * +* 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 $ + +****************************************************************************/ +#ifndef __VCGLIB_GRID_UTIL +#define __VCGLIB_GRID_UTIL + + + /** Calcolo dimensioni griglia. + Calcola la dimensione della griglia in funzione + della ratio del bounding box e del numero di elementi + */ + namespace vcg { + + template + void BestDim( const int elems, const Point3 & size, Point3i & dim ) + { + const int mincells = 1; // Numero minimo di celle + const double GFactor = 1.0; // GridEntry = NumElem*GFactor + double diag = size.Norm(); // Diagonale del box + double eps = diag*1e-4; // Fattore di tolleranza + + assert(elems>0); + assert(size[0]>=0.0); + assert(size[1]>=0.0); + assert(size[2]>=0.0); + + + int ncell = int(elems*GFactor); // Calcolo numero di voxel + if(ncelleps) + { + if(size[1]>eps) + { + if(size[2]>eps) + { + double k = pow((double)(ncell/(size[0]*size[1]*size[2])),double(1.0/3.f)); + dim[0] = int(size[0] * k); + dim[1] = int(size[1] * k); + dim[2] = int(size[2] * k); + } + else + { + dim[0] = int(::sqrt(ncell*size[0]/size[1])); + dim[1] = int(::sqrt(ncell*size[1]/size[0])); + } + } + else + { + if(size[2]>eps) + { + dim[0] = int(::sqrt(ncell*size[0]/size[2])); + dim[2] = int(::sqrt(ncell*size[2]/size[0])); + } + else + dim[0] = int(ncell); + } + } + else + { + if(size[1]>eps) + { + if(size[2]>eps) + { + dim[1] = int(::sqrt(ncell*size[1]/size[2])); + dim[2] = int(::sqrt(ncell*size[2]/size[1])); + } + else + dim[1] = int(ncell); + } + else if(size[2]>eps) + dim[2] = int(ncell); + } + dim[0] = math::Max(dim[0],1); + dim[1] = math::Max(dim[1],1); + dim[2] = math::Max(dim[2],1); + } + } +#endif \ No newline at end of file