2016-10-11 2 views
3

Я использую 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 градусов. Может ли кто-нибудь указать, что я сделал не так? Благодарю.

ответ

4

По общему признанию, это меня тоже смутило. Пришлось снова прочитать справку для transform и TransformedArray.

Во-первых, порядок печати массивов немного запутан, с первым индексом, указанным в столбцах, но это ось Х, так как размеры v составляют x,y,z в этом порядке.

В оригинале v у нас есть v[2,1,2] == 1.0. Но по умолчанию transform использует центр массива как источник, поэтому 2,1,2 относится к центру (0, -1,0), то есть единичному вектору в направлении отрицательной оси y.

Массив, возвращаемый transform имеет значения, которые вычисляются на x,y,z, давая значение исходного v на tfm((x,y,z)) (см ?TransformedArray).

В частности, мы имеем transform(v,tfm)[1,2,2] является v[tfm((-1,0,0))] который является v[(0,-1,0)] (потому что вращающиеся (-1,0,0) против часовой стрелки (0, -1,0)), который находится в uncentered v индексов v[2,1,2]. Наконец, v[2,1,2] == 1.0 как и в выводе в вопросе.

Трансформация координат всегда сложна, и ее легко путать с преобразованиями и их обратными.

Надеюсь, это поможет.

+0

Спасибо! @ Дан-Getz. Прочитав ваш ответ, я вернулся, чтобы прочитать помощь «transform» и «TransformedArray». – JHZ

+0

Таким образом, 'transform' фактически возвращает массив, который находится перед вращением. Это обратное преобразование. Чтобы получить объем после вращения или любого преобразования, мне нужно использовать инверсию моего преобразования. Это верно? – JHZ

+2

'transform' в основном принимает стандартные координаты точек в томе (1: 3 x 1: 3 x 1: 3 в этом случае), применяет к ним' tfm' и смотрит в 'v' для результата. Таким образом, вы получаете матрицу того же размера, но в результате применяется 'tfm', поэтому для применения преобразования к источнику вам нужно использовать обратный. –

Смежные вопросы