Example #1
0
 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
Example #2
0
 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
Example #3
0
 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]]))
Example #4
0
 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]]))
Example #5
0
 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]]))
Example #6
0
 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]]))
Example #7
0
 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]]))
Example #8
0
 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]]))
Example #9
0
 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]]))
Example #10
0
 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]]))
Example #11
0
 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]]))