Geant4.10
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Public Member Functions | Protected Member Functions | Protected Attributes | Friends
G4KDTree Class Reference

#include <G4KDTree.hh>

Public Member Functions

 G4KDTree (int dim=3)
 
virtual ~G4KDTree ()
 
void Clear ()
 
int GetDim ()
 
void SetDataDestructor (void(*fDestr)(void *))
 
int GetNbNodes ()
 
G4KDNodeGetRoot ()
 
G4KDNodeInsertMap (const double &x, const double &y, const double &z, void *data)
 
G4KDNodeInsertMap (const double *pos, void *data)
 
void Build ()
 
G4KDNodeInsert (const double *pos, void *data)
 
G4KDNodeInsert (const double &x, const double &y, const double &z, void *data)
 
G4KDTreeResultHandle Nearest (const double *pos)
 
G4KDTreeResultHandle Nearest (const double &x, const double &y, const double &z)
 
G4KDTreeResultHandle Nearest (G4KDNode *node)
 
G4KDTreeResultHandle NearestInRange (const double *pos, const double &range)
 
G4KDTreeResultHandle NearestInRange (const double &x, const double &y, const double &z, const double &range)
 
G4KDTreeResultHandle NearestInRange (G4KDNode *node, const double &range)
 

Protected Member Functions

void __Clear_Rec (G4KDNode *node)
 
int __NearestInRange (G4KDNode *node, const double *pos, const double &range_sq, const double &range, G4KDTreeResult &list, int ordered, G4KDNode *source_node=0)
 
void __NearestToPosition (G4KDNode *node, const double *pos, G4KDNode *&result, double *result_dist_sq, struct HyperRect *fRect)
 
void __NearestToNode (G4KDNode *source_node, G4KDNode *node, const double *pos, std::vector< G4KDNode * > &result, double *result_dist_sq, struct HyperRect *fRect, int &nbresult)
 

Protected Attributes

G4KDNodefRoot
 

Friends

class G4KDNode
 

Detailed Description

G4KDTree is used by the ITManager to locate the neareast neighbours. A kdtree sorts out node in such a way that it reduces the number of node check. The results of this search can be retrieved by G4KDTreeResultHandle.

Definition at line 62 of file G4KDTree.hh.

Constructor & Destructor Documentation

G4KDTree::G4KDTree ( int  dim = 3)

Definition at line 170 of file G4KDTree.cc.

References fRoot.

170  : fKDMap(new G4KDMap(k))
171 {
172  fDim = k;
173  fRoot = 0;
174  fDestr = 0;
175  fRect = 0;
176  fNbNodes = 0;
177 }
G4KDNode * fRoot
Definition: G4KDTree.hh:72
G4KDTree::~G4KDTree ( )
virtual

Definition at line 179 of file G4KDTree.cc.

References __Clear_Rec(), and fRoot.

180 {
181  if(fRoot) __Clear_Rec(fRoot);
182  fRoot = 0;
183 
184  if (fRect)
185  {
186  delete fRect;
187  fRect = 0;
188  }
189 
190  if(fKDMap) delete fKDMap;
191 }
void __Clear_Rec(G4KDNode *node)
Definition: G4KDTree.cc:206
G4KDNode * fRoot
Definition: G4KDTree.hh:72

Member Function Documentation

void G4KDTree::__Clear_Rec ( G4KDNode node)
protected

Definition at line 206 of file G4KDTree.cc.

References G4KDNode::GetData(), G4KDNode::GetLeft(), G4KDNode::GetRight(), and G4KDNode::SetData().

Referenced by Clear(), and ~G4KDTree().

