Source code for fibomat.linalg.boundingboxes.dim_boundingbox

from __future__ import annotations
from typing import Iterable, Any

import numpy as np

from fibomat.linalg.boundingboxes.boundingbox_base import BoundingBoxBase
from fibomat.linalg.vectors import DimVector, DimVectorLike
from fibomat.units import LengthQuantity, scale_factor, U_


[docs]class DimBoundingBox(BoundingBoxBase[DimVector, LengthQuantity]): _VectorClass = DimVector
[docs] @classmethod def from_points(cls, points: Iterable[DimVector]) -> DimBoundingBox: """ Constructs rectangular bounding box containing all `points` Args: points (VectorArrayLike): points which should be included in bounding box Returns: (BoundingBox): new `BoundingBox` """ point_iter = iter(points) try: first_point = DimVector(next(point_iter)) except StopIteration as stop_exception: raise ValueError('points must contain at least one point') from stop_exception unit = first_point.unit points_scaled = [first_point.vector] for point in point_iter: dim_point = DimVector(point) points_scaled.append((dim_point * scale_factor(unit, dim_point.unit)).vector) points = np.asarray(points_scaled) return DimBoundingBox(np.min(points, axis=0) * unit, np.max(points, axis=0) * unit)