From fc97ed0e1c3ad2494394f40e6d4e60d7a5dac659 Mon Sep 17 00:00:00 2001 From: nicopietroni Date: Mon, 27 Aug 2012 12:47:12 +0000 Subject: [PATCH] added support for primitive subdivision into cells --- vcg/space/index/index2D/grid_closest_2D.h | 310 +++++----------------- 1 file changed, 70 insertions(+), 240 deletions(-) diff --git a/vcg/space/index/index2D/grid_closest_2D.h b/vcg/space/index/index2D/grid_closest_2D.h index 15f8fc38..92159311 100644 --- a/vcg/space/index/index2D/grid_closest_2D.h +++ b/vcg/space/index/index2D/grid_closest_2D.h @@ -20,70 +20,7 @@ * for more details. * * * ****************************************************************************/ -/**************************************************************************** -History -$Log: not supported by cvs2svn $ -Revision 1.16 2006/10/02 09:34:03 cignoni -Re-added diff 1.12 by Pietroni (cancelled by previous rollback): -in GridDoRay function the RayIterator must be initialized with maximum distance - -Revision 1.15 2006/10/02 09:28:45 cignoni -Reverted to version 1.10 to nullify dangerous marfr960's changes - -Revision 1.10 2006/05/17 12:48:52 pietroni -corrected bug in GridGetInBox function - -Revision 1.9 2006/01/27 09:58:47 corsini -fix signed/unsigned mismatch - -Revision 1.8 2005/12/06 18:00:39 pietroni -added deleted objects control for GridClosest() function call - -Revision 1.7 2005/12/02 00:30:27 cignoni -Corrected typename usage and removed excess ';' from end of template functions, for gcc compiling - -Revision 1.6 2005/10/03 13:57:32 pietroni -added GridGetInSphere and GridGetInBox functions - -Revision 1.5 2005/10/02 23:18:06 cignoni -Small bug in the computation of the intersection between the todo box and the grid bbox that failed for extrema points. - -Revision 1.4 2005/09/30 15:12:16 cignoni -Completely rewrote the GridClosest, now it: -- works for point out of the grid -- expands the box in a distance coherent way -- does not re-visit already visited cells -- shorter code!! -( still to be tested :) ) - -Revision 1.3 2005/09/30 13:15:48 pietroni -added functions: -- GetKClosest -- DoRay - -Revision 1.2 2005/09/28 08:27:11 cignoni -Added a control to avoid multiple check of the same cells during radial expansion -Still miss some code to properly initialize when point is out of the BBox of the grid. - -Revision 1.1 2005/09/27 15:09:38 cignoni -First Version - - -****************************************************************************/ - -///** Returns the closest posistion of a point _p and its distance -//@param _p a 3d point -//@param _maxDist maximum distance not to search beyond. -//@param _getPointDistance (templated type) a functor object used to calculate distance from a grid object to the point _p. -//@param _minDist the returned closest distance -//@param _closestPt the returned closest point -//@return The closest element -//*/ -///* -// A DISTFUNCT object must implement an operator () with signature: -// bool operator () (const ObjType& obj, const CoordType & _p, ScalarType & min_dist, CoordType & _closestPt); -//*/ #ifndef __VCGLIB_GRID_CLOSEST #define __VCGLIB_GRID_CLOSEST @@ -91,201 +28,33 @@ First Version namespace vcg{ - //template - // typename SPATIAL_INDEX::ObjPtr GridClosest(SPATIAL_INDEX &Si, - // OBJPOINTDISTFUNCTOR _getPointDistance, - // OBJMARKER & _marker, - // const typename OBJPOINTDISTFUNCTOR::QueryType & _p_obj, - // const typename SPATIAL_INDEX::ScalarType & _maxDist, - // typename SPATIAL_INDEX::ScalarType & _minDist, - // typename SPATIAL_INDEX:: CoordType &_closestPt) - //{ - // typedef typename SPATIAL_INDEX::ObjPtr ObjPtr; - // typedef SPATIAL_INDEX SpatialIndex; - // typedef typename SPATIAL_INDEX::CoordType CoordType; - // typedef typename SPATIAL_INDEX::ScalarType ScalarType; - // typedef typename SPATIAL_INDEX::Box3x Box3x; - // - // Point3 _p = OBJPOINTDISTFUNCTOR::Pos(_p_obj); - // // Initialize min_dist with _maxDist to exploit early rejection test. - // _minDist = _maxDist; - - // ObjPtr winner=NULL; - // _marker.UnMarkAll(); - // ScalarType newradius = Si.voxel.Norm(); - // ScalarType radius; - // Box3i iboxdone,iboxtodo; - // CoordType t_res; - // typename SPATIAL_INDEX::CellIterator first,last,l; - // if(Si.bbox.IsInEx(_p)) - // { - // Point3i _ip; - // Si.PToIP(_p,_ip); - // Si.Grid( _ip[0],_ip[1],_ip[2], first, last ); - // for(l=first;l!=last;++l) - // { - // ObjPtr elem=&(**l); - // if (!elem->IsD()) - // { - // if (_getPointDistance((**l), _p_obj,_minDist, t_res)) // <-- NEW: use of distance functor - // { - // winner=elem; - // _closestPt=t_res; - // newradius=_minDist; // - // } - // _marker.Mark(elem); - // } - // } - // iboxdone=Box3i(_ip,_ip); - // } - - // int ix,iy,iz; - // Box3i ibox(Point3i(0,0,0),Si.siz-Point3i(1,1,1)); - // do - // { - // radius=newradius; - // Box3x boxtodo=Box3x(_p,radius); - // //boxtodo.Intersect(Si.bbox); - // Si.BoxToIBox(boxtodo, iboxtodo); - // iboxtodo.Intersect(ibox); - // if(!boxtodo.IsNull()) - // { - // for (ix=iboxtodo.min[0]; ix<=iboxtodo.max[0]; ix++) - // for (iy=iboxtodo.min[1]; iy<=iboxtodo.max[1]; iy++) - // for (iz=iboxtodo.min[2]; iz<=iboxtodo.max[2]; iz++) - // if(ixiboxdone.max[0] || // this test is to avoid to re-process already analyzed cells. - // iyiboxdone.max[1] || - // iziboxdone.max[2] ) - // { - // Si.Grid( ix, iy, iz, first, last ); - // for(l=first;l!=last;++l) if (!(**l).IsD()) - // { - // ObjPtr elem=&(**l); - // if (!elem->IsD()) - // { - // if( ! _marker.IsMarked(elem)) - // { - // if (_getPointDistance((**l), _p_obj, _minDist, t_res)) - // { - // winner=elem; - // _closestPt=t_res; - // }; - // _marker.Mark(elem); - // } - // } - // } - // } - // } - // if(!winner) newradius=radius+Si.voxel.Norm(); - // else newradius = _minDist; - // } - // while (_minDist>radius); - - // return winner; - //} - - //template - // unsigned int GridGetKClosest(SPATIALINDEXING &_Si, - // OBJPOINTDISTFUNCTOR & _getPointDistance, - // OBJMARKER & _marker, - // const unsigned int _k, - // const typename SPATIALINDEXING::CoordType & _p, - // const typename SPATIALINDEXING::ScalarType & _maxDist, - // OBJPTRCONTAINER & _objectPtrs, - // DISTCONTAINER & _distances, - // POINTCONTAINER & _points) - //{ - // typedef vcg::ClosestIterator ClosestIteratorType; - // ClosestIteratorType Cli=ClosestIteratorType(_Si,_getPointDistance); - // Cli.SetMarker(_marker); - // Cli.Init(_p,_maxDist); - // unsigned int i=0; - // _objectPtrs.clear(); - // _distances.clear(); - // _points.clear(); - // while ((!Cli.End())&&(i<_k)) - // { - // _objectPtrs.push_back(&(*Cli)); - // _distances.push_back(Cli.Dist()); - // _points.push_back(Cli.NearestPoint()); - // ++Cli; - // i++; - // } - // return (i); - //} - - //template - // typename SPATIALINDEXING::ObjPtr GridDoRay(SPATIALINDEXING &_Si, - // OBJRAYISECTFUNCTOR &_rayIntersector, - // OBJMARKER &_marker, - // const Ray3 & _ray, - // const typename SPATIALINDEXING::ScalarType & _maxDist, - // typename SPATIALINDEXING::ScalarType & _t) - //{ - // typedef vcg::RayIterator RayIteratorType; - // RayIteratorType RayIte=RayIteratorType(_Si,_rayIntersector,_maxDist); - // RayIte.SetMarker(_marker); - // RayIte.Init(_ray); - - // if (!RayIte.End()) - // { - // _t=RayIte.Dist(); - // return(&(*RayIte)); - // } - // return 0; - //} - - // - //template - // unsigned int GridGetInSphere(SPATIALINDEXING &_Si, - // OBJPOINTDISTFUNCTOR & _getPointDistance, - // OBJMARKER & _marker, - // const typename SPATIALINDEXING::CoordType & _p, - // const typename SPATIALINDEXING::ScalarType & _r, - // OBJPTRCONTAINER & _objectPtrs, - // DISTCONTAINER & _distances, - // POINTCONTAINER & _points) - //{ - // typedef vcg::ClosestIterator ClosestIteratorType; - // ClosestIteratorType Cli=ClosestIteratorType(_Si,_getPointDistance); - // Cli.SetMarker(_marker); - // Cli.Init(_p,_r); - // _objectPtrs.clear(); - // _distances.clear(); - // _points.clear(); - // while (!Cli.End()) - // { - // _objectPtrs.push_back(&(*Cli)); - // _distances.push_back(Cli.Dist()); - // _points.push_back(Cli.NearestPoint()); - // ++Cli; - // } - // return ((int)_objectPtrs.size()); - // } template unsigned int GridGetInBox2D(SPATIALINDEXING &_Si, OBJMARKER & _marker, const vcg::Box2 &_bbox, - OBJPTRCONTAINER & _objectPtrs) + OBJPTRCONTAINER & _objectPtrs, + bool update_global_mark=true) { typename SPATIALINDEXING::CellIterator first,last,l; - _objectPtrs.clear(); + //_objectPtrs.clear(); vcg::Box2i ibbox; Box2i Si_ibox(Point2i(0,0),_Si.siz-Point2i(1,1)); _Si.BoxToIBox(_bbox, ibbox); ibbox.Intersect(Si_ibox); - _marker.UnMarkAll(); + + if (update_global_mark) + _marker.UnMarkAll(); + if (ibbox.IsNull()) return 0; else { - int ix,iy,iz; + int ix,iy; for (ix=ibbox.min[0]; ix<=ibbox.max[0]; ix++) for (iy=ibbox.min[1]; iy<=ibbox.max[1]; iy++) { - _Si.Grid( ix, iy, first, last ); + _Si.Grid( ix, iy, first, last ); for(l=first;l!=last;++l) if (!(**l).IsD()) { @@ -302,6 +71,67 @@ namespace vcg{ } } + /*template + unsigned int GridGetInBoxes2D(SPATIALINDEXING &_Si, + OBJMARKER & _marker, + const std::vector > &_bbox, + OBJPTRCONTAINER & _objectPtrs) + { + typename SPATIALINDEXING::CellIterator first,last,l; + _objectPtrs.clear(); + _marker.UnMarkAll(); + for (int i=0;i<_bbox.size();i++) + GridGetInBox2D(_Si,_marker,_bbox[i],_objectPtrs,false); + return (static_cast(_objectPtrs.size())); + }*/ + + template + unsigned int GridGetInBoxes2D(SPATIALINDEXING &_Si, + OBJMARKER & _marker, + const std::vector > &_bbox, + OBJPTRCONTAINER & _objectPtrs) + { + typename SPATIALINDEXING::CellIterator first,last,l; + _objectPtrs.clear(); + _marker.UnMarkAll(); + std::vector cells; + + for (int i=0;i<_bbox.size();i++) + { + vcg::Box2i ibbox; + Box2i Si_ibox(Point2i(0,0),_Si.siz-Point2i(1,1)); + _Si.BoxToIBox(_bbox[i], ibbox); + ibbox.Intersect(Si_ibox); + + if (ibbox.IsNull())continue; + int ix,iy; + + for (ix=ibbox.min[0]; ix<=ibbox.max[0]; ix++) + for (iy=ibbox.min[1]; iy<=ibbox.max[1]; iy++) + cells.push_back(vcg::Point2i(ix,iy)); + } + //printf("%d \n",cells.size()); + std::sort(cells.begin(),cells.end()); + std::vector::iterator it=std::unique(cells.begin(),cells.end()); + cells.resize( it - cells.begin() ); + + for (int i=0;i(_objectPtrs.size())); + } + }//end namespace vcg #endif