207 {
208  if(!node) return;
209 
210  if(node->GetLeft()) __Clear_Rec(node->GetLeft());
211  if(node->GetRight()) __Clear_Rec(node->GetRight());
212 
213  if(fDestr)
214  {
215  if(node->GetData())
216  {
217  fDestr(node->GetData());
218  node->SetData(0);
219  }
220  }
221  delete node;
222 }
void __Clear_Rec(G4KDNode *node)
Definition: G4KDTree.cc:206
G4KDNode * GetLeft()
Definition: G4KDNode.hh:137
void * GetData()
Definition: G4KDNode.hh:117
G4KDNode * GetRight()
Definition: G4KDNode.hh:142
void SetData(void *)
Definition: G4KDNode.hh:122
int G4KDTree::__NearestInRange ( G4KDNode node,
const double *  pos,
const double &  range_sq,
const double &  range,
G4KDTreeResult list,
int  ordered,
G4KDNode source_node = 0 
)
protected

Definition at line 303 of file G4KDTree.cc.

References DBL_MAX, G4KDNode::GetAxis(), GetData(), G4KDNode::GetLeft(), G4KDNode::GetPosition(), G4KDNode::GetRight(), G4KDTreeResult::Insert(), and sqr().

Referenced by NearestInRange().

305 {
306  if(!node) return 0;
307 
308  double dist_sq(DBL_MAX), dx(DBL_MAX);
309  int ret(-1), added_res(0);
310 
311  if(node-> GetData() && node != source_node)
312  {
313  bool do_break = false ;
314  dist_sq = 0;
315  for(int i=0; i<fDim; i++)
316  {
317  dist_sq += sqr(node->GetPosition()[i] - pos[i]);
318  if(dist_sq > range_sq)
319  {
320  do_break = true;
321  break;
322  }
323  }
324  if(!do_break && dist_sq <= range_sq)
325  {
326  list.Insert(dist_sq, node);
327  added_res = 1;
328  }
329  }
330 
331  dx = pos[node->GetAxis()] - node->GetPosition()[node->GetAxis()];
332 
333  ret = __NearestInRange(dx <= 0.0 ? node->GetLeft() : node->GetRight(), pos, range_sq, range, list, ordered, source_node);
334  if(ret >= 0 && fabs(dx) <= range)
335  {
336  added_res += ret;
337  ret = __NearestInRange(dx <= 0.0 ? node->GetRight() : node->GetLeft(), pos, range_sq, range, list, ordered, source_node);
338  }
339 
340  if(ret == -1)
341  {
342  return -1;
343  }
344  added_res += ret;
345 
346  return added_res;
347 }
int GetAxis()
Definition: G4KDNode.hh:112
int __NearestInRange(G4KDNode *node, const double *pos, const double &range_sq, const double &range, G4KDTreeResult &list, int ordered, G4KDNode *source_node=0)
Definition: G4KDTree.cc:303
G4KDNode * GetLeft()
Definition: G4KDNode.hh:137
void Insert(double, G4KDNode *)
G4KDNode * GetRight()
Definition: G4KDNode.hh:142
const double * GetPosition()
Definition: G4KDNode.hh:127
T sqr(const T &x)
Definition: templates.hh:145
void * GetData(G4KDNode *)
Definition: G4KDNode.cc:45
#define DBL_MAX
Definition: templates.hh:83
void G4KDTree::__NearestToNode ( G4KDNode source_node,
G4KDNode node,
const double *  pos,
std::vector< G4KDNode * > &  result,
double *  result_dist_sq,
struct HyperRect fRect,
int nbresult 
)
protected

Definition at line 462 of file G4KDTree.cc.

References HyperRect::CompareDistSqr(), G4KDNode::GetAxis(), G4KDNode::GetData(), G4KDNode::GetLeft(), HyperRect::GetMax(), HyperRect::GetMin(), G4KDNode::GetPosition(), G4KDNode::GetRight(), and sqr().

Referenced by Nearest().

