Source code for movement.math
import numpy as np
import sympy
__all__ = []
[docs]
def equation_of_hyperplane(*points):
    r"""
    Deduce an expression for the equation of a hyperplane passing through a set of
    points.
    :arg points: points the hyperplane passes through
    :type points: :class:`tuple` of :class:`tuple`\s
    :returns: a function representing the hyperplane
    :rtype: :class:`~.Callable`
    """
    dim = len(points[0])
    assert len(points) >= dim
    for point in points:
        assert len(point) == dim
    indices = list(range(len(points)))
    try:
        Point, Hyperplane, name = {
            2: (sympy.Point2D, sympy.Line, "line"),
            3: (sympy.Point3D, sympy.Plane, "plane"),
        }[dim]
    except KeyError as exc:
        raise NotImplementedError(
            f"equation_of_hyperplane not implemented in {dim}D."
        ) from exc
    while len(indices) >= dim:
        np.random.shuffle(indices)
        try:
            hyperplane = Hyperplane(*(Point(points[i]) for i in indices[:dim]))
            def equation(*xyz, hyperplane=hyperplane):
                return hyperplane.distance(Point(xyz))
            return equation
        except ValueError:
            indices.pop(0)
    raise ValueError(f"Could not determine a {name} for the provided points.")