apply#
- Вращение.apply(self, векторы, обратный=False)#
Применить это вращение к набору векторов.
Если исходная система координат поворачивается в конечную систему координат этим вращением, то его применение к вектору можно рассматривать двумя способами:
Как проекция компонентов вектора, выраженных в конечной системе координат, на исходную систему координат.
Как физическое вращение вектора, приклеенного к исходной системе координат во время вращения. В этом случае компоненты вектора выражаются в исходной системе координат до и после вращения.
В терминах матриц вращения это применение идентично
self.as_matrix() @ vectors.- Параметры:
- векторыarray_like, форма (3,) или (N, 3)
Каждый vectors[i] представляет вектор в 3D-пространстве. Один вектор может быть задан либо с формой (3, ) или (1, 3). Количество вращений и количество заданных векторов должны следовать стандартным правилам трансляции numpy: либо одно из них равно единице, либо они оба равны друг другу.
- обратныйлогический, необязательный
Если True, то обратное вращение(я) применяется к входным векторам. По умолчанию False.
- Возвращает:
- rotated_vectorsndarray, форма (3,) или (N, 3)
Результат применения вращения к входным векторам. Форма зависит от следующих случаев:
Если объект содержит одно вращение (в отличие от стека с одним вращением) и указан один вектор с формой
(3,), затем rotated_vectors имеет форму(3,).Во всех остальных случаях, rotated_vectors имеет форму
(N, 3), гдеNэто либо количество вращений, либо векторов.
Примеры
>>> from scipy.spatial.transform import Rotation as R >>> import numpy as np
Одиночное вращение, применённое к одному вектору:
>>> vector = np.array([1, 0, 0]) >>> r = R.from_rotvec([0, 0, np.pi/2]) >>> r.as_matrix() array([[ 2.22044605e-16, -1.00000000e+00, 0.00000000e+00], [ 1.00000000e+00, 2.22044605e-16, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 1.00000000e+00]]) >>> r.apply(vector) array([2.22044605e-16, 1.00000000e+00, 0.00000000e+00]) >>> r.apply(vector).shape (3,)
Одиночное вращение, примененное к нескольким векторам:
>>> vectors = np.array([ ... [1, 0, 0], ... [1, 2, 3]]) >>> r = R.from_rotvec([0, 0, np.pi/4]) >>> r.as_matrix() array([[ 0.70710678, -0.70710678, 0. ], [ 0.70710678, 0.70710678, 0. ], [ 0. , 0. , 1. ]]) >>> r.apply(vectors) array([[ 0.70710678, 0.70710678, 0. ], [-0.70710678, 2.12132034, 3. ]]) >>> r.apply(vectors).shape (2, 3)
Множественные вращения одного вектора:
>>> r = R.from_rotvec([[0, 0, np.pi/4], [np.pi/2, 0, 0]]) >>> vector = np.array([1,2,3]) >>> r.as_matrix() array([[[ 7.07106781e-01, -7.07106781e-01, 0.00000000e+00], [ 7.07106781e-01, 7.07106781e-01, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 1.00000000e+00]], [[ 1.00000000e+00, 0.00000000e+00, 0.00000000e+00], [ 0.00000000e+00, 2.22044605e-16, -1.00000000e+00], [ 0.00000000e+00, 1.00000000e+00, 2.22044605e-16]]]) >>> r.apply(vector) array([[-0.70710678, 2.12132034, 3. ], [ 1. , -3. , 2. ]]) >>> r.apply(vector).shape (2, 3)
Множественные вращения на множестве векторов. Каждое вращение применяется к соответствующему вектору:
>>> r = R.from_euler('zxy', [ ... [0, 0, 90], ... [45, 30, 60]], degrees=True) >>> vectors = [ ... [1, 2, 3], ... [1, 0, -1]] >>> r.apply(vectors) array([[ 3. , 2. , -1. ], [-0.09026039, 1.11237244, -0.86860844]]) >>> r.apply(vectors).shape (2, 3)
Также возможно применить обратное вращение:
>>> r = R.from_euler('zxy', [ ... [0, 0, 90], ... [45, 30, 60]], degrees=True) >>> vectors = [ ... [1, 2, 3], ... [1, 0, -1]] >>> r.apply(vectors, inverse=True) array([[-3. , 2. , 1. ], [ 1.09533535, -0.8365163 , 0.3169873 ]])