465 {
466  int dir = node->GetAxis();
467  double dummy, dist_sq;
468  G4KDNode *nearer_subtree (0), *farther_subtree (0);
469  double *nearer_hyperrect_coord (0), *farther_hyperrect_coord (0);
470 
471  /* Decide whether to go left or right in the tree */
472  dummy = pos[dir] - node->GetPosition()[dir];
473  if (dummy <= 0)
474  {
475  nearer_subtree = node->GetLeft();
476  farther_subtree = node->GetRight();
477  nearer_hyperrect_coord = rect->GetMax() + dir;
478  farther_hyperrect_coord = rect->GetMin() + dir;
479  }
480  else
481  {
482  nearer_subtree = node->GetRight();
483  farther_subtree = node->GetLeft();
484  nearer_hyperrect_coord = rect->GetMin() + dir;
485  farther_hyperrect_coord = rect->GetMax() + dir;
486  }
487 
488  if (nearer_subtree)
489  {
490  /* Slice the hyperrect to get the hyperrect of the nearer subtree */
491  dummy = *nearer_hyperrect_coord;
492  *nearer_hyperrect_coord = node->GetPosition()[dir];
493  /* Recurse down into nearer subtree */
494  __NearestToNode(source_node, nearer_subtree, pos, result, result_dist_sq, rect, nbresult);
495  /* Undo the slice */
496  *nearer_hyperrect_coord = dummy;
497  }
498 
499  /* Check the distance of the point at the current node, compare it
500  * with our best so far */
501  if(node->GetData() && node != source_node)
502  {
503  dist_sq = 0;
504  bool do_break = false;
505  for(int i=0; i < fDim; i++)
506  {
507  dist_sq += sqr(node->GetPosition()[i] - pos[i]);
508  if(dist_sq > *result_dist_sq)
509  {
510  do_break = true;
511  break ;
512  }
513  }
514  if(!do_break)
515  {
516  if (dist_sq < *result_dist_sq)
517  {
518  result.clear();
519  nbresult = 1 ;
520  result.push_back(node);
521  *result_dist_sq = dist_sq;
522  }
523  else if(dist_sq == *result_dist_sq)
524  {
525  result.push_back(node);
526  nbresult++;
527  }
528  }
529  }
530 
531  if (farther_subtree)
532  {
533  /* Get the hyperrect of the farther subtree */
534  dummy = *farther_hyperrect_coord;
535  *farther_hyperrect_coord = node->GetPosition()[dir];
536  /* Check if we have to recurse down by calculating the closest
537  * point of the hyperrect and see if it's closer than our
538  * minimum distance in result_dist_sq. */
539  // if (hyperrect_dist_sq(rect, pos) < *result_dist_sq)
540  if (rect->CompareDistSqr(pos,result_dist_sq))
541  {
542  /* Recurse down into farther subtree */
543  __NearestToNode(source_node, farther_subtree, pos, result, result_dist_sq, rect, nbresult);
544  }
545  /* Undo the slice on the hyperrect */
546  *farther_hyperrect_coord = dummy;
547  }
548 }
int GetAxis()
Definition: G4KDNode.hh:112
G4KDNode * GetLeft()
Definition: G4KDNode.hh:137
void * GetData()
Definition: G4KDNode.hh:117
void __NearestToNode(G4KDNode *source_node, G4KDNode *node, const double *pos, std::vector< G4KDNode * > &result, double *result_dist_sq, struct HyperRect *fRect, int &nbresult)
Definition: G4KDTree.cc:462
G4KDNode * GetRight()
Definition: G4KDNode.hh:142
const double * GetPosition()
Definition: G4KDNode.hh:127
T sqr(const T &x)
Definition: templates.hh:145
void G4KDTree::__NearestToPosition ( G4KDNode node,
const double *  pos,
G4KDNode *&  result,
double *  result_dist_sq,
struct HyperRect fRect 
)
protected

Definition at line 350 of file G4KDTree.cc.

References HyperRect::CompareDistSqr(), G4KDNode::GetAxis(), G4KDNode::GetData(), G4KDNode::GetLeft(), HyperRect::GetMax(), HyperRect::GetMin(), G4KDNode::GetPosition(), G4KDNode::GetRight(), and sqr().

Referenced by Nearest().

