import numpy as np
import os
from enum import Enum
from io import StringIO
[docs]
def profile(func):
from line_profiler import LineProfiler
def wrapper(*args, **kwargs):
lp = LineProfiler()
deco = lp(func)
res = deco(*args, **kwargs)
s = StringIO()
lp.print_stats(stream=s)
print(s.getvalue())
return res
return wrapper
[docs]
class SubdivisionType(Enum):
OCTREE = 1
QUADTREE = 2
[docs]
def name_to_filename(working_dir, nameb, suffix=''):
name = nameb.decode('ascii')
fullpath = [name[i:i + 8] for i in range(0, len(name), 8)] if name else ['']
folder = '{}/{}/'.format(
working_dir,
'/'.join(fullpath[:-1]))
if not os.path.exists(folder):
try:
os.makedirs(folder, exist_ok=True)
except OSError as exc:
print(exc)
filename = '{}r{}{}'.format(folder, fullpath[-1], suffix)
return filename
[docs]
def compute_spacing(aabb):
return float(np.linalg.norm(aabb[1] - aabb[0]) / 125)
[docs]
def aabb_size_to_subdivision_type(size):
if size[2] / min(size[0], size[1]) < 0.5:
return SubdivisionType.QUADTREE
else:
return SubdivisionType.OCTREE
[docs]
def split_aabb(aabb, index, force_quadtree=False):
half = (aabb[1] - aabb[0]) * 0.5
t = aabb_size_to_subdivision_type(half)
new_aabb = np.array([np.copy(aabb[0]), aabb[0] + half])
if index & 4:
new_aabb[0][0] += half[0]
new_aabb[1][0] += half[0]
if index & 2:
new_aabb[0][1] += half[1]
new_aabb[1][1] += half[1]
if force_quadtree or t == SubdivisionType.QUADTREE:
new_aabb[1][2] += half[2]
elif index & 1:
new_aabb[0][2] += half[2]
new_aabb[1][2] += half[2]
return new_aabb
[docs]
def make_aabb_cubic(aabb):
s = max(aabb[1] - aabb[0])
aabb[1][0] = aabb[0][0] + s
aabb[1][1] = aabb[0][1] + s
aabb[1][2] = aabb[0][2] + s
return aabb
[docs]
def node_from_name(name, parent_aabb, parent_spacing):
from .node import Node
spacing = parent_spacing * 0.5
aabb = split_aabb(parent_aabb, int(name[-1])) if len(name) > 0 else parent_aabb
# let's build a new Node
return Node(name, aabb, spacing)