Я использую AffineTransforms для вращения тома. Теперь я смущен знаком угла поворота. Для правой системы, глядя на ось, например ось Z, вращение плоскости XY против часовой стрелки должно быть положительным. Я определяю матрицу вращения r = [0.0 -1. 0.0; 1.0 0.0 0.0; 0.0 0.0 1.0]
, которая должна вращаться вдоль оси Z на 90 градусов против часовой стрелки. Действительно, r * [1 0 0]'
дает [0 1 0]'
, который вращает ось X по оси Y.Julia AffineTransforms знак угла поворота
Теперь определим объем V.
3×3×3 Array{Float64,3}:
[:, :, 1] =
0.0 0.0 0.0
0.0 0.0 0.0
0.0 0.0 0.0
[:, :, 2] =
0.0 0.0 0.0
1.0 0.0 0.0
0.0 0.0 0.0
[:, :, 3] =
0.0 0.0 0.0
0.0 0.0 0.0
0.0 0.0 0.0
тогда я определяю tfm = AffineTransform(r, vec([0 0 0])))
который так же, как tfm = tformrotate(vec([0 0 1]), π/2)
. затем transform(v, tfm)
. Центром вращения является центр входного массива. Я получил
3×3×3 Array{Float64,3}:
[:, :, 1] =
0.0 0.0 0.0
0.0 0.0 0.0
0.0 0.0 0.0
[:, :, 2] =
0.0 1.0 0.0
0.0 0.0 0.0
0.0 0.0 0.0
[:, :, 3] =
0.0 0.0 0.0
0.0 0.0 0.0
0.0 0.0 0.0
Это удивительно для меня, потому что выход представляет собой поворот на 90 градусов вдоль оси Z, но по часовой стрелке. Мне кажется, что это на самом деле поворот на 90 градусов. Может ли кто-нибудь указать, что я сделал не так? Благодарю.
Спасибо! @ Дан-Getz. Прочитав ваш ответ, я вернулся, чтобы прочитать помощь «transform» и «TransformedArray». – JHZ
Таким образом, 'transform' фактически возвращает массив, который находится перед вращением. Это обратное преобразование. Чтобы получить объем после вращения или любого преобразования, мне нужно использовать инверсию моего преобразования. Это верно? – JHZ
'transform' в основном принимает стандартные координаты точек в томе (1: 3 x 1: 3 x 1: 3 в этом случае), применяет к ним' tfm' и смотрит в 'v' для результата. Таким образом, вы получаете матрицу того же размера, но в результате применяется 'tfm', поэтому для применения преобразования к источнику вам нужно использовать обратный. –