""" works with all the transformations and calculation associated to position, speed, acceleration """ import numpy as np def position_to_xyz(position: [float]) -> [float]: """ allows to get the 3D xyz coordinates from a polar representation :param position: array (3,) with rho in meter, theta in rad, zed in meter :return: float array (3,) with x, y, z in meter """ pos = position[0] * np.exp(1j * position[1]) return [np.real(pos), np.imag(pos), position[2]] """ def _test_position_to_norm(): assert position_to_norm([param.PERIMETER, 0, 100]) == [1, 0, 1] assert position_to_norm([0, -np.pi / 2, 0]) == [0, 0.75, 0] assert position_to_norm([0, np.pi / 2, 0]) == [0, 0.25, 0] """ def is_in_the_cone(position1: [float], position2: [float], vector2: [float], angle: float) -> bool: """ checks if the point @ position 2 is in the cone from position 1 with an angle of angle :param position1: in x, y, z :param position2: in x, y, z :param vector2: in x, y, z :param angle: in rad :return: """ vector1 = np.array(position2, dtype=float) - np.array(position1) vector1 /= np.linalg.norm(vector1) vector2 = np.array(vector2, dtype=float) vector2 /= np.linalg.norm(vector2) cos_theta = np.dot(vector1, vector2) if 0 < cos_theta: theta = np.arcsin(np.sqrt(1 - cos_theta ** 2)) return theta < angle return False def _test_is_in_the_cone(): assert is_in_the_cone([0, 0, 0], [1, 0.1, 0], [1, 0, 0], np.pi / 5) assert is_in_the_cone([0, 0, 0], [1, 0.1, 0], [0, 1, 0], np.pi / 5) pass def rhotheta_to_latlon(rho: float, theta: float, lat_tg: float, lon_tg: float) -> [float, float]: """ transforms polar coordinates into lat, lon :param rho: :param theta: :param lat_tg: latitude de la target (0,0) :param lon_tg: longitude de la target (0,0) :return: """ z = rho * np.exp(1j * theta) lat = np.imag(z) * 360 / (40075 * 1000) + lat_tg lon = np.real(z) * 360 / (40075 * 1000 * np.cos(np.pi / 180 * lat)) + lon_tg return lat, lon