from typing import Any import numpy from numpy.typing import ArrayLike, NDArray from numpy.testing import assert_allclose def closed_edge_lengths(vertices: ArrayLike) -> NDArray[numpy.float64]: """ Return lengths for each edge of an implicitly closed vertex loop. """ vv = numpy.asarray(vertices, dtype=float) return numpy.sqrt(numpy.sum(numpy.diff(vv, axis=0, append=vv[:1]) ** 2, axis=1)) def assert_closed_edges_within(vertices: ArrayLike, max_len: float, *, atol: float = 1e-6) -> None: """ Assert that every edge in an implicitly closed vertex loop is no longer than `max_len`. """ assert numpy.all(closed_edge_lengths(vertices) <= max_len + atol) def assert_bounds_close(shape_or_polygon: Any, expected: ArrayLike, *, atol: float = 1e-10) -> None: """ Assert that an object's single-shape bounds match `expected`. """ assert_allclose(shape_or_polygon.get_bounds_single(), expected, atol=atol)