2016-10-11 1 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]'은 X 축을 Y 축으로 회전시키는 [0 1 0]']을 제공합니다. 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 = tformrotate(vec([0 0 1]), π/2)과 동일 tfm = AffineTransform(r, vec([0 0 0])))을 정의합니다. 그 다음 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 

출력이 Z 축을 따라 90도 회전하지만 시계 방향이므로 나는 놀랍다. 이것이 실제로는 -90도 회전 인 것으로 보입니다. 누군가 내가 잘못한 것을 지적 할 수 있었습니까? 감사.

답변

4

물론 나도 혼란 스러웠습니다. transformTransformedArray에 대한 도움말을 다시 읽어야했습니다.

먼저 배열의 인쇄 순서는 다소 혼란 스럽습니다. 첫 번째 색인은 열로 표시되지만, v의 치수는 x,y,z이므로이 순서가 X 축입니다.

원래 v에는 v[2,1,2] == 1.0이 있습니다. 그러나 기본적으로 transform은 배열의 중심을 원점으로 사용하므로 2,1,2은 중심 (0, -1,0), 즉 음의 y 축 방향의 단위 벡터에 상대적입니다. transform 의해 반환

배열 tfm((x,y,z))v에서 원래의 값 (?TransformedArray 참조)함으로써 x,y,z에서 평가되는 값을 갖는다.

구체적으로, 우리는 transform(v,tfm)[1,2,2]v[(0,-1,0)] uncentered v 인덱스에 v[2,1,2]있다 (회전 (-1,0,0) 반대이기 때문에 (0, -1, 0)) 인 v[tfm((-1,0,0))]이다있다. 마지막으로, v[2,1,2] == 1.0은 질문의 결과와 동일합니다.

좌표 변환은 항상 까다롭기 때문에 변환과 그 역함을 혼동하기 쉽습니다.

희망이 도움이됩니다.

+0

감사! @ dan-getz. 당신의 대답을 읽은 후에, 저는'transform'과'TransformedArray'의 도움을 다시 읽었습니다. – JHZ

+0

그래서'transform'은 실제로 회전하기 전의 배열을 반환합니다. 그것은 변형의 역입니다. 회전이나 ​​변환 후에 볼륨을 얻으려면 변환의 역함수를 사용해야합니다. 그 맞습니까? – JHZ

+2

'transform'은 기본적으로 볼륨 (이 경우 1 : 3 x 1 : 3 x 1 : 3)의 점들의 표준 좌표를 취하고, 그 위에'tfm'을 적용하고 결과를'v'로 봅니다. 따라서 같은 크기의 행렬을 얻지 만'tfm'이 결과에 적용되므로 소스에 변형을 적용하려면 역변환을 사용해야합니다. –