이동과 회전의 순서
물체를 옆으로 옮긴 뒤 회전하는 것과 먼저 회전한 뒤 옮기는 것은 서로 다릅니다. 변환의 순서가 물체의 최종 위치를 결정합니다.
숫자로 확인하기
원점 기준 반시계 방향 90도 회전은 (x,y) → (-y,x)입니다. 점 (1,0)을 x방향으로 2만큼 옮기는 변환과 비교해 보겠습니다.
def rotate90(point):
x, y = point
return (-y, x)
def move_right(point):
x, y = point
return (x + 2, y)
print(rotate90(move_right((1, 0))))
print(move_right(rotate90((1, 0))))
첫 결과는 (0, 3), 두 번째는 (2, 1)입니다. 첫 번째는 옮긴 점 자체가 원점 주위를 회전합니다. 두 번째는 회전한 결과를 오른쪽으로 옮깁니다.
행렬로 묶는 이유
이동, 회전, 크기 조절을 행렬로 표현하면 여러 변환을 곱해서 하나로 묶을 수 있습니다. 2차원 점을 (x,y,1), 3차원 점을 (x,y,z,1)로 늘린 동차 좌표를 쓰면 이동도 행렬 곱으로 표현합니다.
열벡터를 쓰고 p' = T R p라고 적었다면 오른쪽 R의 회전이 먼저, T의 이동이 나중입니다. 행벡터 관례에서는 식의 순서가 달라집니다. 자료나 API의 관례를 먼저 확인해야 합니다.
물체 자신의 중심을 기준으로 돌리고 싶다면 중심을 원점으로 옮기고, 회전한 뒤, 다시 원래 중심 위치로 옮깁니다.
확인 문제
물체를 2배 키울 때 위치 좌표까지 원점 기준으로 2배 늘리면 물체 중심도 움직일까요?
해설 보기
원점에 중심이 없다면 움직입니다. 중심을 고정하고 크기만 바꾸려면 중심을 원점으로 옮긴 뒤 크기를 조절하고 되돌려야 합니다. 회전과 같은 이유입니다.