# arrayTools: Various array and rectangle tools

Routines for calculating bounding boxes, point in rectangle calculations and so on.

fontTools.misc.arrayTools.calcBounds(array)

  Calculate the bounding rectangle of a 2D points array.

  Parameters:

    array – A sequence of 2D tuples.

  Returns:

    A four-item tuple representing the bounding rectangle `(xMin, yMin, xMax, yMax)`.

fontTools.misc.arrayTools.calcIntBounds(array, round=<function otRound>)

  Calculate the integer bounding rectangle of a 2D points array.

  Values are rounded to closest integer towards `+Infinity` using the `fontTools.misc.fixedTools.otRound()` function by default, unless an optional `round` function is passed.

  Parameters:

    - array – A sequence of 2D tuples.

    - round – A rounding function of type `f(x: float) -> int`.

  Returns:

    `(xMin, yMin, xMax, yMax)`.

  Return type:

    A four-item tuple of integers representing the bounding rectangle

fontTools.misc.arrayTools.updateBounds(bounds, p, min=<built-in function min>, max=<built-in function max>)

  Add a point to a bounding rectangle.

  Parameters:

    - bounds – A bounding rectangle expressed as a tuple `(xMin, yMin, xMax, yMax), or None`.

    - p – A 2D tuple representing a point.

    - min – functions to compute the minimum and maximum.

    - max – functions to compute the minimum and maximum.

  Returns:

    The updated bounding rectangle `(xMin, yMin, xMax, yMax)`.

fontTools.misc.arrayTools.pointInRect(p, rect)

  Test if a point is inside a bounding rectangle.

  Parameters:

    - p – A 2D tuple representing a point.

    - rect – A bounding rectangle expressed as a tuple `(xMin, yMin, xMax, yMax)`.

  Returns:

    `True` if the point is inside the rectangle, `False` otherwise.

fontTools.misc.arrayTools.pointsInRect(array, rect)

  Determine which points are inside a bounding rectangle.

  Parameters:

    - array – A sequence of 2D tuples.

    - rect – A bounding rectangle expressed as a tuple `(xMin, yMin, xMax, yMax)`.

  Returns:

    A list containing the points inside the rectangle.

fontTools.misc.arrayTools.vectorLength(vector)

  Calculate the length of the given vector.

  Parameters:

    vector – A 2D tuple.

  Returns:

    The Euclidean length of the vector.

fontTools.misc.arrayTools.asInt16(array)

  Round a list of floats to 16-bit signed integers.

  Parameters:

    array – List of float values.

  Returns:

    A list of rounded integers.

fontTools.misc.arrayTools.normRect(rect)

  Normalize a bounding box rectangle.

  This function “turns the rectangle the right way up”, so that the following holds:

      xMin <= xMax and yMin <= yMax

  Parameters:

    rect – A bounding rectangle expressed as a tuple `(xMin, yMin, xMax, yMax)`.

  Returns:

    A normalized bounding rectangle.

fontTools.misc.arrayTools.scaleRect(rect, x, y)

  Scale a bounding box rectangle.

  Parameters:

    - rect – A bounding rectangle expressed as a tuple `(xMin, yMin, xMax, yMax)`.

    - x – Factor to scale the rectangle along the X axis.

    - Y – Factor to scale the rectangle along the Y axis.

  Returns:

    A scaled bounding rectangle.

fontTools.misc.arrayTools.offsetRect(rect, dx, dy)

  Offset a bounding box rectangle.

  Parameters:

    - rect – A bounding rectangle expressed as a tuple `(xMin, yMin, xMax, yMax)`.

    - dx – Amount to offset the rectangle along the X axis.

    - dY – Amount to offset the rectangle along the Y axis.

  Returns:

    An offset bounding rectangle.

fontTools.misc.arrayTools.insetRect(rect, dx, dy)

  Inset a bounding box rectangle on all sides.

  Parameters:

    - rect – A bounding rectangle expressed as a tuple `(xMin, yMin, xMax, yMax)`.

    - dx – Amount to inset the rectangle along the X axis.

    - dY – Amount to inset the rectangle along the Y axis.

  Returns:

    An inset bounding rectangle.

fontTools.misc.arrayTools.sectRect(rect1, rect2)

  Test for rectangle-rectangle intersection.

  Parameters:

    - rect1 – First bounding rectangle, expressed as tuples `(xMin, yMin, xMax, yMax)`.

    - rect2 – Second bounding rectangle.

  Returns:

    A boolean and a rectangle. If the input rectangles intersect, returns `True` and the intersecting rectangle. Returns `False` and `(0, 0, 0, 0)` if the input rectangles don’t intersect.

fontTools.misc.arrayTools.unionRect(rect1, rect2)

  Determine union of bounding rectangles.

  Parameters:

    - rect1 – First bounding rectangle, expressed as tuples `(xMin, yMin, xMax, yMax)`.

    - rect2 – Second bounding rectangle.

  Returns:

    The smallest rectangle in which both input rectangles are fully enclosed.

fontTools.misc.arrayTools.rectCenter(rect)

  Determine rectangle center.

  Parameters:

    rect – Bounding rectangle, expressed as tuples `(xMin, yMin, xMax, yMax)`.

  Returns:

    A 2D tuple representing the point at the center of the rectangle.

fontTools.misc.arrayTools.rectArea(rect)

  Determine rectangle area.

  Parameters:

    rect – Bounding rectangle, expressed as tuples `(xMin, yMin, xMax, yMax)`.

  Returns:

    The area of the rectangle.

fontTools.misc.arrayTools.intRect(rect)

  Round a rectangle to integer values.

  Guarantees that the resulting rectangle is NOT smaller than the original.

  Parameters:

    rect – Bounding rectangle, expressed as tuples `(xMin, yMin, xMax, yMax)`.

  Returns:

    A rounded bounding rectangle.

fontTools.misc.arrayTools.quantizeRect(rect, factor=1)

      >>> bounds = (72.3, -218.4, 1201.3, 919.1)
      >>> quantizeRect(bounds)
      (72, -219, 1202, 920)
      >>> quantizeRect(bounds, factor=10)
      (70, -220, 1210, 920)
      >>> quantizeRect(bounds, factor=100)
      (0, -300, 1300, 1000)

class fontTools.misc.arrayTools.Vector(values, keep=False)

  Bases: `Vector`

fontTools.misc.arrayTools.pairwise(iterable, reverse=False)

  Iterate over current and next items in iterable.

  Parameters:

    - iterable – An iterable

    - reverse – If true, iterate in reverse order.

  Returns:

    A iterable yielding two elements per iteration.

  Example

      >>> tuple(pairwise([]))
      ()
      >>> tuple(pairwise([], reverse=True))
      ()
      >>> tuple(pairwise([0]))
      ((0, 0),)
      >>> tuple(pairwise([0], reverse=True))
      ((0, 0),)
      >>> tuple(pairwise([0, 1]))
      ((0, 1), (1, 0))
      >>> tuple(pairwise([0, 1], reverse=True))
      ((1, 0), (0, 1))
      >>> tuple(pairwise([0, 1, 2]))
      ((0, 1), (1, 2), (2, 0))
      >>> tuple(pairwise([0, 1, 2], reverse=True))
      ((2, 1), (1, 0), (0, 2))
      >>> tuple(pairwise(['a', 'b', 'c', 'd']))
      (('a', 'b'), ('b', 'c'), ('c', 'd'), ('d', 'a'))
      >>> tuple(pairwise(['a', 'b', 'c', 'd'], reverse=True))
      (('d', 'c'), ('c', 'b'), ('b', 'a'), ('a', 'd'))