mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			88 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
| # 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((left, top), (right, bottom)):
 | |
| 	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) = empty
 | |
| 	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)
 | 
