Algorithm - rotateMatrix

Problem

  • 매트릭스를 회전하는 함수를 만들어 봅니다.
    • Transpose 는 diagonal line을 축으로 회전해주는 것이고, 여기서 만들려고 하는 것은 matrix의 중심에서 회전시키는 것을 말합니다.
    • 역시 예제로 설명하는 것이 좋을 것 같네요….

examples

code

  • python에서 matrix를 그냥 print만으로 출력하면 모양이 예쁘게 안 나와서, row별로 출력하는 함수를 간단히 정의했습니다.
  • 제가 정의한 rotateImage 함수를 활용하면, 기존의 함수들이 모양이 시계방향으로 90도 돌려집니다.
    • 해당 함수의 자세한 내용은 이후에 말씀드릴 테니, 일단은 이렇게 바꿔주는 문제구나, 라는 것만 이해하시면 될것 같습니다.
def print_mat(mat):
    for row in mat:
        print(row)

for n in [2,4]:
    test_mat = [[i*n+j+1 for j in range(0, n)] for i in range(0, n)]
    print("test_mat(not rotated):")
    print_mat(test_mat)
    print()
    print("test_mat(rotated)")
    print_mat( rotateImage(test_mat) )     
    print()

result

test_mat(not rotated):
[1, 2]
[3, 4]

test_mat(rotated)
[3, 1]
[4, 2]

test_mat(not rotated):
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]

test_mat(rotated)
[7, 4, 1]
[8, 5, 2]
[9, 6, 3]

solution

  • 고등학교 수학 시간에 배운, 회전 축이 되는 점(origin)을 중심으로 회전시키는 함수입니다.
    • origin: 회전 점, 이번 문제에서는 매트릭스의 중간점이 됩니다.
    • point: 회전되는 점
    • angle: 회전 각도, 여기서, 우리가 일반적으로 말하는 360도가 아닌 radian이라는 것이 중요합니다.
      • 간단히 math.radians로 변환할 수 있습니다.
import math
def rotate(origin, point, angle):
    ox, oy = origin
    px, py = point
    angle = math.radians(angle)
    qx = ox + math.cos(angle) * (px - ox) - math.sin(angle) * (py - oy)
    qy = oy + math.sin(angle) * (px - ox) + math.cos(angle) * (py - oy)
    return qx, qy
  • matrix를 회전해주는 함수입니다. 여기서는 항상 시계방향으로 90도 회전하는 것으로 고정되어 있습니다.
    • 또한, matrix의 row 개수와 columns의 개수는 항상 같다고 고정하고 진행했습니다.
def rotateImage(a):
    n = len(a)
    r_mat =[[0 for j in range(0, n)] for i in range(0, n)]
    for i in range(0, n):
        for j in range(0, n):
            r_i, r_j = rotate(((n-1)/2.0, (n-1)/2.0), (i,j), -90.0)
            r_i, r_j = int(r_i+0.5), int(r_j+0.5)
            r_mat[r_i][r_j] = a[i][j]
    return r_mat


댓글남기기