지금부터

쉽게 풀어보는 수학 공식의 이해[1.행렬 회전편]를 시작하겠다.


많은 좌표계가 있지만 우리는

화면

 z

     +

   /

 /_____ +x

    / |

      |

눈   +

      y

이 좌표계를 기준으로 한다. (컴퓨터에서 카메라 좌표계로 사용하기에 적합하기 때문)


기본적으로 축은

|1   0   0|

|0   1   0|

|0   0   1|

으로 정의한다.


회전은 축의 양의 방향에서 봤을 때

시계방향으로 회전하는 것을 기준으로 한다


x축을 기준으로 회전시킬 때


x축을 기준으로 a만큼 회전 된다고 할 때

직각삼각형의 길이비 공식을 적용햐여

y축의 y좌표는  cos(a)

y축의 z좌표는 -sin(a)

z축의 y좌표는  sin(a)

z축의 z좌표는  cos(a)


이것을 행렬식으로 표현하면

|1          0           0|

|0    cos(a)    -sin(a)|

|0     sin(a)      cos(a)|

가 된다.


다른 축들을 기준으로 한 회전도 이러한 방식으로 구할 수 있다. (뒤쪽에 코드로 한번 나오니 글로 써있는게 불편하다면 일단 읽고 가보자)


왜 여기서 행렬곱을 하면 변형되지 않고 회전되는지 궁금하다면,

절댓값은 항상 유지된다는 성질을 기억하자


n차원 벡터v의 절댓값

sqrt(sigma{k=1,n}(v{k} ^ 2))이다.


이 절댓값을 선의 길이라고 보자.

그러면 두개의 선이 이루는 절댓값은 부피이며,

그 값은 절댓값1 * 절댓값2 라는 공식이 매우 쉽게 유도된다.


행렬의 경우, 행, 열마다 다른 절댓값을 적용해야 한다.

행과 열의 길이가 n으로 같은 행렬 A가 있다고 하자

이 행렬의 각 요소 A{i,j}의 절댓값

sqrt(sigma{k=1,n}(A{i,k} ^ 2)) * sqrt(sigma{k=1,n}(A{k,j} ^ 2))가 된다


이때 우리가 만든 행렬의 절댓값

1 1 1

1 1 1

1 1 1

로 모든 요소의 절댓값이 "비례적"으로 보존된다.


모두에게 인정받고 사랑받는 python의 검증된 라이브러리인 numpy를 사용하여 이를 증명해보자

import numpy as np

def RotateMatrix(xyz):
    rx = np.array([[1,         0,          0],
                   [0, np.cos(x), -np.sin(x)],
                   [0, np.sin(x),  np.cos(x)]], dtype = "float64")
    ry = np.array([[ np.cos(y), 0, np.sin(y)],
                   [         01,         0],
                   [-np.sin(y), 0, np.cos(y)]], dtype = "float64")
    rz = np.array([[np.cos(z), -np.sin(z), 0],
                   [np.sin(z),  np.cos(z), 0],
                   [        0,          01]], dtype = "float64")
    return rz @ ry @ rx

def Absolute(matrix):
    absolute = np.array([[000],
                         [000],
                         [000]], dtype = "float64")
    for i in range(3):
        for j in range(3):
            absolute1 = np.sqrt(np.sum(np.power(matrix[i,:], 2)))
            absolute2 = np.sqrt(np.sum(np.power(matrix[:,j], 2)))
            absolute[i,j] = absolute1 * absolute2
    return absolute

xyz = map(floatinput().split())
rotated = RotateMatrix(xyz)
print(Absolute(rotated))

무슨 값을 넣든지 간에

[[1 1 1]

 [1 1 1]

 [1 1 1]]

이 나올 것이다.


이상으로 쉽게 풀어보는 수학 공식의 이해[1.행렬 회전편]를 마친다. - C751AE30C787(응기잇) -