352 {
353  int dir = node->GetAxis();
354  int i;
355  double dummy(0.), dist_sq(-1.);
356  G4KDNode *nearer_subtree(0), *farther_subtree (0);
357  double *nearer_hyperrect_coord(0),*farther_hyperrect_coord(0);
358 
359  /* Decide whether to go left or right in the tree */
360  dummy = pos[dir] - node->GetPosition()[dir];
361  if (dummy <= 0)
362  {
363  nearer_subtree = node->GetLeft();
364  farther_subtree = node->GetRight();
365 
366  nearer_hyperrect_coord = rect->GetMax() + dir;
367  farther_hyperrect_coord = rect->GetMin() + dir;
368  }
369  else
370  {
371  nearer_subtree = node->GetRight();
372  farther_subtree = node->GetLeft();
373  nearer_hyperrect_coord = rect->GetMin() + dir;
374  farther_hyperrect_coord = rect->GetMax() + dir;
375  }
376 
377  if (nearer_subtree)
378  {
379  /* Slice the hyperrect to get the hyperrect of the nearer subtree */
380  dummy = *nearer_hyperrect_coord;
381  *nearer_hyperrect_coord = node->GetPosition()[dir];
382  /* Recurse down into nearer subtree */
383  __NearestToPosition(nearer_subtree, pos, result, result_dist_sq, rect);
384  /* Undo the slice */
385  *nearer_hyperrect_coord = dummy;
386  }
387 
388  /* Check the distance of the point at the current node, compare it
389  * with our best so far */
390  if(node->GetData())
391  {
392  dist_sq = 0;
393  bool do_break = false ;
394  for(i=0; i < fDim; i++)
395  {
396  dist_sq += sqr(node->GetPosition()[i] - pos[i]);
397  if(dist_sq > *result_dist_sq)
398  {
399  do_break = true;
400  break ;
401  }
402  }
403  if (!do_break && dist_sq < *result_dist_sq)
404  {
405  result = node;
406  *result_dist_sq = dist_sq;
407  }
408  }
409 
410  if (farther_subtree)
411  {
412  /* Get the hyperrect of the farther subtree */
413  dummy = *farther_hyperrect_coord;
414  *farther_hyperrect_coord = node->GetPosition()[dir];
415  /* Check if we have to recurse down by calculating the closest
416  * point of the hyperrect and see if it's closer than our
417  * minimum distance in result_dist_sq. */
418  if (rect->CompareDistSqr(pos,result_dist_sq))
419  {
420  /* Recurse down into farther subtree */
421  __NearestToPosition(farther_subtree, pos, result, result_dist_sq, rect);
422  }
423  /* Undo the slice on the hyperrect */
424  *farther_hyperrect_coord = dummy;
425  }
426 }
int GetAxis()
Definition: G4KDNode.hh:112
G4KDNode * GetLeft()
Definition: G4KDNode.hh:137
void * GetData()
Definition: G4KDNode.hh:117
G4KDNode * GetRight()
Definition: G4KDNode.hh:142
const double * GetPosition()
Definition: G4KDNode.hh:127
void __NearestToPosition(G4KDNode *node, const double *pos, G4KDNode *&result, double *result_dist_sq, struct HyperRect *fRect)
Definition: G4KDTree.cc:350
T sqr(const T &x)
Definition: templates.hh:145
void G4KDTree::Build ( )

Definition at line 241 of file G4KDTree.cc.

References HyperRect::Extend(), fRoot, G4KDNode::GetPosition(), G4KDMap::GetSize(), G4KDNode::Insert(), n, and G4KDMap::PopOutMiddle().

