# Module 'rect'. # # Operations on rectangles. # There is some normalization: all results return the object 'empty' # if their result would contain no points. # Exception. # error = 'rect.error' # The empty rectangle. # empty = (0, 0), (0, 0) # Check if a rectangle is empty. # def is_empty(r): (left, top), (right, bottom) = r return left >= right or top >= bottom # Compute the intersection or two or more rectangles. # This works with a list or tuple argument. # def intersect(list): if not list: raise error, 'intersect called with empty list' if is_empty(list[0]): return empty (left, top), (right, bottom) = list[0] for rect in list[1:]: if is_empty(rect): return empty (l, t), (r, b) = rect if left < l: left = l if top < t: top = t if right > r: right = r if bottom > b: bottom = b if is_empty(((left, top), (right, bottom))): return empty return (left, top), (right, bottom) # Compute the smallest rectangle containing all given rectangles. # This works with a list or tuple argument. # def union(list): (left, top), (right, bottom) = list[0] for (l, t), (r, b) in list[1:]: if not is_empty(((l, t), (r, b))): if l < left: left = l if t < top: top = t if r > right: right = r if b > bottom: bottom = b res = (left, top), (right, bottom) if is_empty(res): return empty return res # Check if a point is in a rectangle. # def pointinrect((h, v), ((left, top), (right, bottom))): return left <= h < right and top <= v < bottom # Return a rectangle that is dh, dv inside another # def inset(((left, top), (right, bottom)), (dh, dv)): left = left + dh top = top + dv right = right - dh bottom = bottom - dv r = (left, top), (right, bottom) if is_empty(r): return empty else: return r # Conversions between rectangles and 'geometry tuples', # given as origin (h, v) and dimensions (width, height). # def rect2geom((left, top), (right, bottom)): return (left, top), (right-left, bottom-top) def geom2rect((h, v), (width, height)): return (h, v), (h+width, v+height)