def overlaping_zone(self, other): if not isinstance(other, ZoneBase): raise TypeError("Expected other to be type ZoneBase.") self_min, self_max = self.min_corner, self.max_corner other_min, other_max = other.min_corner, other.max_corner for axis in range(len(self._pos)): if other_max[axis] < self_min[axis]: return None if self_max[axis] < other_min[axis]: return None result_min = self_min.max_corner(other_min) result_max = self_max.min_corner(other_max) result_size = result_max - result_min + Pos([1] * len(self._pos)) result = ZoneBase(pos=result_min, size=result_size) if not result: return None return result
def split_by_overlap(self, overlap): """Returns a list of fragments of this zone, split by an overlapping zone.""" # overlap is a ZoneBase that overlaps and doesn't extend beyond this ZoneFragment. if not isinstance(overlap, ZoneBase): raise TypeError("Expected overlap to be type ZoneBase.") center_zone = ZoneFragment(self) other_min = overlap.min_corner other_max = overlap.max_corner + Pos([1] * len(other_min)) result = [] for axis in self.axis_order: if axis > len(other_max): # Skip axis if they don't apply continue work_zones = result result = [] for work_zone in work_zones: # Add zones split from existing split zones lower, work_zone = work_zone.split_axis(other_min, axis) work_zone, upper = work_zone.split_axis(other_max, axis) if lower: result.append(lower) if work_zone: result.append(work_zone) if upper: result.append(upper) # Add zones split from center, but not the center (overlap) itself lower, center_zone = center_zone.split_axis(other_min, axis) center_zone, upper = center_zone.split_axis(other_max, axis) if lower: result.append(lower) if upper: result.append(upper) return result
def true_max_corner(self, other): new_max = Pos(other) old_max = self.true_max_corner self._size += new_max - old_max
def max_corner(self, other): new_max = Pos(other) old_max = self.pos2 self._size += new_max - old_max
def min_corner(self, other): new_pos1 = Pos(other) self._size += self._pos - new_pos1 self._pos = new_pos1
def pos2(self): return self._pos + self._size - Pos([1] * len(self._pos))
def _init_from_values(self, pos, size): self._pos = Pos(pos) self._size = Pos(size)
def _init_from_config(self, other): a = Pos(other["pos1"]) b = Pos(other["pos2"]) self._pos = a.min_corner(b) self._size = a.max_corner(b) + Pos([1] * len(self._pos)) - self._pos
#!/usr/bin/env python3 import json from lib.pos import Pos from lib.zone_manager import ZoneManager with open("../config/region_1.json", "r") as fp: region_1_prop = json.load(fp) fp.close() test = ZoneManager(region_1_prop["locationBounds"]) tree = test.tree print("-" * 120) print("Ave depth: {:04.2f}".format(tree.average_depth())) print("Max depth: {}".format(tree.max_depth())) print("Leaf nodes: {}".format(len(tree))) print("=" * 120) print("Look out for that tree!") tree.show_tree() print("-" * 120) print("Golden block's zone is:") print("{!r}".format(tree.get_zone(Pos("-1441 2 -1441"))))