242 {
243  int Nnodes = fKDMap->GetSize();
244 
245  G4KDNode* root = fKDMap->PopOutMiddle(0);
246 
247  fRoot = root;
248  fRect = new HyperRect(fDim,fRoot->GetPosition(),fRoot->GetPosition());
249 
250  Nnodes--;
251 
252  for(int n = 0 ; n < Nnodes ; n = n+fDim)
253  {
254  for(int dim = 0 ; dim < fDim ; dim ++)
255  {
256  G4KDNode* node = fKDMap->PopOutMiddle(dim);
257  fRoot->Insert(node);
258  fRect->Extend(node->GetPosition());
259  }
260  }
261 }
G4KDNode * PopOutMiddle(int dimension)
Definition: G4KDMap.cc:92
size_t GetSize()
Definition: G4KDMap.hh:94
void Extend(const double *pos)
Definition: G4KDTree.cc:113
G4KDNode * Insert(const double *p, void *data)
Definition: G4KDNode.cc:156
const G4int n
const double * GetPosition()
Definition: G4KDNode.hh:127
G4KDNode * fRoot
Definition: G4KDTree.hh:72
void G4KDTree::Clear ( )

Definition at line 193 of file G4KDTree.cc.

References __Clear_Rec(), and fRoot.

194 {
196  fRoot = 0;
197  fNbNodes = 0;
198 
199  if (fRect)
200  {
201  delete fRect;
202  fRect = 0;
203  }
204 }
void __Clear_Rec(G4KDNode *node)
Definition: G4KDTree.cc:206
G4KDNode * fRoot
Definition: G4KDTree.hh:72
int G4KDTree::GetDim ( )
inline

Definition at line 143 of file G4KDTree.hh.

References HyperRect::fDim.

Referenced by G4KDNode::GetDim(), and G4KDTreeResult::GetItem().

144 {
145  return fDim ;
146 }
int G4KDTree::GetNbNodes ( )
inline

Definition at line 83 of file G4KDTree.hh.

83 { return fNbNodes; }
G4KDNode* G4KDTree::GetRoot ( )
inline

Definition at line 84 of file G4KDTree.hh.

References fRoot.

84 { return fRoot ; }
G4KDNode * fRoot
Definition: G4KDTree.hh:72
G4KDNode * G4KDTree::Insert ( const double *  pos,
void data 
)

Definition at line 263 of file G4KDTree.cc.

References HyperRect::Extend(), fRoot, G4KDNode, and G4KDNode::Insert().

Referenced by Insert().

264 {
265  G4KDNode* node = 0 ;
266  if(!fRoot)
267  {
268  fRoot = new G4KDNode(this,pos,data,0, 0);
269  node = fRoot;
270  fNbNodes = 0;
271  fNbNodes++;
272  }
273  else
274  {
275  if((node=fRoot->Insert(pos, data)))
276  {
277  fNbNodes++;
278  }
279  }
280 
281  if (fRect == 0)
282  {
283  fRect = new HyperRect(fDim,pos,pos);
284  }
285  else
286  {
287  fRect->Extend(pos);
288  }
289 
290  return node;
291 }
void Extend(const double *pos)
Definition: G4KDTree.cc:113
G4KDNode * Insert(const double *p, void *data)
Definition: G4KDNode.cc:156
friend class G4KDNode
Definition: G4KDTree.hh:64
G4KDNode * fRoot
Definition: G4KDTree.hh:72
const XML_Char const XML_Char * data
G4KDNode * G4KDTree::Insert ( const double &  x,
const double &  y,
const double &  z,
void data 
)

Definition at line 293 of file G4KDTree.cc.

References Insert(), test::x, and z.

294 {
295  double buf[3];
296  buf[0] = x;
297  buf[1] = y;
298  buf[2] = z;
299  return Insert(buf, data);
300 }
G4double z
Definition: TRTMaterials.hh:39
G4KDNode * Insert(const double *pos, void *data)
Definition: G4KDTree.cc:263
const XML_Char const XML_Char * data
G4KDNode * G4KDTree::InsertMap ( const double &  x,
const double &  y,
const double &  z,
void data 
)

Definition at line 224 of file G4KDTree.cc.

References test::x, and z.

225 {
226  double buf[3];
227  buf[0] = x;
228  buf[1] = y;
229  buf[2] = z;
230  return InsertMap(buf, data);
231 }
G4double z
Definition: TRTMaterials.hh:39
G4KDNode * InsertMap(const double &x, const double &y, const double &z, void *data)
Definition: G4KDTree.cc:224
const XML_Char const XML_Char * data
G4KDNode * G4KDTree::InsertMap ( const double *  pos,
void data 
)

