@@ -445,76 +445,7 @@ def does_overlap(self, aabb, method='DFS'):
445445 Returns:
446446 bool: True if overlaps with a leaf node of tree.
447447 """
448- if isinstance (aabb , AABB ):
449- tree = AABBTree (aabb = aabb )
450- else :
451- tree = aabb
452-
453- if method == 'DFS' :
454- if self .is_leaf and tree .is_leaf :
455- return self .aabb .overlaps (tree .aabb )
456-
457- if self .is_leaf :
458- left_over = tree .left .aabb .overlaps (self .aabb )
459- right_over = tree .right .aabb .overlaps (self .aabb )
460-
461- if left_over and tree .left .does_overlap (self , method ):
462- return True
463- if right_over and tree .right .does_overlap (self , method ):
464- return True
465- return False
466- if tree .is_leaf :
467- left_over = self .left .aabb .overlaps (tree .aabb )
468- right_over = self .right .aabb .overlaps (tree .aabb )
469-
470- if left_over and self .left .does_overlap (tree , method ):
471- return True
472- if right_over and self .right .does_overlap (tree , method ):
473- return True
474- return False
475-
476- # If both `self` and `tree` are trees
477- if not self .aabb .overlaps (tree .aabb ):
478- return False
479-
480- left_left = self .left .aabb .overlaps (tree .left .aabb )
481- left_right = self .left .aabb .overlaps (tree .right .aabb )
482- right_left = self .right .aabb .overlaps (tree .left .aabb )
483- right_right = self .right .aabb .overlaps (tree .right .aabb )
484-
485- if left_left and self .left .does_overlap (tree .left , method ):
486- return True
487- if left_right and self .left .does_overlap (tree .right , method ):
488- return True
489- if right_left and self .right .does_overlap (tree .left , method ):
490- return True
491- if right_right and self .right .does_overlap (tree .right , method ):
492- return True
493- return False
494-
495- if method == 'BFS' :
496- q = deque ()
497- q .append ((self , tree ))
498- while len (q ) > 0 :
499- s_node , t_node = q .popleft ()
500- overlaps = s_node .aabb .overlaps (t_node .aabb )
501- if overlaps and s_node .is_leaf and t_node .is_leaf :
502- return True
503- if overlaps and s_node .is_leaf :
504- q .append ((s_node , t_node .left ))
505- q .append ((s_node , t_node .right ))
506- elif overlaps and t_node .is_leaf :
507- q .append ((s_node .left , t_node ))
508- q .append ((s_node .right , t_node ))
509- elif overlaps :
510- q .append ((s_node .left , t_node .left ))
511- q .append ((s_node .left , t_node .right ))
512- q .append ((s_node .right , t_node .left ))
513- q .append ((s_node .right , t_node .right ))
514- return False
515-
516- e_str = "method should be 'DFS' or 'BFS', not " + str (method )
517- raise ValueError (e_str )
448+ return len (self ._overlap_pairs (aabb , method , halt = True )) > 0
518449
519450 def overlap_aabbs (self , aabb , method = 'DFS' ):
520451 """Get overlapping AABBs
@@ -566,7 +497,7 @@ def overlap_values(self, aabb, method='DFS'):
566497 _ , values = zip (* pairs )
567498 return list (values )
568499
569- def _overlap_pairs (self , aabb , method = 'DFS' ):
500+ def _overlap_pairs (self , aabb , method = 'DFS' , halt = False ):
570501 """Get overlapping AABBs and values in (AABB, value) pairs
571502
572503 *New in version 2.6.0*
@@ -578,6 +509,8 @@ def _overlap_pairs(self, aabb, method='DFS'):
578509 method (str): {'DFS'|'BFS'} Method for traversing the tree.
579510 Setting 'DFS' performs a depth-first search and 'BFS' performs
580511 a breadth-first search. Defaults to 'DFS'.
512+ halt (bool): Return the list immediately once a pair has been
513+ added.
581514
582515 Returns:
583516 list: (AABB, value) pairs in AABBTree that overlap with the input.
@@ -590,17 +523,30 @@ def _overlap_pairs(self, aabb, method='DFS'):
590523 pairs = []
591524
592525 if method == 'DFS' :
593- if self .is_leaf and self .does_overlap (tree , method ):
594- pairs .append ((self .aabb , self .value ))
526+ if self .is_leaf and self .aabb .overlaps (tree .aabb ):
527+ if tree .is_leaf :
528+ pairs .append ((self .aabb , self .value ))
529+ if halt :
530+ return pairs
531+ else :
532+ for branch in (tree .left , tree .right ):
533+ pairs .extend (self ._overlap_pairs (branch , method , halt ))
534+ if halt and len (pairs ) > 0 :
535+ return pairs
595536 elif self .is_leaf :
596537 pass
597538 elif tree .is_leaf :
598539 for branch in (self .left , self .right ):
599- pairs .extend (branch ._overlap_pairs (tree , method ))
540+ pairs .extend (branch ._overlap_pairs (tree , method , halt ))
541+ if halt and len (pairs ) > 0 :
542+ return pairs
600543 else :
601544 for s_branch in (self .left , self .right ):
602545 for t_branch in (tree .left , tree .right ):
603- pairs .extend (s_branch ._overlap_pairs (t_branch , method ))
546+ p = s_branch ._overlap_pairs (t_branch , method , halt )
547+ pairs .extend (p )
548+ if halt and len (pairs ) > 0 :
549+ return pairs
604550
605551 elif method == 'BFS' :
606552 q = deque ()
@@ -610,6 +556,8 @@ def _overlap_pairs(self, aabb, method='DFS'):
610556 if s_node .aabb .overlaps (t_node .aabb ):
611557 if s_node .is_leaf and t_node .is_leaf :
612558 pairs .append ((s_node .aabb , s_node .value ))
559+ if halt :
560+ return pairs
613561 elif s_node .is_leaf :
614562 q .append ((s_node , t_node .left ))
615563 q .append ((s_node , t_node .right ))
0 commit comments