fonttools/Lib/fontTools/misc/arrayTools.py
Just b3026bad35 added intRect() function. Turn any rect into a rect using ints only.
git-svn-id: svn://svn.code.sf.net/p/fonttools/code/trunk@66 4cde692c-a291-49d1-8350-778aa11640f8
2000-01-22 00:26:07 +00:00

59 lines
1.4 KiB
Python

#
# This module should move to a more appropriate location
#
import Numeric
def calcBounds(array):
"""Calculate the bounding rectangle of a 2D array.
Returns a 4-tuple:
smallest x, smallest y, largest x, largest y.
"""
if len(array) == 0:
return 0, 0, 0, 0
xmin, ymin = Numeric.minimum.reduce(array)
xmax, ymax = Numeric.maximum.reduce(array)
return xmin, ymin, xmax, ymax
def pointsInRect(array, rect):
"""Find out which points or array are inside rect.
Returns an array with a boolean for each point.
"""
if len(array) < 1:
return []
lefttop = rect[:2]
rightbottom = rect[2:]
condition = Numeric.logical_and(
Numeric.greater(array, lefttop),
Numeric.less(array, rightbottom))
return Numeric.logical_and.reduce(condition, -1)
def normRect((l, t, r, b)):
"""XXX doc"""
return min(l, r), min(t, b), max(l, r), max(t, b)
def scaleRect((l, t, r, b), x, y):
return l * x, t * y, r * x, b * y
def offsetRect((l, t, r, b), dx, dy):
return l+dx, t+dy, r+dx, b+dy
def insetRect((l, t, r, b), dx, dy):
return l+dx, t+dy, r-dx, b-dy
def sectRect((l1, t1, r1, b1), (l2, t2, r2, b2)):
l, t, r, b = max(l1, l2), max(t1, t2), min(r1, r2), min(b1, b2)
if l >= r or t >= b:
return 0, (0, 0, 0, 0)
return 1, (l, t, r, b)
def intRect(rect):
rect = Numeric.array(rect)
l, t = Numeric.floor(rect[:2])
r, b = Numeric.ceil(rect[2:])
return tuple(Numeric.array((l, t, r, b)).astype(Numeric.Int))