Definition at line 233 of file G4KDTree.cc.

References G4KDNode, and G4KDMap::Insert().

234 {
235  G4KDNode* node = new G4KDNode(this,pos,data,0,-2) ;
236  // -2 = valeur intentionnellement absurde
237  fKDMap->Insert(node);
238  return node;
239 }
friend class G4KDNode
Definition: G4KDTree.hh:64
const XML_Char const XML_Char * data
void Insert(G4KDNode *pos)
Definition: G4KDMap.cc:73
G4KDTreeResultHandle G4KDTree::Nearest ( const double *  pos)

Definition at line 428 of file G4KDTree.cc.

References __NearestToPosition(), DBL_MAX, and fRoot.

Referenced by Nearest().

429 {
430  // G4cout << "Nearest(pos)" << G4endl ;
431 
432  if (!fRect) return 0;
433 
434  G4KDNode *result(0);
435  double dist_sq = DBL_MAX;
436 
437  /* Duplicate the bounding hyperrectangle, we will work on the copy */
438  HyperRect *newrect = new HyperRect(*fRect);
439 
440  /* Our first guesstimate is the root node */
441  /* Search for the nearest neighbour recursively */
442  __NearestToPosition(fRoot, pos, result, &dist_sq, newrect);
443 
444  /* Free the copy of the hyperrect */
445  delete newrect;
446 
447  /* Store the result */
448  if (result)
449  {
450  G4KDTreeResultHandle rset = new G4KDTreeResult(this);
451  rset->Insert(dist_sq, result);
452  rset -> Rewind();
453  return rset;
454  }
455  else
456  {
457  return 0;
458  }
459 }
void __NearestToPosition(G4KDNode *node, const double *pos, G4KDNode *&result, double *result_dist_sq, struct HyperRect *fRect)
Definition: G4KDTree.cc:350
G4KDNode * fRoot
Definition: G4KDTree.hh:72
#define DBL_MAX
Definition: templates.hh:83
G4KDTreeResultHandle G4KDTree::Nearest ( const double &  x,
const double &  y,
const double &  z 
)

Definition at line 594 of file G4KDTree.cc.

References Nearest(), test::x, and z.

595 {
596  double pos[3];
597  pos[0] = x;
598  pos[1] = y;
599  pos[2] = z;
600  return Nearest(pos);
601 }
G4double z
Definition: TRTMaterials.hh:39
G4KDTreeResultHandle Nearest(const double *pos)
Definition: G4KDTree.cc:428
G4KDTreeResultHandle G4KDTree::Nearest ( G4KDNode node)

Definition at line 550 of file G4KDTree.cc.

References __NearestToNode(), DBL_MAX, fRoot, G4cout, G4endl, and G4KDNode::GetPosition().

551 {
552  // G4cout << "Nearest(node)" << G4endl ;
553  if (!fRect)
554  {
555  G4cout << "Tree empty" << G4endl ;
556  return 0;
557  }
558 
559  const double* pos = node->GetPosition();
560  std::vector<G4KDNode*> result;
561  double dist_sq = DBL_MAX;
562 
563  /* Duplicate the bounding hyperrectangle, we will work on the copy */
564  HyperRect *newrect = new HyperRect(*fRect);
565 
566  /* Search for the nearest neighbour recursively */
567  int nbresult = 0 ;
568 
569  __NearestToNode(node, fRoot, pos, result, &dist_sq, newrect, nbresult);
570 
571  /* Free the copy of the hyperrect */
572  delete newrect;
573 
574  /* Store the result */
575  if (!result.empty())
576  {
577  G4KDTreeResultHandle rset(new G4KDTreeResult(this));
578  int j = 0 ;
579  while (j<nbresult)
580  {
581  rset->Insert(dist_sq, result[j]);
582  j++;
583  }
584  rset->Rewind();
585 
586  return rset;
587  }
588  else
589  {
590  return 0;
591  }
592 }
G4GLOB_DLL std::ostream G4cout
void __NearestToNode(G4KDNode *source_node, G4KDNode *node, const double *pos, std::vector< G4KDNode * > &result, double *result_dist_sq, struct HyperRect *fRect, int &nbresult)
Definition: G4KDTree.cc:462
const double * GetPosition()
Definition: G4KDNode.hh:127
#define G4endl
Definition: G4ios.hh:61
G4KDNode * fRoot
Definition: G4KDTree.hh:72
#define DBL_MAX
Definition: templates.hh:83
G4KDTreeResultHandle G4KDTree::NearestInRange ( const double *  pos,
const double &  range 
)

