"""generic geometrical operations"""
import os
from typing import Any, Tuple, Union
if os.environ.get('__USE_CUDA', '0') == '1':
import cupy as np
from cupy import ndarray
else:
import numpy as np
from numpy import ndarray
from g3d.defs import AngleType
[docs]
def rotate(origin: Union[ndarray, list[float], float],
point: Union[ndarray, list[float], float],
angle: Union[ndarray, list[float], float]) \
-> Union[Tuple[ndarray, ndarray], Tuple[list[float], list[float]], Tuple[float, float]]:
"""
:param origin:
:param point:
:param angle:
:return:
"""
ox, oy = origin
px, py = point
qx = ox + np.cos(angle) * (px - ox) + np.sin(angle) * (py - oy)
qy = oy - np.sin(angle) * (px - ox) + np.cos(angle) * (py - oy)
return qx, qy
[docs]
def convert_angle(a: float, b: float, **kwargs: Any) -> Union[float, None]:
"""
:param a:
:param b:
:param kwargs:
:return:
"""
ialt = AngleType.IALT_1
dim = AngleType.DEGREES
for key, value in kwargs.items():
if key == 'ialt':
ialt = value
if key == 'angle_dim':
dim = value
if dim == AngleType.DEGREES:
if ialt == AngleType.IALT_1 or ialt == AngleType.IALT_2 or ialt == AngleType.IALT_3:
if b > 90.:
return 360. - a
else:
return a
else:
if ialt == AngleType.IALT_1 or ialt == AngleType.IALT_2 or ialt == AngleType.IALT_3:
if b > 0.5 * np.pi:
return 2. * np.pi - a
else:
return a
return None