Skip to content

Commit b87f8d8

Browse files
authored
remove duplicate code (#10)
1 parent 55846ec commit b87f8d8

File tree

2 files changed

+24
-76
lines changed

2 files changed

+24
-76
lines changed

aabbtree.py

Lines changed: 23 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -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))

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ def read(fname):
1515

1616
setup(
1717
name='aabbtree',
18-
version='2.6.0',
18+
version='2.6.1',
1919
license='MIT',
2020
description='Pure Python implementation of d-dimensional AABB tree.',
2121
long_description=read('README.rst'),

0 commit comments

Comments
 (0)