# # Various array and rectangle tools # 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 vectorLength(vector): return Numeric.sqrt(vector[0]**2 + vector[1]**2) def asInt16(array): "Round and cast to 16 bit integer." return Numeric.floor(array + 0.5).astype(Numeric.Int16) 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 unionRect((l1, t1, r1, b1), (l2, t2, r2, b2)): l, t, r, b = min(l1, l2), min(t1, t2), max(r1, r2), max(b1, b2) return (l, t, r, b) def rectCenter((l, t, r, b)): return (l+r)/2, (t+b)/2 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))