mirror of
https://github.com/python/cpython.git
synced 2025-07-19 17:25:54 +00:00
Initial revision
This commit is contained in:
parent
df79a1ee19
commit
c636014c43
47 changed files with 5492 additions and 0 deletions
87
Lib/lib-stdwin/rect.py
Normal file
87
Lib/lib-stdwin/rect.py
Normal file
|
@ -0,0 +1,87 @@
|
|||
# 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 not is_empty(rect):
|
||||
(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)
|
Loading…
Add table
Add a link
Reference in a new issue