Source code for polymesh.space.point

from typing import Union, Iterable
import numpy as np

from neumann.linalg import Vector, FrameLike, CartesianFrame, ReferenceFrame


[docs]class Point(Vector): """ A class a to handle one or more points in Euclidean space. It inherits :class:`Vector <neumann.linalg.vector.Vector>`, and extends its behaviour with default frame management for domain specific applications. If data is provided on object creation, the class can infer an appropriate default frame, hence the specification of such can be omitted. Parameters ---------- frame: Union[ReferenceFrame, np.ndarray, Iterable], Optional A suitable reference frame, or an iterable representing coordinate axes of one. Default is None. Note ---- This is class is superseded by :class:`PointCloud <polymesh.space.coordarray.PointCloud>`. Examples -------- >>> from polymesh.space import Point >>> p = Point([1., 1., 1.]) >>> type(p.frame) neumann.linalg.frame.CartesianFrame If we want to handle more than one points: >>> import math >>> p = Point([[1., 0., 0.], [0., 1., 0.]]) >>> A = p.frame >>> B = A.orient_new('Body', [0, 0, math.pi/2], 'XYZ') >>> p.show(B) array([[ 0.0, -1.0, 0.0], [ 1.0, 0.0, 0.0]]) """ _frame_cls_ = CartesianFrame def __init__( self, *args, frame: Union[ReferenceFrame, np.ndarray, Iterable] = None, id: int = None, gid: int = None, **kwargs ): if frame is None: if len(args) > 0: if isinstance(args[0], np.ndarray): frame = self._frame_cls_(dim=args[0].shape[-1]) else: try: arg = np.array(args[0]) frame = self._frame_cls_(dim=arg.shape[-1]) except Exception: frame = None else: if not isinstance(frame, self._frame_cls_): if isinstance(frame, FrameLike): frame = self._frame_cls_(frame.axes) elif isinstance(frame, np.ndarray): frame = self._frame_cls_(frame) elif isinstance(frame, Iterable): frame = self._frame_cls_(np.array(frame, dtype=float)) if not isinstance(frame, self._frame_cls_): raise ValueError("Invalid frame!") super().__init__(*args, frame=frame, **kwargs) self._id = id self._gid = id if gid is None else gid @property def id(self): return self._id @property def gid(self): return self._gid