def _create_shape_tree(xyz, A, B): """ Takes two lists A and B which are forming a tree """ AA, BB = None, None if len(A) == 1: AA = si.Sphere(radius, xyz[A[0]]) if len(B) == 0: return AA if len(B) == 1: BB = si.Sphere(radius, xyz[B[0]]) if len(A) == 0: return BB # Quick return if these are the final ones if AA and BB: return AA | BB idx_A1, idx_A2 = np.array_split(A, 2) idx_B1, idx_B2 = np.array_split(B, 2) if not AA: AA = _create_shape_tree(xyz, idx_A1, idx_A2) if not BB: BB = _create_shape_tree(xyz, idx_B1, idx_B2) return AA | BB
def _create_shape_tree(xyz, A, B=None): """ Takes two lists A and B which returns a shape with a binary nesting This makes further index handling much faster. """ if B is None or len(B) == 0: return _create_shape_tree(xyz, *np.array_split(A, 2)) AA, BB = None, None if len(A) == 1: AA = si.Sphere(radius, xyz[A[0]]) if len(B) == 0: return AA if len(B) == 1: BB = si.Sphere(radius, xyz[B[0]]) if len(A) == 0: return BB # Quick return if these are the final ones if AA and BB: return AA | BB if not AA: AA = _create_shape_tree(xyz, *np.array_split(A, 2)) if not BB: BB = _create_shape_tree(xyz, *np.array_split(B, 2)) return AA | BB