scipy.spatial.transform.Rotation.

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 ]])