27 lines
958 B
Python
27 lines
958 B
Python
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)
|