__pow__#
- RigidTransform.__pow__(self, float n)#
Композиция этого преобразования с самим собой n раз.
Жёсткое преобразование p при возведении в нецелые степени можно рассматривать как нахождение доли преобразования. Например, степень 0.5 находит «половинное» преобразование от тождественного к p.
Это реализовано путем применения винтовой линейной интерполяции (ScLERP) между p и тождественное преобразование, где угол компонента вращения масштабируется на n, и перемещение пропорционально корректируется вдоль винтовой оси.
q = p ** nтакже может быть выражено какq = RigidTransform.from_exp_coords(p.as_exp_coords() * n).Если n отрицательно, то преобразование инвертируется перед применением степени. Другими словами,
p ** -abs(n) == p.inv() ** abs(n).- Параметры:
- nfloat
Количество раз для композиции преобразования с самим собой.
- Возвращает:
RigidTransformэкземплярЕсли входной Rotation p содержит N несколько вращений, тогда выходные данные будут содержать N вращения, где i вращение th равно
p[i] ** n.
Примечания
Есть три примечательных случая: если
n == 1то возвращается копия исходного преобразования, еслиn == 0тогда возвращается тождественное преобразование, и еслиn == -1тогда возвращается обратное преобразование.Обратите внимание, что дробные степени
nкоторые фактически извлекают корень вращения, делают это с использованием кратчайшего пути наименьшего представления этого угла (главный корень). Это означает, что степениnи1/nне обязательно являются обратными друг другу. Например, степень 0.5 поворота на +240 градусов будет вычислена как степень 0.5 поворота на -120 градусов, с результатом поворота на -60, а не на +120 градусов.Примеры
>>> from scipy.spatial.transform import RigidTransform as Tf >>> import numpy as np
Степень 2 возвращает преобразование, применённое к самому себе:
>>> tf = Tf.from_translation([1, 2, 3]) >>> (tf ** 2).translation array([2., 4., 6.]) >>> (tf ** 2).as_matrix() array([[1., 0., 0., 2.], [0., 1., 0., 4.], [0., 0., 1., 6.], [0., 0., 0., 1.]])
Отрицательная степень возвращает обратное преобразование, возведенное в абсолютное значение n:
>>> (tf ** -2).translation array([-2., -4., -6.]) >>> np.allclose((tf ** -2).as_matrix(), (tf.inv() ** 2).as_matrix(), ... atol=1e-12) True
Степень 0 возвращает тождественное преобразование:
>>> (tf ** 0).as_matrix() array([[1., 0., 0., 0.], [0., 1., 0., 0.], [0., 0., 1., 0.], [0., 0., 0., 1.]])
Степень 1 возвращает копию исходного преобразования:
>>> (tf ** 1).as_matrix() array([[1., 0., 0., 1.], [0., 1., 0., 2.], [0., 0., 1., 3.], [0., 0., 0., 1.]])
Дробная степень возвращает преобразование с масштабированным вращением и сдвигом вдоль винтовой оси. Здесь мы берём квадратный корень из преобразования, который при возведении в квадрат восстанавливает исходное преобразование:
>>> tf_half = (tf ** 0.5) >>> tf_half.translation array([0.5, 1., 1.5]) >>> (tf_half ** 2).as_matrix() array([[1., 0., 0., 1.], [0., 1., 0., 2.], [0., 0., 1., 3.], [0., 0., 0., 1.]])