def mark_done(self, amount): if self.done: return if self.cover is None: self.cover = num_range.MultiRange() self.cover.add(amount) if self.cover == self.dim_to_range(): self.done = True
def push_as_far_as_available(self, edge): # Get closet edge dir = edge.facing min_dist = INFINITY answer = None for e in self.edges: if e.facing != opposite_dir(dir): continue if e.not_in_range_of(edge): continue dist = e.distance_from(edge) if dist < 0: continue if dist < min_dist: min_dist = dist answer = e # Collect other rectangles accum = [] for r in self.rects: side = r.get_side(opposite_dir(dir)) dist = edge.distance_from(side) if dist < -7: # rectangles that we're already inside of continue if side.partially_in_range_of(edge): accum.append([dist, side]) # Sort them by distance accum.sort(key=lambda n: n[0]) # Find when we reach coverage coverage = num_range.MultiRange() for dist, other in accum: coverage.add(other.dim_to_range()) if coverage.fully_overlap(edge.dim_to_range()): if dist < min_dist: min_dist = dist answer = other if answer is None: return edge if edge.facing in [DIR_UP, DIR_DOWN]: answer = geometry.Edge(edge.facing, answer.y0, edge.x0, answer.y0, edge.x1) else: answer = geometry.Edge(edge.facing, edge.y0, answer.x0, edge.y1, answer.x0) return answer
def test_multi_range_after_last(self): a = num_range.MultiRange([[5, 10], [20, 30]]) b = num_range.NumRange(60, 66) self.assertEqual(a.add(b), num_range.MultiRange([[5, 10], [20, 30], [60, 66]]))
def test_multi_range_before_first(self): a = num_range.MultiRange([[5, 10], [20, 30]]) b = num_range.NumRange(2, 3) self.assertEqual(a.add(b), num_range.MultiRange([[2, 3], [5, 10], [20, 30]]))
def test_multi_range_between(self): a = num_range.MultiRange([[5, 10], [20, 30]]) b = num_range.NumRange(13, 16) self.assertEqual(a.add(b), num_range.MultiRange([[5, 10], [13, 16], [20, 30]]))
def test_multi_range_combine(self): a = num_range.MultiRange([[5, 10], [20, 30]]) b = num_range.NumRange(8, 16) self.assertEqual(a.add(b), num_range.MultiRange([[5, 16], [20, 30]]))
def test_multi_range_complment_outside(self): a = num_range.MultiRange([[5, 10]]) b = num_range.NumRange(2, 20) self.assertEqual(a.subtract_from(b), num_range.MultiRange([[2, 5], [10, 20]]))
def test_multi_range_complment_middle(self): a = num_range.MultiRange([[5, 10], [20, 30]]) b = num_range.NumRange(5, 30) self.assertEqual(a.subtract_from(b), num_range.MultiRange([[10, 20]]))
def test_multi_range_complment_right(self): a = num_range.MultiRange([[5, 10]]) b = num_range.NumRange(7, 20) self.assertEqual(a.subtract_from(b), num_range.MultiRange([[10, 20]]))
def test_multi_range_complment_left(self): a = num_range.MultiRange([[5, 10]]) b = num_range.NumRange(2, 7) self.assertEqual(a.subtract_from(b), num_range.MultiRange([[2, 5]]))
def test_multi_range_combine_many(self): a = num_range.MultiRange([[5, 10], [20, 30], [40, 50], [60, 70]]) b = num_range.NumRange(25, 64) self.assertEqual(a.add(b), num_range.MultiRange([[5, 10], [20, 70]]))