Definition at line 603 of file G4KDTree.cc.

References __NearestInRange(), fRoot, and sqr().

Referenced by NearestInRange().

604 {
605  int ret(-1);
606 
607  const double range_sq = sqr(range) ;
608 
609  G4KDTreeResultHandle rset = new G4KDTreeResult(this);
610  if((ret = __NearestInRange(fRoot, pos, range_sq, range, *(rset()), 0)) == -1)
611  {
612  rset = 0;
613  return rset;
614  }
615  rset->Sort();
616  rset->Rewind();
617  return rset;
618 }
int __NearestInRange(G4KDNode *node, const double *pos, const double &range_sq, const double &range, G4KDTreeResult &list, int ordered, G4KDNode *source_node=0)
Definition: G4KDTree.cc:303
T sqr(const T &x)
Definition: templates.hh:145
G4KDNode * fRoot
Definition: G4KDTree.hh:72
G4KDTreeResultHandle G4KDTree::NearestInRange ( const double &  x,
const double &  y,
const double &  z,
const double &  range 
)

Definition at line 620 of file G4KDTree.cc.

References NearestInRange(), test::x, and z.

624 {
625  double buf[3];
626  buf[0] = x;
627  buf[1] = y;
628  buf[2] = z;
629  return NearestInRange(buf, range);
630 }
G4double z
Definition: TRTMaterials.hh:39
G4KDTreeResultHandle NearestInRange(const double *pos, const double &range)
Definition: G4KDTree.cc:603
G4KDTreeResultHandle G4KDTree::NearestInRange ( G4KDNode node,
const double &  range 
)

Definition at line 632 of file G4KDTree.cc.

References __NearestInRange(), fRoot, G4KDNode::GetPosition(), and sqr().

633 {
634  if(!node) return 0 ;
635  int ret(-1);
636 
637  G4KDTreeResult *rset = new G4KDTreeResult(this);
638 
639  const double range_sq = sqr(range) ;
640 
641  if((ret = __NearestInRange(fRoot, node->GetPosition(), range_sq, range, *rset, 0, node)) == -1)
642  {
643  delete rset;
644  return 0;
645  }
646  rset->Sort();
647  rset->Rewind();
648  return rset;
649 }
int __NearestInRange(G4KDNode *node, const double *pos, const double &range_sq, const double &range, G4KDTreeResult &list, int ordered, G4KDNode *source_node=0)
Definition: G4KDTree.cc:303
const double * GetPosition()
Definition: G4KDNode.hh:127
T sqr(const T &x)
Definition: templates.hh:145
G4KDNode * fRoot
Definition: G4KDTree.hh:72
void G4KDTree::SetDataDestructor ( void(*)(void *)  fDestr)
inline

Definition at line 148 of file G4KDTree.hh.

149 {
150  fDestr = fct;
151 }

Friends And Related Function Documentation

friend class G4KDNode
friend

Definition at line 64 of file G4KDTree.hh.

Referenced by Insert(), and InsertMap().

Field Documentation

G4KDNode* G4KDTree::fRoot
protected

Definition at line 72 of file G4KDTree.hh.

Referenced by Build(), Clear(), G4KDTree(), GetRoot(), Insert(), Nearest(), NearestInRange(), and ~G4KDTree().


The documentation for this class was generated from the following files: