#include <static_quad_grid.h>
Because elements are duplicated all over cells and only one cell can be selected at a time.
Nevrax France
Definition at line 51 of file static_quad_grid.h.
Public Member Functions | |
CStaticQuadGrid () | |
Constructor. | |
~CStaticQuadGrid () | |
dtor. | |
Initialization | |
void | build (CQuadGrid< T > &quadGrid) |
void | clear () |
Selection | |
const T * | select (const NLMISC::CVector &point, uint &numElts) |
Private Member Functions | |
void | selectPoint (CVector point, sint &x0, sint &y0) |
Private Attributes | |
NLMISC::CMatrix | _ChangeBasis |
std::vector< T > | _Elements |
float | _EltSize |
std::vector< CQuadNode > | _Grid |
sint | _Size |
sint | _SizePower |
|
Constructor.
Definition at line 146 of file static_quad_grid.h. References NLMISC::CMatrix::identity().
00147 { 00148 _SizePower=4; 00149 _Size=1<<_SizePower; 00150 _EltSize=1; 00151 _ChangeBasis.identity(); 00152 _Grid.resize(_Size * _Size); 00153 } |
|
dtor.
Definition at line 156 of file static_quad_grid.h. References NL3D::CStaticQuadGrid< T >::clear().
00157 { 00158 clear(); 00159 } |
|
build from a CQuadGrid. Elements are copied, not referenced Elements may be duplicated in all cells they lie into. quadGrid selection is cleared Definition at line 181 of file static_quad_grid.h. References NL3D::CQuadGrid< T >::begin(), NL3D::CStaticQuadGrid< T >::clear(), NL3D::CQuadGrid< T >::clearSelection(), NL3D::CQuadGrid< T >::end(), NL3D::CQuadGrid< T >::getBasis(), NL3D::CQuadGrid< T >::getEltSize(), NLMISC::getPowerOf2(), NL3D::CQuadGrid< T >::getSize(), NLMISC::CMatrix::inverted(), NL3D::CQuadGrid< T >::select(), sint, uint, NLMISC::CVector::x, x, NLMISC::CVector::y, y, and NLMISC::CVector::z.
00182 { 00183 clear(); 00184 contReset(_Grid); 00185 00186 // Copy from quadGrid, and init quads 00187 _Size= quadGrid.getSize(); 00188 _SizePower= getPowerOf2(_Size); 00189 _EltSize= quadGrid.getEltSize(); 00190 _ChangeBasis= quadGrid.getBasis(); 00191 _Grid.resize(_Size * _Size); 00192 00193 NLMISC::CMatrix invBasis= _ChangeBasis.inverted(); 00194 00195 // Count number of elements per cell, and total copies of elements 00196 uint totalDupElt= 0; 00197 sint x,y; 00198 for(y=0; y<_Size; y++) 00199 { 00200 for(x=0; x<_Size; x++) 00201 { 00202 // Select the center of the case 00203 CVector pos; 00204 pos.x= (x+0.5f)*_EltSize; 00205 pos.y= (y+0.5f)*_EltSize; 00206 pos.z= 0.f; 00207 // mul by invBasis 00208 pos= invBasis * pos; 00209 quadGrid.select(pos, pos); 00210 00211 // Count elements. 00212 uint n= 0; 00213 typename CQuadGrid<T>::CIterator it; 00214 for(it= quadGrid.begin(); it!=quadGrid.end(); it++) 00215 { 00216 n++; 00217 } 00218 00219 // store. 00220 _Grid[y*_Size + x].NumNodes= n; 00221 totalDupElt+= n; 00222 } 00223 } 00224 00225 // Resize array copy. 00226 _Elements.resize(totalDupElt); 00227 00228 00229 // Then reparse all array, filling _Elements and setup quadNodes ptr. 00230 uint curDupElt= 0; 00231 for(y=0; y<_Size; y++) 00232 { 00233 for(x=0; x<_Size; x++) 00234 { 00235 // Select the center of the case 00236 CVector pos; 00237 pos.x= (x+0.5f)*_EltSize; 00238 pos.y= (y+0.5f)*_EltSize; 00239 pos.z= 0.f; 00240 // mul by invBasis 00241 pos= invBasis * pos; 00242 quadGrid.select(pos, pos); 00243 00244 // Setup quadNode ptr. 00245 if (curDupElt < _Elements.size()) 00246 _Grid[y*_Size + x].Nodes= &_Elements[curDupElt]; 00247 00248 // For all elements. 00249 typename CQuadGrid<T>::CIterator it; 00250 for(it= quadGrid.begin(); it!=quadGrid.end(); it++) 00251 { 00252 // Copy elt in array. 00253 _Elements[curDupElt]= *it; 00254 00255 // Next elt in array. 00256 curDupElt++; 00257 } 00258 } 00259 } 00260 00261 00262 // clean up. 00263 quadGrid.clearSelection(); 00264 } |
|
Clear all the container. Elements are deleted, and the quadgrid is erased. Definition at line 164 of file static_quad_grid.h. References NLMISC::CMatrix::identity(). Referenced by NL3D::CStaticQuadGrid< T >::build(), and NL3D::CStaticQuadGrid< T >::~CStaticQuadGrid().
00165 { 00166 // Just clear all vectors 00167 _Elements.clear(); 00168 _Grid.clear(); 00169 00170 // reset 00171 _SizePower=4; 00172 _Size=1<<_SizePower; 00173 _EltSize=1; 00174 _ChangeBasis.identity(); 00175 _Grid.resize(_Size * _Size); 00176 } |
|
Select elements at a given point Speed is in O(1), because the array of the cell is returned. NULL if size==0.
Definition at line 269 of file static_quad_grid.h. References NL3D::CStaticQuadGrid< T >::CQuadNode::Nodes, NL3D::CStaticQuadGrid< T >::CQuadNode::NumNodes, NL3D::CStaticQuadGrid< T >::selectPoint(), sint, uint, x, and y.
00270 { 00271 CVector point= _ChangeBasis * pointIn; 00272 00273 // Select the case. 00274 sint x, y; 00275 selectPoint(point, x, y); 00276 00277 // get ref on the selection 00278 CQuadNode &quadNode= _Grid[y*_Size + x]; 00279 numElts= quadNode.NumNodes; 00280 00281 return quadNode.Nodes; 00282 } |
|
Definition at line 114 of file static_quad_grid.h. Referenced by NL3D::CStaticQuadGrid< T >::select().
|
|
Definition at line 110 of file static_quad_grid.h. |
|
Definition at line 105 of file static_quad_grid.h. |
|
Definition at line 109 of file static_quad_grid.h. |
|
Definition at line 106 of file static_quad_grid.h. |
|
Definition at line 107 of file static_quad_grid.h. |
|
Definition at line 108 of file static_quad_grid.h. |