@@ -445,76 +445,7 @@ def does_overlap(self, aabb, method='DFS'):
445
445
Returns:
446
446
bool: True if overlaps with a leaf node of tree.
447
447
"""
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
518
449
519
450
def overlap_aabbs (self , aabb , method = 'DFS' ):
520
451
"""Get overlapping AABBs
@@ -566,7 +497,7 @@ def overlap_values(self, aabb, method='DFS'):
566
497
_ , values = zip (* pairs )
567
498
return list (values )
568
499
569
- def _overlap_pairs (self , aabb , method = 'DFS' ):
500
+ def _overlap_pairs (self , aabb , method = 'DFS' , halt = False ):
570
501
"""Get overlapping AABBs and values in (AABB, value) pairs
571
502
572
503
*New in version 2.6.0*
@@ -578,6 +509,8 @@ def _overlap_pairs(self, aabb, method='DFS'):
578
509
method (str): {'DFS'|'BFS'} Method for traversing the tree.
579
510
Setting 'DFS' performs a depth-first search and 'BFS' performs
580
511
a breadth-first search. Defaults to 'DFS'.
512
+ halt (bool): Return the list immediately once a pair has been
513
+ added.
581
514
582
515
Returns:
583
516
list: (AABB, value) pairs in AABBTree that overlap with the input.
@@ -590,17 +523,30 @@ def _overlap_pairs(self, aabb, method='DFS'):
590
523
pairs = []
591
524
592
525
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
595
536
elif self .is_leaf :
596
537
pass
597
538
elif tree .is_leaf :
598
539
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
600
543
else :
601
544
for s_branch in (self .left , self .right ):
602
545
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
604
550
605
551
elif method == 'BFS' :
606
552
q = deque ()
@@ -610,6 +556,8 @@ def _overlap_pairs(self, aabb, method='DFS'):
610
556
if s_node .aabb .overlaps (t_node .aabb ):
611
557
if s_node .is_leaf and t_node .is_leaf :
612
558
pairs .append ((s_node .aabb , s_node .value ))
559
+ if halt :
560
+ return pairs
613
561
elif s_node .is_leaf :
614
562
q .append ((s_node , t_node .left ))
615
563
q .append ((s_node , t_node .right ))
0 commit comments